Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从服务器套接字读取unicode字符_Java_Sockets_Utf 8_Server - Fatal编程技术网

Java 如何从服务器套接字读取unicode字符

Java 如何从服务器套接字读取unicode字符,java,sockets,utf-8,server,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 BufferedRe

我需要在服务器端接收客户端发送的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()));
我可以使用.read()中的
读取字节(直到返回-1),但问题是字符串是unicode,换句话说,每个字符由两个字节表示。因此,转换使用普通ascii字符的
read()
的结果毫无意义

更新 根据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()+", ");
}
这是人们所期望的,但是为什么readLine方法不能产生“好”的结果呢? 无论如何,如果我们找不到实际的答案,我可能应该收集字节(如上所述)并从中创建字符串?怎么做


顺便说一句,我在windows上。

使用
新的InputStreamReader(clientSocket.getInputStream(),“UTF-8”)
为了在创建
InputStreamReader
时正确设置读取来自客户端的
InputStream
时要使用的
字符集的名称,可以如下设置编码:

BufferedReader in = 
     new BufferedReader(
         new InputStreamReader(clientSocket.getInputStream(), "UTF-8")
);
试着这样做:

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

注意课堂。它从Java1.7开始就受到支持,并提供了更优雅的方式来指定标准编码,如
UTF-8

。这个解决方案似乎有效,但我有一些问题。我从客户端发送一个以\10\13结尾的字符串,在服务器端执行
System.out.println(in.readLine())    Reader in = new BufferedReader(
                 new InputStreamReader(
                    clientSocket.getInputStream(), StandardCharsets.UTF_8));