如何从服务器套接字

时间:2016-04-18 12:29:39

标签: java sockets utf-8 server

我需要在服务器端接收客户端发送的unicode(UTF-8)字符串。字符串的长度当然是未知的。

ServerSocket serverSocket = new ServerSocket(567);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

我可以使用in.read()读取字节(直到它返回-1),但问题是字符串是unicode,换句话说,每个字符由两个字节表示。因此,将read()的结果转换为正常的ascii字符是没有意义的。

更新

根据bello的建议,我创建了如下读者:

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"UTF-8"));

我已将客户端更改为在每个字符串后发送换行符(#10#13)。 但是新问题是如果我打电话,我会得到废话而不是真正的字符串:

in.readLine();

打印结果我得到一些无意义的字符串(我甚至不能在这里复制)虽然我没有处理非拉丁字符或其他任何东西。

为了了解发生了什么,我介绍了以下代码:

int j = 0
while (j < 255){
    j++;
   System.out.print(in.read()+", ");
}

所以这里我只打印收到的所有字节。如果我发送“ab”,我会得到:

97, 0, 98, 0, 10, 13, 

这是人们所期望的,但是为什么readLine方法不会产生“好”的结果? 无论如何,如果我们找不到实际的答案,我应该收集字节(如上所述)并从中创建我的字符串?怎么做?

P.S。只是一个快速的说明 - 我在窗户上。

3 个答案:

答案 0 :(得分:4)

使用charset以便在阅读来自客户的InputStream时正确设置要使用的campaign的名称

答案 1 :(得分:3)

创建InputStreamReader时,您可以设置如下编码:

BufferedReader in = 
     new BufferedReader(
         new InputStreamReader(clientSocket.getInputStream(), "UTF-8")
);

答案 2 :(得分:2)

尝试这种方式:

    Reader in = new BufferedReader(
                 new InputStreamReader(
                    clientSocket.getInputStream(), StandardCharsets.UTF_8));

请注意StandardCharsets课程。从Java 1.7开始支持它,并提供更优雅的方式来指定标准编码,如UTF-8