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(Writerout)
创建不带自动行刷新的新 PrintWriter。

参数:
out - 字符输出流

PrintWriter

public PrintWriter(Writerout,
                   booleanautoFlush)
创建新 PrintWriter。

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

PrintWriter

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

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

PrintWriter

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

参数:
out - 输出流
autoFlush - boolean 变量;如果为 true,则 printlnprintfformat 方法将刷新输出缓冲区
另请参见:
OutputStreamWriter.OutputStreamWriter(java.io.OutputStream)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值