• java 25


    平时聊天都是在同一个窗口的,所以,这个窗口同时实现发送数据和接收数据,这时就需要多线程实现。

    建立一个类:

      把聊天的发送端和接收端放在同一个类,启动一个窗口

     1 public class CharRoom {
     2 
     3     public static void main(String[] args) throws IOException {
     4             
     5             //创建socket发送对象和接收对象
     6         DatagramSocket send = new DatagramSocket();
     7         DatagramSocket receive = new DatagramSocket(10010);
     8         
     9         //用多线程同时运行2个
    10         SendThread st = new SendThread(send);
    11         ReceiveThread rt = new ReceiveThread(receive);
    12         
    13         Thread stThread = new Thread(st);
    14         Thread rtThread = new Thread(rt);
    15         
    16         //启动线程
    17         stThread.start();
    18         rtThread.start();
    19         
    20         
    21     }

    再建立发送类:

      

     1 public class SendThread implements Runnable {
     2 
     3     // 构造传参
     4     private DatagramSocket ds;
     5 
     6     public SendThread(DatagramSocket ds) {
     7         this.ds = ds;
     8     }
     9 
    10     public void run() {
    11 
    12         try {
    13 
    14             // 键盘输入的内容,进行数据打包
    15             // 创建键盘输入对象,IO流
    16             BufferedReader br = new BufferedReader(new InputStreamReader(
    17                     System.in));
    18             // 读取输入的数据
    19             String line = null;
    20             while ((line = br.readLine()) != null) {
    21                 // 设定退出条件
    22                 if (line.endsWith("886")) {
    23                     break;
    24                 }
    25 
    26                 // String转换成byte,打包
    27                 byte[] bys = line.getBytes();
    28                 // 发送数据
    29                 DatagramPacket dp = new DatagramPacket(bys, bys.length,
    30                         InetAddress.getByName("172.19.xx.xxx"), 10010);
    31 
    32                 ds.send(dp);
    33 
    34             }
    35                 // 释放资源
    36                 ds.close();
    37 
    38         }
    39             // 处理异常
    40             catch (IOException e) {
    41                 e.printStackTrace();
    42             }
    43     }
    44 }

    接收端:(要一直启动,所以无需释放资源)

     1 public class ReceiveThread implements Runnable {
     2 
     3     // 构造方法接收
     4     private DatagramSocket ds;
     5 
     6     public ReceiveThread(DatagramSocket ds) {
     7         this.ds = ds;
     8     }
     9 
    10     // 接收数据
    11     public void run() {
    12 
    13         try {
    14             // 接收端一直启动
    15             while (true) {
    16                 // 创建数据包
    17                 byte[] bys = new byte[1000];
    18                 DatagramPacket dp = new DatagramPacket(bys, bys.length);
    19 
    20                 // 接收数据包
    21                 ds.receive(dp);
    22 
    23                 // 解析数据包
    24                 String result = new String(dp.getData(), 0, dp.getLength());
    25                 // 获取发送端的机器名称
    26                 String name = dp.getAddress().getHostName();
    27 
    28                 // 打印到控制台
    29                 System.out.println("从" + name + "发送: " + result);
    30             }
    31         }
    32         // 处理异常
    33         catch (IOException e) {
    34             e.printStackTrace();
    35         }
    36 
    37     }
    38 }

    根据这些,建立GUI,再加优化,就可以做一个聊天室

  • 相关阅读:
    Linux 进程学习(四) sigaction 函数
    Netty 编解码奥秘
    我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:护国小将,邀请大家一同入驻:https://www.oschina.net/sharingplan/apply
    Netty数据如何在 pipeline 中流动
    PLM系统安装四:主卷服务安装(FSC缓存服务器plm4IP:42.20)
    Linux系统信息和进程相关命令(CPU,内存,进程)
    SAN交换机配置的备份还原,固件升级
    san交换机的级联
    PLM系统安装五(2):Corporate服务安装plm1IP:42.106
    第三步:服务器虚拟化XenServer实施部署文档
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5964377.html
Copyright © 2020-2023  润新知