【Java】Java UDP 套接字编程乱码问题
零、发现问题
- 用Java写了个UDP收发程序,发现中文有问题!
package socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class send {
/**
* 发送UDP数据
* @param args
*/
public static void main(String[] args) {
String str = "hello 这是一个JavaUDP实例!";
DatagramSocket socket = null;
try {
socket = new DatagramSocket();//创建数据包套接字
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("127.0.0.1"), 7217);//构建数据包
socket.send(packet);//发送数据包
socket.close();//关闭套接字
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(socket!=null) {
socket.close();//关闭套接字
}
}
}
}
package socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class recive {
static int port = 7217;//监听的端口
/**
* 接收UDP数据
* @param args
*/
public static void main(String[] args) {
DatagramSocket socket = null;
try {
socket = new DatagramSocket(port);//开始监听端口
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建缓存区
socket.receive(packet);//接收数据,这里阻塞
byte[] dataArray = packet.getData();//获取收到的数据
int portSend = packet.getPort();//获取发送的端口
InetAddress address = packet.getAddress();//获取发送的地址
int length = packet.getLength();//获取数据的长度
System.out.println(
"地址:"+address.getHostAddress()
+"\n端口:"+portSend
+"\n数据:\t"
+ "长度:"+dataArray.length+"\n"
+ "\t内容:"+new String(dataArray,0,length));//显示内容
socket.close();//关闭套接字
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(socket!=null) {
socket.close();//关闭套接字
}
}
}
}
一、显示不全

解决方法:把发送端的
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("127.0.0.1"), 7217);//构建数据包
修改为
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("127.0.0.1"), 7217);//构建数据包
总结:收发双方应统一使用
str.getBytes().length
获取长度
二、显示乱码

解决方法:使用统一编码
发送端的
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 7217);//构建数据包
修改为
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes("UTF-8").length, InetAddress.getByName("127.0.0.1"), 7217);//构建数据包
接收端的
System.out.println(
"地址:"+address.getHostAddress()
+"\n端口:"+portSend
+"\n数据:\t"
+ "长度:"+dataArray.length+"\n"
+ "\t内容:"+new String(dataArray,0,length));//显示内容
修改为
System.out.println(
"地址:"+address.getHostAddress()
+"\n端口:"+portSend
+"\n数据:\t"
+ "长度:"+dataArray.length+"\n"
+ "\t内容:"+new String(dataArray,0,length,"UTF-8"));//显示内容
总结:收发双方String在跟Byte数组转换时应该指定编码
三、收到很多方块
在解决第二个问题的时候,出现过这种问题:

是因为一开始从Byte转到String时指定了编码没有指定长度
new String(dataArray,"UTF-8");
指定一下长度就可以了
new String(dataArray,0,length,"UTF-8");
四、总结
基本上乱码都是跟编码有关或者转换的时候收发双方处理不一致造成的。在以后的开发中需要注意!
【Java】Java UDP 套接字编程乱码问题的更多相关文章
- TCP和UDP套接字编程 (java实现)
在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程 ...
- 【Python网络编程】利用Python进行TCP、UDP套接字编程
之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...
- JavaTCP和UDP套接字编程
在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站( ...
- 探索UDP套接字编程
UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...
- 【转】 探索UDP套接字编程
UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...
- 计算机网络实验 UDP套接字编程
这是个傻瓜式操作教程 西科大计算机网络实验 UDP套接字编程 我用自己的Ubuntu16.04来举例,实验室的是虚拟机,差不多 只针对第三个题目,修改服务器来通过响应客户端发送的GetTime并发送给 ...
- UDP套接字编程 返回系统时间
计算机网络实验 简单UDP套接字编程 这是学校老师自己改进了一点的题目.我预习了好久才搞明白,同学来问的时候,一大堆简单问题实在是不想回答...所以,这时候我觉得博客是个好东西! 我的任务是做客户端和 ...
- 【Unix网络编程】chapter8基本UDP套接字编程
chapter8基本UDP套接字编程 8.1 概述 典型的UDP客户端/服务端的函数调用 8.2 recvfrom和sendto函数 #include <sys/socket.h> ssi ...
- 《Unix 网络编程》08:基本UDP套接字编程
基本UDP套接字编程 系列文章导航:<Unix 网络编程>笔记 UDP 概述 流程图 recvfrom 和 sendto #include <sys/socket.h> ssi ...
- java基础----->TCP和UDP套接字编程
这里简单的总结一下TCP和UDP编程的写法,另外涉及到HttpUrlConnection的用法 . TCP套接字 一.项目的流程如下说明: .客户输入一行字符,通过其套接字发送到服务器. .服务器从其 ...
随机推荐
- Windows安全加固(一)
目录: 1.在win ser2016中如何管理重命名administrator,禁用GUEST 2.禁用GUEST账户 3.系统不显示上次登录的账户名. 4.清理系统无效账户. 5.按用户类型分配账号 ...
- 最新AI智能体开发案例:辅助写作神器!教你用Coze平台搭建「文匠智创 1.0」智能体!
各位小伙伴们,大家好呀!我是疯狂老包.我精心打造的<疯狂AI智能体开发:100个实战案例, 从 入门到精通 >正在开发中!要是你对 AI 应用搭建满怀热忱,渴望深入学习其中的奥秘与技巧,那 ...
- Python 潮流周刊#85:让 AI 帮你写出更好的代码(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- MYSQL-收集
1.MySQL敏感数据进行加密的几种方法小结 AES_ENCRYPT和AES_DECRYPT函数 AES(Advanced Encryption Standard)是一种对称加密算法.在MySQL中, ...
- 彻底讲透Spring AOP动态代理,原理源码深度剖析!
1.AOP:[动态代理]定义 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 2.基于注解aop的开发流程 1.导入aop模块:Spring AOP:(spring-asp ...
- G1原理—8.如何优化G1中的YGC
大纲 1.5千QPS的数据报表系统发生性能抖动的优化(停顿时间太小导致新生代上不去) 2.由于产生大量大对象导致系统吞吐量降低的优化(大对象太多频繁Mixed GC) 3.YGC其他相关参数优化之TL ...
- [BZOJ P2771] 天才ACM
[BZOJ P2771] 天才ACM 传送门 朴素算法 枚举终点 \(r\),对区间 \([l, r]\) 排序求校验值 \(sum\),比较 \(sum\) 和 \(t\) $ sum \le t ...
- Windows中利用任务计划执行进程守护
在Windows中除了开发专用的进程守护外,还可以利用任务计划做进程守护. 一.bat示例 tasklist | findstr "notepad" if %ERRORLEVEL% ...
- 应用中的 PostgreSQL项目案例
title: 应用中的 PostgreSQL项目案例 date: 2025/2/3 updated: 2025/2/3 author: cmdragon excerpt: 随着大数据和云计算的兴起,企 ...
- CDN与前端技术
本文分享自天翼云开发者社区<CDN与前端技术>,作者:张****亮 CDN(Content Delivery Network)是一种广泛应用于网络加速和内容分发的技术.它通过在全球各地部署 ...