zoukankan      html  css  js  c++  java
  • 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,再加优化,就可以做一个聊天室

  • 相关阅读:
    剑指 Offer 06. 从尾到头打印链表
    剑指 Offer 05. 替换空格
    剑指 Offer 04. 二维数组中的查找
    剑指 Offer 03. 数组中重复的数字
    leetcode刷题笔记328题 奇偶链表
    leetcode刷题笔记324题 摆动排序 II
    leetcode刷题笔记321题 拼接最大数
    leetcode刷题笔记326题 3的幂
    20210301日报
    20210227日报
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5964377.html
Copyright © 2011-2022 走看看