java 25 - 5 网络编程之多线程实现聊天室

时间:2021-04-20 14:23:55

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

建立一个类:

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

 public class CharRoom {

     public static void main(String[] args) throws IOException {

             //创建socket发送对象和接收对象
DatagramSocket send = new DatagramSocket();
DatagramSocket receive = new DatagramSocket(10010); //用多线程同时运行2个
SendThread st = new SendThread(send);
ReceiveThread rt = new ReceiveThread(receive); Thread stThread = new Thread(st);
Thread rtThread = new Thread(rt); //启动线程
stThread.start();
rtThread.start(); }

再建立发送类:

  

 public class SendThread implements Runnable {

     // 构造传参
private DatagramSocket ds; public SendThread(DatagramSocket ds) {
this.ds = ds;
} public void run() { try { // 键盘输入的内容,进行数据打包
// 创建键盘输入对象,IO流
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
// 读取输入的数据
String line = null;
while ((line = br.readLine()) != null) {
// 设定退出条件
if (line.endsWith("886")) {
break;
} // String转换成byte,打包
byte[] bys = line.getBytes();
// 发送数据
DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName("172.19.xx.xxx"), 10010); ds.send(dp); }
// 释放资源
ds.close(); }
// 处理异常
catch (IOException e) {
e.printStackTrace();
}
}
}

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

 public class ReceiveThread implements Runnable {

     // 构造方法接收
private DatagramSocket ds; public ReceiveThread(DatagramSocket ds) {
this.ds = ds;
} // 接收数据
public void run() { try {
// 接收端一直启动
while (true) {
// 创建数据包
byte[] bys = new byte[1000];
DatagramPacket dp = new DatagramPacket(bys, bys.length); // 接收数据包
ds.receive(dp); // 解析数据包
String result = new String(dp.getData(), 0, dp.getLength());
// 获取发送端的机器名称
String name = dp.getAddress().getHostName(); // 打印到控制台
System.out.println("从" + name + "发送: " + result);
}
}
// 处理异常
catch (IOException e) {
e.printStackTrace();
} }
}

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