Java 网络编程 --基于UDP实现一对一聊天功能
UDP 基本流程:
UDP发送端基本流程:
1、使用DatagramSocket 指定端口 创建发送端
2、准备数据 一定转成字节数组
3、 封装成DatagramPacket 包裹,需要指定目的地
4、发送包裹send(DatagramPacket p) *
5、释放资源
UDP接收端基本流程:
1、使用DatagramSocket 指定端口 创建接收端
2、准备容器 封装成DatagramPacket 包裹
3、阻塞式接收包裹receive(DatagramPacket p)
4、分析数据 getData() getLength()
5、释放资源
实现聊天功能显然需要发送端和接收端,并且需要不断循环接收发送。
简化版实现:
我们先实现一个简化版:
发送端:
public class UdpTalkClient {
public static void main(String[] args) throws Exception {
System.out.println("发送方启动中。。。。");
// 1、使用DatagramSocket 指定端口,创建发送端
DatagramSocket client = new DatagramSocket(8888);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
// 2、准备数据 一定转成字节数组
String data = br.readLine();
byte[] datas = data.getBytes();
// 3、封装成DatagramPacket 包裹,需要指定地址
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length,
new InetSocketAddress("localhost", 9999));
// 4、发送包裹
client.send(packet);
if(data.equals("bye")) {
break;
}
}
// 5、释放资源
client.close();
}
}
接收方:
public class UdpTalkServer {
public static void main(String[] args) throws Exception {
System.out.println("接收方启动中。。。");
// 1、使用DatagramSocket 指定端口创建接收端
DatagramSocket server = new DatagramSocket(9999);
while (true) {
// 2、准备容器封装成DatagramPacket 包裹
byte[] container = new byte[1024 * 60];
DatagramPacket packet = new DatagramPacket(container, container.length);
// 3、阻塞式接收包裹
server.receive(packet);
// 4、分析数据
byte[] datas = packet.getData();
String msg = new String(datas, 0, packet.getLength());
System.out.println(msg);
if(msg.equals("bye")) {
break;
}
}
// 5、释放资源
server.close();
}
}
运行以上两个代码效果基本是这样:

