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


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

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 PrintWriter
   
   
    
    extends 
    
    Writer
   
   
 

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

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

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

PrintWriter

public PrintWriter(Writer out)
创建不带自动行刷新的新 PrintWriter。

参数:
out - 字符输出流

PrintWriter

public PrintWriter(Writer out,
                   boolean autoFlush)
创建新 PrintWriter。

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

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,则 printlnprintfformat 方法将刷新输出缓冲区
另请参见:
OutputStreamWriter.OutputStreamWriter(java.io.OutputStream)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值