java UDP实现一个聊天工具的示例代码
作者:中二病没有蛀牙 时间:2021-09-19 18:41:47
题目:
假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序。具体如下:
(1)、Tom和Jerry聊天的双方都应该具有发送端和接收端;
(2)、利用DatagramSocket与DatagramPacket;
(3)、实现 java.lang.Runnable类,重写 run()方法。
学过计网的都知道,利用三元组(ip地址,协议,端口)就可以标识网络的进程了。
而进行通信我们直接运用socket就可以了,首先需要知道是socket是什么,这部分可以参考这个大佬写的博客。
https://www.jb51.net/article/121601.htm
实现一个客户端,那么需要Tom和Jerry都可以实现接收和发送功能,分别用两个线程启动。
接收线程Receive_Thread.java
package Chat_UDP;
import java.io.IOException;
import java.util.Date;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.text.SimpleDateFormat;
public class Receive_Thread extends Thread {
private static final int MAX_RECEIVE_BUFFER = 1024;
private DatagramSocket server;
private DatagramPacket packet;
byte[] buffer = new byte[MAX_RECEIVE_BUFFER];
public Receive_Thread(DatagramSocket server)
{
this.server = server;
packet = new DatagramPacket(buffer, buffer.length);
}
@Override
public void run() {
try
{
while(true)
{
//接收数据包
server.receive(packet);
String s = new String(packet.getData(),packet.getOffset(),packet.getLength(),"UTF-8");
Date day=new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(packet.getPort() == 10001)
System.out.println("Tom"+packet.getAddress()+" 说:"+s+"\t"+df.format(day));
else{
System.out.println("Jerry"+packet.getAddress()+" 说 :"+s+"\t"+df.format(day));
}
packet.setLength(buffer.length);
}
}
catch(IOException e)
{
System.out.println("IOException");
}
}
}
发送线程Send_Thread.java
package Chat_UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.Scanner;
public class Send_Thread extends Thread{
//发送的socket端
private DatagramSocket sender = null;
//待发送的目标地址
private InetSocketAddress address = null;
//从键盘输入
Scanner scan = new Scanner(System.in);
public Send_Thread(DatagramSocket sender,InetSocketAddress address)
{
this.sender = sender;
this.address = address;
}
@Override
public void run() {
// TODO Auto-generated method stub
try
{
while(true)
{
//输入待发送的内容
String input = scan.nextLine();
if(input.equals("exit"))
break;
byte[] data = null;
data = input.getBytes("UTF-8");
//创建UDP数据报
DatagramPacket pack = new DatagramPacket(data, data.length,address);
sender.send(pack);
}
System.out.println("Exit!");
}catch(IOException e)
{
System.out.println("IOException");
}
}
}
聊天服务器
Chat_Server.java
package Chat_UDP;
//杨丽冰 201831064402
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class Chat_Server {
private static final int DEST_PORT = 8888;
private static final int SEND_PORT = 10001;
private static final int RECE_PORT = 9000;
private static final String IP = "127.0.0.1";
public static void main(String[] args)
{
try{
Send_Thread send_thread = null;
Receive_Thread rece_thread = null;
InetSocketAddress address = null;
//创建待接受数据包的目的机的端口号和IP地址
address = new InetSocketAddress(IP, DEST_PORT);
//创建发送的Socket端
DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
//创建接受的Socket端
DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
//发送线程建立
send_thread = new Send_Thread(sendsocket, address);
//接受线程的建立
rece_thread = new Receive_Thread(recesocket);
send_thread.start();
rece_thread.start();
}catch(Exception e)
{
System.out.println("Exception!");
}
}
}
聊天客户端 Chat_Client.java
package Chat_UDP;
//杨丽冰 201831064402
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class Chat_Client {
//声明端口号
private static final int DEST_PORT = 9000;
private static final int SEND_PORT = 10000;
private static final int RECE_PORT = 8888;
private static final String IP = "127.0.0.1";
public static void main(String[] args)
{
try{
Send_Thread send_thread = null;
Receive_Thread rece_thread = null;
InetSocketAddress address = null;
//创建待接受数据包的目的机的端口号和IP地址
address = new InetSocketAddress(IP, DEST_PORT);
//创建发送的Socket端
DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
//创建接受的Socket端
DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
//发送线程建立
send_thread = new Send_Thread(sendsocket, address);
//接受线程的建立
rece_thread = new Receive_Thread(recesocket);
send_thread.start();
rece_thread.start();
}catch(Exception e)
{
System.out.println("Exception!");
}
}
}
需要注意的时候运行的时候需要同时运行聊天服务器和客户端,才能够正常运行。
最终效果如下:
来源:https://blog.csdn.net/u011612364/article/details/110758853
标签:java,UDP,聊天工具
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#中子类调用父类的实现方法
2023-08-17 09:09:52
java开发工作中对InheritableThreadLocal使用思考
2023-11-24 21:46:44
![](https://img.aspxhome.com/file/2023/6/59186_0s.jpg)
C#实现HSL颜色值转换为RGB的方法
2022-02-21 09:56:11
JAVA各种OOM代码示例与解决方法
2023-01-23 04:28:00
![](https://img.aspxhome.com/file/2023/5/72555_0s.jpg)
Java之SSM中bean相关知识汇总案例讲解
2021-11-10 06:16:26
![](https://img.aspxhome.com/file/2023/9/68689_0s.jpg)
详解安装Eclipse Maven插件的几种方法
2022-06-01 06:15:20
![](https://img.aspxhome.com/file/2023/1/69941_0s.png)
Java聊天室之解决连接超时问题
2021-06-07 16:30:54
![](https://img.aspxhome.com/file/2023/5/69115_0s.png)
java后台接收app上传的图片的示例代码
2022-11-03 00:04:15
C#11新特性使用案例详解
2023-11-26 03:19:15
![](https://img.aspxhome.com/file/2023/2/80112_0s.png)
一篇文章带你入门Java Script
2023-09-12 06:09:24
C#类中方法的执行顺序是什么
2022-07-01 03:55:15
![](https://img.aspxhome.com/file/2023/7/78167_0s.jpg)
java 解决异常 2 字节的 UTF-8 序列的字节2 无效的问题
2021-06-01 10:29:00
SpringBoot实现模块日志入库的项目实践
2022-06-15 10:32:49
![](https://img.aspxhome.com/file/2023/6/91136_0s.png)
Java 精炼解读数据结构逻辑控制
2023-09-14 05:35:37
![](https://img.aspxhome.com/file/2023/9/79909_0s.png)
C#使用InstallerProjects打包桌面应用程序的完整步骤
2023-12-08 14:38:04
![](https://img.aspxhome.com/file/2023/4/91334_0s.png)
Spring BeanFactory 与 FactoryBean 的区别详情
2023-12-23 02:51:46
![](https://img.aspxhome.com/file/2023/8/66498_0s.webp)
使用注解@Validated和BindingResult对入参进行非空校验方式
2022-09-16 11:30:44
![](https://img.aspxhome.com/file/2023/5/66215_0s.png)
C#控件闪烁的解决方法
2023-02-27 07:30:41
java小程序之控制台字符动画的实现
2022-10-30 08:21:27
![](https://img.aspxhome.com/file/2023/5/70505_0s.png)
Java 回调callback举例详解
2023-11-11 16:25:09
![](https://img.aspxhome.com/file/2023/2/59592_0s.png)