【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套接字 一.项目的流程如下说明: .客户输入一行字符,通过其套接字发送到服务器. .服务器从其 ...
随机推荐
- h5 canvas 视频透明度抠图,视频需要一个灰度通道副本表示透明度
视频透明度抠图,视频需要一个灰度通道副本表示透明度 目前抖音等直播平台的礼物特效就是这个方法处理的 <!DOCTYPE html> <html> <head> &l ...
- .NET8.0多线程编码结合异步编码示例
1.创建一个.NET8.0控制台项目来演示多线程的应用 2.快速创建一个线程 3.多次运行程序,可以得到输出结果 这就是多线程的特点 - 当多个线程并行执行时,它们的具体执行顺序是不确定的,除非我们使 ...
- runoob-Android 基础入门教程-1
https://www.runoob.com/w3cnote/android-tutorial-interface-design.html 公司的话,大部分使用的都是Axure Rp,但是这个东西比较 ...
- 部署 Browser-Use WebUI + DeepSeek 实现浏览器AI自动化
一.安装部署 1.安装 python3.11 或以上版本 2.安装browser-use pip install browser-use 3.安装 Playwright playwrigh ...
- 部署博客(docker)
参考:链接 准备一台新的服务器 安全组:8080.80.3306等端口放通 安装docker 参考: 链接 获取最新镜像 docker pull b3log/solo 报错,可能是docker未启动, ...
- 第一!天翼云领跑中国边缘云laaS市场!
近日,弗若斯特沙利文(Frost & Sullivan,简称"沙利文")联合头豹研究院发布<2023年中国边缘云市场报告>,天翼云在2023H1中国边缘云Iaa ...
- ThreeJs-13效果合成与后期处理
一.合成效果原理与设置 什么是效果合成,就是可以把一些效果经过后期处理再放出来 原来的物体是直接通过render渲染出来,而现在则是经过一条render通道,可以处理也可以叠加处理后再放出来 首先正常 ...
- Redis如何查看服务状态、关闭和启动
一.查看Redis服务状态 Linux命令: 查看redis服务进程,是否已经启动 1.ps -ef | grep redis 2.ps -aux | grep redis 3.netstat -tu ...
- FreeSql学习笔记——12.执行Sql
前言 FreeSql支持通过Sql语句配合ISelect生成最终的Sql语句,也可以执行原生自定义Sql语句,使操作更灵活:通过sql语句与Iselect配合使用更好控制sql语句: 简单查询 _ ...
- 记录一次WPF程序进程挂起问题
## 1. 使用背景 开发`WPF`单进程项目,在项目中使用`MongoDB`数据库,需要连接多个不同的数据库实例,另外项目框架采用了事件聚合器来管理模块间的通知调用,基于`NetMQ`实现了一个`Z ...