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实现一对一聊天功能的更多相关文章

  1. Java 网络编程 -- 基于TCP 模拟多用户登录

    Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...

  2. JAVA基础知识之网络编程——-基于UDP协议的通信例子

    UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...

  3. java网络编程(4)——udp实现聊天

    UDP可以实现在线聊天功能,我这里就是简单模拟一下: 发送端: package com.seven.udp; import java.io.BufferedReader; import java.io ...

  4. java 网络编程-tcp/udp

    --转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...

  5. 网络编程(基于udp协议的套接字/socketserver模块/进程简介)

    一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...

  6. java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket

    什么是UDP协议: UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket 但这两个 Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象.Java 提供了 ...

  7. java Socket编程-基于UDP

    package com.wzy.UDPTest; import java.net.DatagramPacket; import java.net.DatagramSocket; import java ...

  8. java 网络编程基础 UDP协议DatagramSocket,MulticastSocket 实现局域网聊天软件(Server + Client模式)

      开发思路: 服务端两个Socket: UDP的DatagramSocket接收客户端消息. 广播multicastSocket 发送广播消息 客户端一个Socket: multicastSocke ...

  9. Java 网络编程 -- 基于TCP 实现聊天室 群聊 私聊

    分析: 聊天室需要多个客户端和一个服务端. 服务端负责转发消息. 客户端可以发送消息.接收消息. 消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他 ...

随机推荐

  1. Xamarin.Forms客户端第一版

    Xamarin.Forms客户端第一版 作为TerminalMACS的一个子进程模块,目前完成第一版:读取展示手机基本信息.联系人信息.应用程序本地化. 功能简介 详细功能说明 关于TerminalM ...

  2. 技术大佬:我去,你竟然还在用 try–catch-finally

    二哥,你之前那篇 我去 switch的文章也特么太有趣了,读完后意犹未尽啊,要不要再写一篇啊?虽然用的是 Java 13 的语法,对旧版本不太友好.但谁能保证 Java 不会再来一次重大更新呢,就像 ...

  3. 记录---java中jsp页面引入jquery路径的问题

    今天在jsp页面中引入jquery的时候因为路径不对总是报404,网上的方法找到几种试了试但是最后结果还是不生效,遂想起原先的项目中有引入外部jquery的例子,所以立马看了看,发现当时的项目中是用$ ...

  4. shell大全

    1.shell判断文件是否存在 http://www.cnblogs.com/sunyubo/archive/2011/10/17/2282047.html

  5. SVN同步代码问题集锦

    1.删除文件后file missing警告                      相关链接: http://blog.sina.com.cn/s/blog_63e26d560100ve00.htm ...

  6. Oracle ROWNUM用法

    很多朋友应该跟我一样有个疑问,为什么rownum > 5 的时候会查不到一条数据,用rownum < 5就可以查到数据,明明查询所有的时候rownum有很多啊,小朋友,你是不是有很多问号? ...

  7. php simplexml_load_string 返回的对象print_r后,丢失信息?

    <?php $content = '<dblp> <inproceedings key="conf/aaim/He07" mdate="2007- ...

  8. 活久见!Linux命令行居然也可以用来查看图像?

    在 Linux 中有很多 GUI 应用程序可以查看图像,但是这对经常使用命令行来工作的人可能会觉得很繁琐.今天要介绍的是 3 个实用的 CLI 图像查看器来在终端上查看图像,让那些使用 CLI 的朋友 ...

  9. Spring (六):整合Mybatis

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  10. 关于Linux目录的配置

    关于Linux目录的配置说明 大家都知道Linux一切皆文件,但是Linux的文件有那么多,目录也不少.他们都是干什么用的呢,有没有什么规律呢?今天我们就来讨论一下Linux目录的配置 Linux目录 ...