Java 打印流错误,没有原因吗?

Java 打印流错误,没有原因吗?,java,streamwriter,datainputstream,printstream,Java,Streamwriter,Datainputstream,Printstream,我正在制作一个服务器-客户机系统,其中客户机将向服务器写入消息,服务器将其保存为字符串,并在控制台中打印。但当系统试图读取该行时,控制台中会出现“PrintStream error”。没有错误或任何东西。我正在服务器上读取字符串,带有: DataInputStream inFromClient = new DataInputStream(socket.getInputStream()); String connectReason = inFromClient.readUTF(); 我从客户端发

我正在制作一个服务器-客户机系统,其中客户机将向服务器写入消息,服务器将其保存为字符串,并在控制台中打印。但当系统试图读取该行时,控制台中会出现“PrintStream error”。没有错误或任何东西。我正在服务器上读取字符串,带有:

DataInputStream inFromClient = new DataInputStream(socket.getInputStream());
String connectReason = inFromClient.readUTF();
我从客户端发送字符串,如下所示:

clientSocket = new TcpClient(Host, Port);
Stream = clientSocket.GetStream(); 
outToServer = new StreamWriter(Stream);
为什么我会犯这样的错误?它们连接没有错误,当我到达那一行时,我得到了“PrintStream error”。
readUTF()
方法要求数据以特定的方式格式化(),由看起来像
C
程序的程序发送的数据的格式化方式不能被
readUTF()
方法正确解释

您可以从套接字的输入流中读取原始字节,并将其转换为
字符串
,例如:

try(InputStream in = socket.getInputStream()){
     byte[] b = new byte[1024];
     String msg = "";
     for(int r;(r = in.read(b,0,b.length))!=-1;){
        msg += new String(b,0,r,"UTF-8");
     }
     System.out.println("Message from the client: " + msg);
}catch (Exception e) {
    e.printStackTrace();
}
将“UTF-8”替换为
C#
程序使用的字符集。

readUTF()
方法要求数据以特定的方式格式化(),通过看起来像
C#
程序发送的数据的格式化方式不能被
readUTF()
方法正确解释

您可以从套接字的输入流中读取原始字节,并将其转换为
字符串
,例如:

try(InputStream in = socket.getInputStream()){
     byte[] b = new byte[1024];
     String msg = "";
     for(int r;(r = in.read(b,0,b.length))!=-1;){
        msg += new String(b,0,r,"UTF-8");
     }
     System.out.println("Message from the client: " + msg);
}catch (Exception e) {
    e.printStackTrace();
}

将“UTF-8”替换为
C#
程序使用的字符集。

好的,我如何修复它。为了使其可读,我应该做些什么更改?是的,客户端是C#,服务器是Java。@Alex我在回答中包含了一个解决方案,这种方法的缺点是,只有在断开连接后才能使用客户端发送的
字符串。如果使用C#的程序是Unity3D和MonoDevelop,它可能不是UTF-8?为什么在客户端断开连接之前我不能使用字符串?@Alex编码取决于系统,用于
循环阻塞直到客户端断开连接,如果你想使用之前收到的字符串,你需要在循环中添加一些逻辑来检查是否收到了所有必要的数据。好的,我如何解决这个问题。为了使其可读,我应该做些什么更改?是的,客户端是C#,服务器是Java。@Alex我在回答中包含了一个解决方案,这种方法的缺点是,只有在断开连接后才能使用客户端发送的
字符串。如果使用C#的程序是Unity3D和MonoDevelop,它可能不是UTF-8?为什么在客户端断开连接之前我不能使用字符串?@Alex编码取决于系统,用于
循环阻塞直到客户端断开连接,如果你想使用之前收到的字符串,你需要在循环中添加一些逻辑来检查是否收到了所有必要的数据。好的,我如何解决这个问题。为了使其可读,我应该做些什么更改?是的,客户端是C#,服务器是Java。@Alex我在回答中包含了一个解决方案,这种方法的缺点是,只有在断开连接后才能使用客户端发送的
字符串。如果使用C#的程序是Unity3D和MonoDevelop,它可能不是UTF-8?为什么我不能在客户端断开连接之前使用字符串?@Alex编码取决于系统,for
循环阻塞直到客户端断开连接,如果你想在之前使用接收到的字符串,你需要在循环中添加一些逻辑来检查是否收到了所有必要的数据。什么“
PrintStream
error”?堆栈跟踪?问题是
readUTF()
只理解
writeUTF()写入的数据。
什么“
PrintStream
error”?堆栈跟踪?问题是
readUTF()
只理解
writeUTF()写入的数据。
什么“
PrintStream
error”?堆栈跟踪?问题是
readUTF()
只理解
writeUTF()编写的数据。