首先, 我们需要明白UDP是发送的数据是以数据包的形式发送,无需建立连接,也无需考虑对方是否能够接收到数据。
而我们通过多线程去实现UDP聊天,需要同时执行一个输出数据程序和一个读取用户信息的程序,采用多线程的方式同时执行这两个程序;为了更好的展示,我们给两个程序都赋上端口号和ip地址。采用多线程的方式,两个不同的用户同时执行这两个程序,从而达到我们实现UDP聊天。
发送数据:
public class SendUdp implements Runnable{
//定义发送的ip地址,发送的端口号,接收的端口号
private String toIP;
private int fromPort;
private int toPort;
BufferedReader bufferedReader=null;
DatagramSocket datagramSocket=null;
public SendUdp(String toIP, int fromPort, int toPort) {
this.toIP = toIP;
this.fromPort = fromPort;
this.toPort = toPort;
try {
//创建一个UDPsocket对象
datagramSocket = new DatagramSocket(fromPort);
//同时,在允许这个线程的时候,定义一个控制台输入
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入数据:");
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//循环输出
while (true){
try {
//准备数据
String s = bufferedReader.readLine();
//1.创建一个发送包:1.数据,数据起始,数据长度,SocketAddress实现类(发送到哪个ip地址,发送到哪个端口)
DatagramPacket datagramPacket = new DatagramPacket(s.getBytes(),0,s.getBytes().length,new InetSocketAddress(this.toIP,this.toPort));
//2.发送数据包
datagramSocket.send(datagramPacket);
//3.判断如果发送的数据是bye,就停止循环
if (s.equals("bye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
datagramSocket.close();
}
}
**接收数据**:
public class ReceiveUdp implements Runnable{
//传进来的用户名
private String user;
//接收的端口
private int formPort;
DatagramSocket datagramSocket=null;
public ReceiveUdp(String user, int formPort) throws Exception {
this.user = user;
this.formPort = formPort;
//1.创建连接
datagramSocket = new DatagramSocket(formPort);
}
@Override
public void run() {
while (true){
try {
//2.创建数据包对象
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
//接收数据
datagramSocket.receive(datagramPacket);
//判断发送的数据是否为bye
if (new String(datagramPacket.getData(),0,datagramPacket.getData().length).equals("bye")){
break;
}
//把数据转换成字符串形式
String s = new String(datagramPacket.getData(), 0, datagramPacket.getData().length);
//打印出来
System.out.println(user+":"+s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
用户2:
public class Test2 {
public static void main(String[] args) throws Exception {
new Thread(new SendUdp("127.0.0.1",7776,9999)).start();
new Thread(new ReceiveUdp("玩家2",8888)).start();
}
}
用户1:
public class Test {
public static void main(String[] args) throws Exception {
new Thread(new SendUdp("127.0.0.1",7777,8888)).start();
new Thread(new ReceiveUdp("玩家1",9999)).start();
}
}
从而,产生下面这段对话: 玩家1: 玩家2:
文章链接
发表评论