使用socket通讯经常会遇到客户端、服务器端字符编码不一致的情况,如果传输的信息包含中文,这时我们可能就需要对传输的信息的按照指定的字符集进行解码
关于乱码的问题,最关键的要明白接受到的信息是什么编码的,就需要用什么字符集进行解码。
首先我们了解jdk api中的几个基本的概念
String类
String
public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException
构造一个新的
String,方法是使用指定的字符集解码指定的字节数组。新的
String 的长度是一个字符集函数,因此不能等于字节数组的长度。
getBytes
public byte[] getBytes()
使用平台默认的字符集将此
String 解码为字节序列,并将结果存储到一个新的字节数组中。
getBytes
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException
使用指定的字符集将此
String 解码为字节序列,并将结果存储到一个新的字节数组中。
在项目开发中遇到这种情况对方系统的编码为gb18030,而我们系统的编码为utf-8,两个系统直接使用socket进行通讯
在通讯过程中我们系统作为客户端需要按照gb18030进行报文发送,而当接受到对方系统的报文时我们需要将报文按照gb18030进行解码
具体测试代码如下:
socket服务端:
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
/**
* @throws Exception
*/
public void startServer(int port) throws Exception {
ServerSocket serverSocket = new ServerSocket(port);
Socket server = null;
try {
while (true) {
server = serverSocket.accept();
System.out.println("socket服务端启动……");
try {
BufferedReader input = new BufferedReader(new InputStreamReader(new ByteArrayInputStream("服务端发给客户端的信息".getBytes())));
BufferedInputStream in = new BufferedInputStream(server.getInputStream());
PrintWriter out = new PrintWriter(new OutputStreamWriter(server.getOutputStream()));
String serverstring = null;
String clientstring = null;
out.println("欢迎客户端连入");
out.flush();
while (true) {
byte[] buf = new byte[10000];
int size=0;
if ((size=in.read(buf))!=-1) {
clientstring = new String(buf,0,size,"GB18030");
if (clientstring != null) {
System.out.println("client:" + clientstring);
}
}
serverstring = input.readLine();
out.println(serverstring);
out.flush();
break;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
server.close();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
serverSocket.close();
}
}
public static void main(String[] args) {
SocketServer ss = new SocketServer();
int port = 8888;
try {
ss.startServer(port);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
socket客户端
import java.io.BufferedInputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class SocketClient {
/**
* @throws Exception
*/
public void makeConn(String ip, int port) throws Exception {
Socket client = new Socket(ip, port);
try {
// BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
// BufferedReader input = new BufferedReader(new InputStreamReader(new ByteArrayInputStream("客户端发给服务器端的信息".getBytes())));
BufferedInputStream in = new BufferedInputStream(client.getInputStream());
PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream(),"GB18030"));
String clientString = null;
String serverString = null;
while (true) {
byte[] buf = new byte[10000];
int size=0;
if ((size=in.read(buf))!=-1) {
serverString = new String(buf,0,size,"GB18030");
if (serverString != null) {
System.out.println("server:" + serverString);
}
}
// clientString = input.readLine();
clientString = "客户端发给服务器端的信息";
if (clientString != null) {
out.println(clientString);
out.flush();
break;
}
}
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
public static void main(String[] args) {
SocketClient sc = new SocketClient();
int port = 8888;
try {
sc.makeConn("localhost", port);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上述代码的关键在于以下几部分:
由于socket服务端的编码是gb18030的,因此在接受到socket服务端的报文后我们需要按照gb18030进行解码
clientstring = new String(buf,0,size,”GB18030″);
而socket客户端因为编码是utf-8的,而socket服务端只能识别gb18030的编码,所以socket客户端在发送报文时需要做转换
PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream(),”GB18030″));
今天的文章java socket通讯乱码问题的解决分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6925.html