java udp多线程_JAVA学习之用多线程实现简单UDP聊天程序

该博客介绍了如何使用Java的多线程和UDP协议创建一个简单的聊天程序。程序包括一个发送信息的类和一个接收信息的类,通过两个独立的线程分别处理发送和接收。两个聊天窗口程序ChatDemoA和ChatDemoB分别监听10000和10001端口,互相交换信息。虽然端口是硬编码的,但示例旨在展示基本概念而非实际应用中的灵活性。
摘要由CSDN通过智能技术生成

一般的聊天程序由于追求快捷的数据传输速度,而又不是比较关注数据的完整性,都是用UDP协议来传递数据,

而且聊天程序在发送信息的时候,也可以同时进行信息的接收功能,就好像QQ一样,我们可以在下面的输入框慢慢打字发信息,但是上面的信息框却是在同时接收信息,

要在一个程序里面实现这种功能,就要用到了多线程了,其中一个线程用来专门接收数据,一个纯种用来专门发送数据,像QQ一样的估计还有线程专门用来处理视频和文件传输等。

下面利用JAVA的多线程和UDP网络功能实现一个简单的聊天程序,其中主要涉及到四个类,一个是接收信息的类,一个是发送信息的类,这两个类我们到时在主函数中用多线程来执行,

还有两个类,也就是两个具有main函数的聊天窗口程序,两个简单的控制台程序。

其中全部的代码如下:

//import java.io.*;

import java.net.*;//发送的类

classSend implements Runnable

{privateDatagramSocket ds;private int recePort;//接收端的端口。即要把数据发送到那个端口

public Send(DatagramSocket ds, intport)

{this.ds =ds;this.recePort =port;

}public voidrun()

{try{

BufferedReader bufr= new BufferedReader(new InputStreamReader(System.in));

String line= null;while ((line = bufr.readLine()) != null)

{if ("886".equals(line))

{break;

}byte[] buf =line.getBytes();//我们把数据发往目标端口,

DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), this.recePort);

ds.send(dp);

}

}catch(Exception e)

{throw new RuntimeException("send failure");

}

}

}classRece implements Runnable

{privateDatagramSocket ds;publicRece(DatagramSocket ds)

{this.ds =ds;

}public voidrun()

{try{while (true)

{byte[] buf = new byte[1024];

DatagramPacket dp= newDatagramPacket(buf, buf.length);

ds.receive(dp);

String ip=dp.getAddress().getHostAddress();int port =dp.getPort();

String data= new String(dp.getData(), 0, dp.getLength());

System.out.println("来自ip为:" + ip + "端口为:" + port + "的信息为:" +data);

}

}catch(Exception e)

{throw new RuntimeException("Rece failure");

}

}

}classChatDemoA

{public static voidmain(String[] args) throws Exception

{

DatagramSocket sendSocket= newDatagramSocket();

DatagramSocket receSocket= new DatagramSocket(10000);//侦听10000端口

new Thread(new Send(sendSocket, 10001)).start();//把数据发往10001端口

new Thread(newRece(receSocket)).start();

}

}classChatDemoB

{public static voidmain(String[] args) throws Exception

{

DatagramSocket sendSocket= newDatagramSocket();

DatagramSocket receSocket= new DatagramSocket(10001);//侦听10001端口

new Thread(new Send(sendSocket, 10000)).start();//把数据发住10000商品

new Thread(newRece(receSocket)).start();

}

}

在这里,一个程序侦听10000端口,如果有信息就发往10001端口,

另一个程序就侦听10001端口,然后把信息回发10000端口,以实现数据交流的功能,

其中两个程序的接收信息和发送信息都用新的分别线程执行

当ChatDemoA把信息发送到10001端口的时候,侦听端口10001的ChatDemoB就接收到了信息,并显示出来,

同样,当ChatDemoB把信息发送到10000端口的时候,侦听端口10000的ChatDemoA也会接收到信息,也显示出来,

由于两个程序发送信息的DatagramSocket没有绑定端口,所以发送的信息的端口是随机的。

以下是程序执行时候的截图:

25e6e52400f7ed952741f03fce0b335e.png

另一个程序ChatDemoB执行时候的截图

adccf43a82f8cb584184389f2dcabcf8.png

如果想要有更好的体验,其实不应该把端口写死的,应该是运行时获取到的,不过为了简单体现UDP编程和多线程,就只好怎么简单怎么来了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给你提供一个Java基于UDP协议实现简单聊天程序,具体内容如下: ```java import java.net.*; import java.io.*; public class ChatRoom { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(); InetAddress address = InetAddress.getByName("localhost"); byte[] buffer; Thread sender = new Thread(new Runnable() { @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while (true) { String message = reader.readLine(); buffer = message.getBytes(); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 4445); socket.send(packet); } } catch (IOException e) { e.printStackTrace(); } } }); Thread receiver = new Thread(new Runnable() { @Override public void run() { try { while (true) { buffer = new byte[256]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); String message = new String(packet.getData(), 0, packet.getLength()); System.out.println("Received: " + message); } } catch (IOException e) { e.printStackTrace(); } } }); sender.start(); receiver.start(); } } ``` 这个程序实现了一个简单聊天室,可以在本地进行测试,具体实现如下: 1. 创建一个DatagramSocket实例,用于发送和接收UDP数据包。 2. 获取一个InetAddress实例,表示本机的IP地址。 3. 创建一个byte数组作为缓冲区,用于存储发送和接收的数据。 4. 创建一个发送线程和一个接收线程,分别用于发送和接收数据。 5. 发送线程从控制台读取用户输入的数据,将数据打包成DatagramPacket,并发送到指定的IP地址和端口上。 6. 接收线程从DatagramSocket中接收数据包,将数据包中的数据解码成字符串,并将其打印到控制台上。 7. 启动发送线程和接收线程。 这个程序只是一个简单的示例,还有很多可以改进的地方,例如可以添加用户名、添加图形界面等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值