通过引入多线程可实现UDP的聊天效果。这里我使用实现rannable接口再进行Thread的静态代理模式实现多线程。在ran方法中选择while(true)循环实现主程序的持续进行。
代码如下:
先写发生和接收类的线程。通过实现rannable接口再重写ran方法实现
发送端
package com.heng.Chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
public class senddx implements Runnable{
private int fromPort;
private String toIP;
private int toPort;
public senddx(int fromPort, String toIP, int toPort) {
this.fromPort = fromPort;
this.toIP = toIP;
this.toPort = toPort;
}
@Override
public void run() {
DatagramSocket socket=null;
BufferedReader reader=null;
{
try {
socket = new DatagramSocket(fromPort);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
throw new RuntimeException(e);
}
}
while (true) {
try {
InetSocketAddress isa = new InetSocketAddress(this.toIP, this.toPort);
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket ppa = new DatagramPacket(datas, 0, datas.length, isa);
socket.send(ppa);
if(data.equals("bye")){
break;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
socket.close();
try {
reader.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
接收端
package com.heng.Chat;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class receivedx implements Runnable {
private int port;
private String name;
public receivedx(int port, String name) {
this.port = port;
this.name = name;
}
@Override
public void run() {
DatagramSocket socket = null;
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
throw new RuntimeException(e);
}
while (true) {
try {
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
socket.receive(packet);
byte[] data = packet.getData();
String s = new String(data, 0, data.length);
System.out.println(name + ":" + s);
if (data.equals("bye")) {
break;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
socket.close();
}
}
然后创建两个实现类,即两个聊天窗口。用Thread实现静态代理模式
Chat1
package com.heng.Chat;
public class Chat1 {
public static void main(String[] args) {
new Thread(new senddx(7777,"localhost",8888)).start();
new Thread(new receivedx(9999,"凯尔希")).start();
}
}
Chat2
package com.heng.Chat;
public class Chat2 {
public static void main(String[] args) {
new Thread(new senddx(5555,"localhost",9999)).start();
new Thread(new receivedx(8888,"SetSail")).start();
}
}
实现聊天(结果):
总结:使用多线程可以更为真实的实现聊天的同时性。因为cpu执行速度极快,多线程的先后顺序我们无法洞察,所以可以理解为两个线程同步进行。这样如果两个人同时操作这两个窗口也是能进行的 。