【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套接字 一.项目的流程如下说明: .客户输入一行字符,通过其套接字发送到服务器. .服务器从其 ...
随机推荐
- mac zshrc环境变量配置
配置mac zshrc的环境变量时犯了一个错误,我配置了多个export PATH, 结果只有一个PATH生效了,所以配置多个PATH是错误的: zshrc中环境变量配置如下: export AN ...
- Vue + Axios 请求接口方法与传参详解
使用Vue的脚手架搭建的前端项目,通常都使用Axios封装的接口请求,项目中引入的方式不做多介绍,本文主要介绍接口调用与不同形式的传参方法. 一.Get请求: Get请求比较简单,通常就是将参数拼接到 ...
- 从v-for的key说起
一.v-for中的key是为什么存在呢? 这是vue官网给key的定义,key主要用于vue的虚拟dom算法.新的问题出现了,vue的虚拟dom算法是什么? 二.虚拟domg算法 我们的程序在运行时, ...
- 腾讯云 TI 平台部署与调用DeepSeek-R1大模型的实战指南
今天我们将继续探讨如何部署一个私有化的 DeepSeek-R1 大模型,具体的部署过程我们将利用腾讯云的 TI 平台进行操作.当前,腾讯云 TI 平台为用户提供了免费体验的满血版 DeepSeek-R ...
- 让存储绿“翼”盎然,天翼云HBlock入选工信部目录!
近日,中国电信天翼云的自研产品HBlock凭借"存储资源盘活技术"成功入选<国家工业和信息化领域节能降碳技术装备推荐目录(2024年版)>(以下简称<目录> ...
- FLink同步mysql到Iceberg丢数问题排查解决
一.问题背景 数据对比程序发现通过Flink cdc同步mysql写入Iceberg表运行一段时间后存在丢数问题,排查到丢数是由于hivemetastore钩子函数缺陷引起,由腾讯云EMR修复 钩子函 ...
- Doris端口列表
实例名称 端口名称 默认端口 通讯方向 说明 BE be_port 9060 FE --> BE BE 上 thrift server 的端口,用于接收来自 FE 的请求 BE webserve ...
- 让我们从零开始使用PyTorch构建一个轻量级的词嵌入模型
图片来源:Phil Hearing(Unsplash) 在我之前写的一篇文章中,我们学习了如何使用PyTorch的nn.Embedding层将单词转换为稠密向量.但由于该嵌入层是未经训练的,这些向量并 ...
- 男人八题-点分治-Acwing252.树
Acwing252.树 题目分析 树中的路径分为三种 路径两端在同一个子树 路径两端在不同子树 路径有一端是重心 因此可以分情况处理, 对于第一种情况可以进行递归处理, 第二种情况需要使用容斥原理求得 ...
- 计算机基础知识问答:C/C++篇
讲解一下C语言内存空间的模型: 代码区:它是用来存放程序执行代码的一块内存区域.通常,这部分区域是只读的,防止程序意外地修改了它的指令. 常量区:数据段包含了程序中已初始化的全局变量和静态变量.而BS ...