java基于UDP实现在线聊天功能
作者:春风依杨柳 发布时间:2021-06-08 00:01:44
标签:java,UDP,在线聊天
本文实例为大家分享了java基于UDP实现在线聊天的具体代码,供大家参考,具体内容如下
效果图:
一、学习UDP的简单使用步骤
接收端:
DatagramSocket socket = null;
try {
//1.开启自己的端口(客户端连接的端口)
socket = new DatagramSocket(9999);
//2.接收数据
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);//堵塞接收
//3.处理数据
byte[] target = packet.getData();
int len=0;
if (target.length!=0){
for (int i=0;i<target.length;i++){
if (target[i]=='\0'){
len=i;
break;
}
}
}
//4.输出数据
System.out.println("from:"+packet.getAddress());
System.out.println(new String(target,0,len));
} catch (Exception e) {
e.printStackTrace();
}finally {
if (socket!=null){
socket.close();
}
}
发送端:
//1.建立连接
DatagramSocket socket = null;
//2.获得连接对象
//获取对方的IP和端口号进行连接
InetAddress Ip = null;
int port = 9999;
//4.创建数据包
String msg = "你好";
DatagramPacket packet = null;
try {
socket = new DatagramSocket();
Ip = InetAddress.getByName("localhost");
//数据,数据的长度起始,发送的地址
packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,Ip,port);
//5.发送包
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
}finally {
//6.关闭资源
if (socket != null){
socket.close();
}
}
二、多线程实现UDP在线聊天
1.创键服务器端
package chat;
import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
public class ServerThread implements Runnable{
private final String theOther;//对方的姓名
private final int selfPort;//自己开放的的端口号
private DatagramSocket socket;
public ServerThread(int selfPort,String theOther){//构造器
this.selfPort = selfPort;
this.theOther = theOther;
try {
//开启服务器
socket = new DatagramSocket(selfPort);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void run() {
//接收数据
byte[] container;
DatagramPacket packet;//包
byte[] date;
String receiveMsg = "";//信号灯
int len = 0;
try {
while (!receiveMsg.equals("bye")){//如果对方说:bye,则退出聊天
container = new byte[1024];
packet = new DatagramPacket(container,0,container.length);
socket.receive(packet);//接收数据包
date =packet.getData();//获取数据
//处理数据
for (int i = 0; i < date.length; i++) {
if (date[i]=='\0'){
len = i;
break;
}
}
//将收到的数据转换为字符串
receiveMsg = new String(date,0, len, StandardCharsets.UTF_8);
System.out.println(theOther+":"+receiveMsg);
}
// 保存聊天记录(扩展内容)
// FileOutputStream out = new FileOutputStream(new File(theOther+"的聊天记录.txt"));
// out.write(receiveMsg.getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭服务器
if (socket != null){
socket.close();
}
}
}
}
2.建立客户端
package chat;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class ClientThread implements Runnable{
private DatagramSocket socket = null;
private BufferedReader bufferedReader= null;//缓冲流
private final String toIp;//对方的IP
private final int toPort;//对方的端口号
public ClientThread(String toIp, int toPort) {
this.toIp = toIp;
this.toPort = toPort;
try {
socket = new DatagramSocket();
bufferedReader = new BufferedReader(new InputStreamReader(System.in));//获取键盘输入
} catch (SocketException e) {
e.printStackTrace();
}
}
public void run() {
String SendMsg = "";//发视频美好的消息
byte[] date;
DatagramPacket packet;
try {
while(!SendMsg.equals("bye")) {//自己发送‘bye'时关闭发送端
SendMsg = bufferedReader.readLine();//读取键盘输入内容
date = SendMsg.getBytes(StandardCharsets.UTF_8);//字符串转换为字节进行传输
packet = new DatagramPacket(date,0,date.length,new InetSocketAddress(toIp,toPort));
socket.send(packet);//发送数据
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭数据流
if (bufferedReader!=null){
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
socket.close();
}
}
}
}
3.用户使用:
用户1:
package chat;
public class User01 {
public static void main(String[] args) {
System.out.println("小明的聊天室!!!");
new Thread(new ServerThread(9000,"小红")).start();//开启接收
new Thread(new ClientThread("localhost",9001)).start();//开启发送
}
}
用户2:
package chat;
public class User02 {
public static void main(String[] args) {
System.out.println("小红的聊天室!!!");
new Thread(new ServerThread(9001,"小明")).start();
new Thread(new ClientThread("localhost",9000)).start();
}
}
多人聊天思路:
用户—>公共服务器接收端打包数据–>服务器发送端发送给各个用户—>用户
来源:https://blog.csdn.net/weixin_54883831/article/details/119296697


猜你喜欢
- 我们知道 Spring Boot 已经提供了一套默认的异常处理机制,但是 Spring Boot 提供的默认异常处理机制却并不一定适合我们实
- 一、基本概念:线程、进程1.1、进程与线程的具体介绍线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。若一个进程同
- Glide开源框架是Google推荐的图片加载和缓框架,其在Github上的开源地址是:https://github.com/bumptec
- 树形结构很多地方都有应用,比如我们在构造网站后台的授权限树的时候,再比如我们在设计多级留言的时候、还有分类等等。有些时候我们的树形结构并不需
- 引言从前面我们可以大致了解了协程的玩法,如果一个协程中使用子协程,那么该协程会等待子协程执行结束后才真正退出,而达到这种效果的原因就是协程上
- 前言:想象一下,有一个服务提供个多个客户端调用,但不是所有客户端都需要全部的返回参数:比如商品列表服务返回商品的所有信息,而订单服务调用商品
- 本文实例讲述了C#找出字符串中第一个字母并大写的方法。分享给大家供大家参考,具体如下:class Program{ static
- Mybatis判断空字符串先说结论:如果使用正确,是不会产生任何问题的。大家各种疑惑,全是使用不当产生的。先说正确的使用方式一般判空的方式就
- 一些Java项目中在mybatis与spring整合中有MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接
- “读多写少”是大部分项目的一个特点。例如“购物”,总是看的人
- 效果图效果图依次为发现界面顶部,包含首页轮播图,水平滚动的按钮,推荐歌单;然后是发现界面推荐单曲,点击单曲就是直接进入播放界面;最后是全局播
- 开发过程中有这样一个场景,2个 bean 初始化逻辑中有依赖关系,需要控制二者的初始化顺序。实现方式可以有多种,本文结合目前对 Spring
- PDF文件和图片文件,这是两种完全不一样的格式,可是有的时候这两种格式却是有相互转换的需要,大家在工作中遇到PDF文件转图片文件的问题时是怎
- 注解实现自动装配@Autowire注解@Autowire注解,自动装配通过类型,名字如果Autowire不能唯一自动装配上属性,则需要通过@
- private string CheckCidInfo(string cid) &
- 目录源码实现基本流程ThreadLoalMap数据结构Hash冲突及解决ThreadLocal内存泄露内存引用链路引用类型为什么使用弱引用而
- 一、 HttpURLConnection以GET方式访问网络:HttpURLConnection connection = null;try
- Android 实现tab视图有2种方法,一种是在布局页面中定义<tabhost>标签,另一种就是继承tabactivity.但
- 最近项目中用到了文字图标的按钮,需要居中显示,如果用TextView实现的方式,必须同时设置padding和drawablePadding。
- 创建类第一步新建一个java类QSV,构造函数传入需要解析的文件名称。public class QSV {private RandomAcc