您的位置:首页 > 理论基础 > 计算机网络

java 网络编程【6】 用UDP编写网络聊天程序 以及 TCP编程实例

2012-05-02 20:42 971 查看


输入内容后,按回车键即可。

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.*;

@SuppressWarnings("serial")
public class Chat extends Frame {
	List lst = new List(6);
	TextField tfIP = new TextField(15);
	
	// 消息文本框
	TextField tfData = new TextField(20);

	// 利用网络来发送消息。
	DatagramSocket ds = null;

	public Chat() {

		try {
			// 端口为3000.
			ds = new DatagramSocket(3000);
		} catch (SocketException e1) {
			e1.printStackTrace();
		}

		this.add(lst, "Center");
		Panel p = new Panel();
		this.add(p, "South");

		p.setLayout(new BorderLayout());
		p.add(tfIP, "West");
		p.add(tfData, "East");

		/**
		 * 
		 *    用于接收  消息。
		 * 
		 */
		new Thread(new Runnable() {
			@Override
			public void run() {
				byte buf[] = new byte[1024];
				// DatagramPacket 用于 接收到的消息 并存入  buf中。
				DatagramPacket dp = new DatagramPacket(buf, 1024);

				while (true) {
					try {
						ds.receive(dp);
						// 接受消息。
						lst.add(new String(/* dp.getData() */buf, 0, dp
								.getLength())
								+ "from"
								+ dp.getAddress().getHostAddress()
								+ ":" + dp.getPort(), 0);
					} catch (IOException e) {
						if(!ds.isClosed()){// 用于判断  Socket 是否已经关闭了。
							e.printStackTrace();
						}
					}
				}

			}
		}).start();

		// 匿名内置类。----------消息文本框的事件处理代码!!!
		// 监听器。
		tfData.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				byte buf[];
				buf = tfData.getText().getBytes();
				try {
					DatagramPacket dp = new DatagramPacket(buf, buf.length,
							InetAddress.getByName(tfIP.getText()), 3000);
					// 发送消息。。
					ds.send(dp);
				} catch (UnknownHostException ex) {
					ex.printStackTrace();
				} catch (IOException ex) {
					ex.printStackTrace();
				}

				// 清除消息文本的内容。
				tfData.setText("");
			}
		});

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				ds.close();
				dispose();
				System.exit(0);
			}
		});
	}

	public static void main(String[] args) {
		System.out.println("Strating Chat...");
		Chat mainFrame = new Chat();
		mainFrame.setSize(300, 400);
		mainFrame.setTitle("Chat");
		mainFrame.setVisible(true);
		mainFrame.setResizable(false);// 窗口的大小不可变。
	}
}


java.io

类 PrintWriter

java.lang.Object
  java.io.Writer
      java.io.PrintWriter

所有已实现的接口: Closeable,
Flushable, Appendable

public class PrintWriterextends Writer




向文本输出流打印对象的格式化表示形式。此类实现在
PrintStream
中的所有print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。

PrintStream
类不同,如果启用了自动刷新,则只有在调用println、printf 或format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。

此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用
checkError()
是否出现错误。

PrintWriter

public PrintWriter(Writer out)

创建不带自动行刷新的新 PrintWriter。

参数:
out
- 字符输出流

PrintWriter

public PrintWriter(Writer out,
                   boolean autoFlush)

创建新 PrintWriter。

参数:
out
- 字符输出流
autoFlush
- boolean 变量;如果为 true,则 println、printf 或format 方法将刷新输出缓冲区

PrintWriter

public PrintWriter(OutputStream out)

根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。此便捷构造方法创建必要的中间 OutputStreamWriter,后者使用默认字符编码将字符转换为字节。

参数:
out
- 输出流另请参见:
OutputStreamWriter.OutputStreamWriter(java.io.OutputStream)


PrintWriter

public PrintWriter(OutputStream out,
                   boolean autoFlush)

通过现有的 OutputStream 创建新的 PrintWriter。此便捷构造方法创建必要的中间 OutputStreamWriter,后者使用默认字符编码将字符转换为字节。

参数:
out
- 输出流
autoFlush
- boolean 变量;如果为 true,则 println、printf 或format 方法将刷新输出缓冲区另请参见:
OutputStreamWriter.OutputStreamWriter(java.io.OutputStream)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: