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 实现聊天室 群聊 私聊
分析: 聊天室需要多个客户端和一个服务端. 服务端负责转发消息. 客户端可以发送消息.接收消息. 消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他 ...
随机推荐
- java新时间类
时间 java8以前使用的时间很多方法都已经废弃了,而且不是线程安全的,java8提供了一系列的时间类,这些时间类都是线程安全的 LocalDate.LocalTime.LocalDateTime 这 ...
- SublimeのJedi (自动补全)
关于 Sublime 3 - Jedi Package 的设置和使用方法 我是一枚小白,安装后 Sublime 后,想在码字时,达到如下效果: 打字时,自动提示相关内容 按Tab键,相关内容自动填充 ...
- 2.1.JVM的垃圾回收机制,判断对象是否死亡
因为热爱,所以坚持. 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们 ...
- ㊙力荐!!!那些炒鸡有用的chrome插件㊙
今天咱们来说一说那些炒鸡
- CDN加速小水管动态应用技巧
不得不说现在大陆和HK的云主机都是小水管模式,由于硬件的快速发展在这种小水管的情况下很难发挥出用户硬件资源的能力,当然可以加水管但费用很高,更多时候会浪费带宽:这个时候我们想到CDN加速,这种资源的好 ...
- D3属性大全
https://www.cnblogs.com/bester-ace/articles/10948793.html https://www.cnblogs.com/qingmingsang/artic ...
- 记一次JAVA进程导致Kubernetes节点CPU飙高的排查与解决
一.发现问题 在一次系统上线后,我们发现某几个节点在长时间运行后会出现CPU持续飙升的问题,导致的结果就是Kubernetes集群的这个节点会把所在的Pod进行驱逐(调度):如果调度到同样问题的节点上 ...
- python函数的传参模式
python里的变量更像是一个名字.标签.而Python中一切又皆为对象. 当函数传参时,函数参数作为一个标签,指向某个对象,因此更贴切的说是"call by object". 但 ...
- python socket简介
一.socket是什么 socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口.在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在socket接口后面, ...
- C语言变长数组
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Variable ...