目前的代码只能单方发送接收。这显然不是我们要的效果,为了实现双方都能接收和发送,我们加入多线程。
封装:
接下来只要拷贝简化版代码利用面向对象封装了
发送方线程封装:
public class TalkSend implements Runnable {
private DatagramSocket client;// 发送端
BufferedReader br; // 输入流
private String toIp;// 发送目标ip
private int toPort;// 发送目标端口 和接收端使用端口一致
public TalkSend(int port, String toIp, int toPort) {
this.toIp = toIp;
this.toPort = toPort;
try {
client = new DatagramSocket(port);
br = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
// 2、准备数据 一定转成字节数组
String data = br.readLine();
byte[] datas = data.getBytes();
// 3、封装成DatagramPacket 包裹,需要指定地址
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length,
new InetSocketAddress(this.toIp, this.toPort));
// 4、发送包裹
client.send(packet);
if(data.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 5、释放资源
client.close();
}
}
接收方线程封装:
public class TalkReceive implements Runnable {
private DatagramSocket server; // 接收端
private int port; // 接收端使用端口
private String from; // 发送方标记
public TalkReceive(int port, String from) {
this.from = from;
try {
server = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
// 2、准备容器封装成DatagramPacket 包裹
byte[] container = new byte[1024 * 60];
DatagramPacket packet = new DatagramPacket(container, container.length);
// 3、阻塞式接收包裹
server.receive(packet);
// 4、分析数据
byte[] datas = packet.getData();
String msg = new String(datas, 0, packet.getLength());
System.out.println(from + ":" + msg);
if(msg.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 5、释放资源
server.close();
}
}
模拟淘宝客户和老板对话启动多线程:
客户:
public class TalkCustomer {
public static void main(String[] args) {
new Thread(new TalkSend(9999, "localhost", 8888)).start();
new Thread(new TalkReceive(7777, "老板")).start();
}
}
老板:
public class TalkService {
public static void main(String[] args) {
new Thread(new TalkReceive(8888, "客户")).start();
new Thread(new TalkSend(6666, "localhost", 7777)).start();
}
}
运行测试:

效果实现了。
Java 网络编程 --基于UDP实现一对一聊天功能的更多相关文章
- Java 网络编程 -- 基于TCP 模拟多用户登录
Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...
- JAVA基础知识之网络编程——-基于UDP协议的通信例子
UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...
- java网络编程(4)——udp实现聊天
UDP可以实现在线聊天功能,我这里就是简单模拟一下: 发送端: package com.seven.udp; import java.io.BufferedReader; import java.io ...
- java 网络编程-tcp/udp
--转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...
- 网络编程(基于udp协议的套接字/socketserver模块/进程简介)
一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...
- java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket
什么是UDP协议: UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket 但这两个 Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象.Java 提供了 ...
- java Socket编程-基于UDP
package com.wzy.UDPTest; import java.net.DatagramPacket; import java.net.DatagramSocket; import java ...
- java 网络编程基础 UDP协议DatagramSocket,MulticastSocket 实现局域网聊天软件(Server + Client模式)
开发思路: 服务端两个Socket: UDP的DatagramSocket接收客户端消息. 广播multicastSocket 发送广播消息 客户端一个Socket: multicastSocke ...
- Java 网络编程 -- 基于TCP 实现聊天室 群聊 私聊
分析: 聊天室需要多个客户端和一个服务端. 服务端负责转发消息. 客户端可以发送消息.接收消息. 消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他 ...
随机推荐
- WePY的开发环境的安装
2020-03-24 1.安装Node.js 官网:https://nodejs.org/ 两个版本 LTS为稳定的长期支持版本 Current为最新的版本 安装完毕后,cmd下输入 node -v ...
- python中的原地操作
什么是原地操作: 例子: 列表在append添加一个元素后,没有产生新副本,再次打印的时候多了一个值,这个appned就是原地操作 由此可见,原地操作有以下特点: 没有返回值(返回值为None) 改变 ...
- javax.el.PropertyNotFoundException: 类型[cn.cqsw.pojo.Course]上找不到属性[CourseId]
今天在JSP利用EL表达式取值报了 "javax.el.PropertyNotFoundException” 1 Caused by: org.apache.jasper.JasperExc ...
- 关于java动态代理模式
1. 动态代理 动态代理就是通过代理类是代理类与相关接口不直接发生联系,而在运行期(Runtime)实现动态关联. 动态代理主要用到java.lang.reflect包中的两个类,Invocation ...
- SpringAOP入门
Spring的AOP aop概述 Aspect Oriented Programing 面向切面(方面)编程, aop:扩展功能不修改源代码实现 aop采取横向抽取机制,取代了传统纵向继承体系重复性代 ...
- Gang Of Four的23中设计模式
Gang Of Four的23中设计模式 标签(空格分隔): 设计模式 1. 根据目的来进行划分 根据目的进行划分可以分为创建型模式, 结构型模式和行为模式三种. 1.1 创建型模式 怎样创建对象, ...
- EEPROM存储芯片24C02
1.24C02简介 24C02是一个2Kbit的串行EEPROM存储芯片,可存储256个字节数据.工作电压范围为1.8V到6.0V,具有低功耗CMOS技术,自定时擦写周期,1000000次编程/擦除周 ...
- eclipse导入项目乱码问题及快键键收集
1.eclipse导入的项目出现乱码,选择该项目,右键选择最下方的Properties,第一个出现的Resource页面: 在Text file encoding项中,选择other. 目前中文编码主 ...
- VUE CLI3.0安装及配置
# 安装 npm install -g @vue/cli # 查看已安装版本vue --version 或者 vue -V # 卸载 npm uninstall @vue/cli -g # 新建项目 ...
- post登录 jsessionid 以及cookie 传递
先配置登录接口请求 登录成功后: 再其它请求中设置