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 实现聊天室 群聊 私聊
分析: 聊天室需要多个客户端和一个服务端. 服务端负责转发消息. 客户端可以发送消息.接收消息. 消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他 ...
随机推荐
- LoardPe与Import REC X64dbg脚本 脱壳 Upx
目录 LoardPe与Import REC X64dbg脚本 脱壳 Upx 一丶X64dbg调试器与脚本 1.1 起因 1.2 脚本的调试 1.3 Upx脱壳脚本 二丶LoardPe 内存Dump与I ...
- 本机安装oracle12C
1.先安装的oracle12C,创建了oracle主目录用户admin,其中主目录用户为admin,口令为123456. 2.其次创建监听,再创建数据库实例. 3.全局数据库名称为orcl.lan,管 ...
- 搞定SEO,看这一篇就够了
一.SEO入门 1.SEO是什么? SEO(Search Engine Optimization)中文意思为搜索引擎优化.在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在 ...
- coding++:thymelef 模板报错 the entity name must immediately follow the '&' in the entity reference
thymelef模板里面是不能实用&符号的 要用&转义符代替,官网也有文档说明可以用官方的通配符代替, 官方文档 http://www.thymeleaf.org/doc/tutori ...
- Windows系统向Ubuntu传输文件
PuTTY传输: 安装PuTTY,然后将PuTTY安装目录下的pscp.exe文件拷贝到/Windows/System32/目录下,在cmd控制台执行命令: # pscp 要传输的文件路径 ubunt ...
- RocketMQ调研
一.发展历程 早期淘宝内部有两套消息中间件系统:Notify和Napoli. 先有的Notify(至今12历史),后来因有序场景需求,且恰好当时Kafka开源(2011年),所以参照Kafka的设计理 ...
- E - E CodeForces - 1100E(拓扑排序 + 二分)
E - E CodeForces - 1100E 一个n个节点的有向图,节点标号从1到n,存在m条单向边.每条单向边有一个权值,代表翻转其方向所需的代价.求使图变成无环图,其中翻转的最大边权值最小的方 ...
- 使用Pytorch在多GPU下保存和加载训练模型参数遇到的问题
最近使用Pytorch在学习一个深度学习项目,在模型保存和加载过程中遇到了问题,最终通过在网卡查找资料得已解决,故以此记之,以备忘却. 首先,是在使用多GPU进行模型训练的过程中,在保存模型参数时,应 ...
- PTA数据结构与算法题目集(中文) 7-23
PTA数据结构与算法题目集(中文) 7-23 7-23 还原二叉树 (25 分) 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. 输入格式: 输入首先给出正整数N(≤50) ...
- 计算机网络学习笔记NO.2 物理层
2.1 基本概念 2.1.1 物理层概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体. 物理层主要任务:确定与传输媒体接口有关的一些特性(定义标准) 机械特性:定 ...