使用socket通讯经常会遇到客户端、服务器端字符编码不一致的情况,如果传输的信息包含中文,这时我们可能就需要对传输的信息的按照指定的字符集进行解码
关于乱码的问题,最关键的要明白接受到的信息是什么编码的,就需要用什么字符集进行解码。
首先我们了解jdk api中的几个基本的概念
String类
String复制代码
构造一个新的
String,方法是使用指定的字符集解码指定的字节数组。新的
String 的长度是一个字符集函数,因此不能等于字节数组的长度。
1
2
3public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException
getBytes
复制代码
使用平台默认的字符集将此
String 解码为字节序列,并将结果存储到一个新的字节数组中。
1public byte[] getBytes()
getBytes
复制代码
使用指定的字符集将此
String 解码为字节序列,并将结果存储到一个新的字节数组中。
1
2public byte[] getBytes(String charsetName) throws UnsupportedEncodingException
在项目开发中遇到这种情况对方系统的编码为gb18030,而我们系统的编码为utf-8,两个系统直接使用socket进行通讯
在通讯过程中我们系统作为客户端需要按照gb18030进行报文发送,而当接受到对方系统的报文时我们需要将报文按照gb18030进行解码
具体测试代码如下:
socket服务端:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70import 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客户端
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58import 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通讯乱码问题的解决的全部内容,更多相关java内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复