首先, 我们需要明白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:

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: