【问题标题】:DataInputStream printing unknown character from a socketDataInputStream 从套接字打印未知字符
【发布时间】:2020-02-29 00:08:52
【问题描述】:

使用DataInputStream 从套接字读取时,我得到一个未知字符。当我在服务器端发送“Hello”时,输出是“Hello”,未知字符就是问题所在。我是套接字编程的新手,所以我不知道问题可能是什么。我也尝试使用BufferReaderPrintWriter,但是使用readLine() 时服务器不会打印发送的文本,而是java.io.BufferedReader

服务器端:

//BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataInputStream is= new DataInputStream(socket.getInputStream());
String userinput= is.readLine();
System.out.println("Client message: "+userinput);

客户端:

//BufferedReader std= new BufferedReader(new InputStreamReader(System.in));
String userInput;
DataOutputStream out;
while((userInput=std.readLine()) !=null){
    Socket socketClient= new Socket("localhost",5000);
    OutputStream os= socketClient.getOutputStream();
    out=new DataOutputStream(os);
    out.writeUTF(userInput);
    out.flush();
    socketClient.close();
}

【问题讨论】:

  • writeUTF() 不写一行,也不只是写字节。它首先写入一个长度字。请参阅 Javadoc。如果您使用writeUTF() 发送,您必须使用readUTF() 接收。

标签: java printwriter datainputstream inputstreamreader


【解决方案1】:

您在客户端使用writeUTF,您确定服务器端的readLine 与它兼容吗?我以前从未见过,但 javadoc 提到它是"modified" UTF-8 encoding。尝试改用readUTF,或者直接使用常规的write 方法。

【讨论】:

  • 我只需要发送一个可以由多行组成并能够读取的字符串。现在这是我找到的解决方案。正如我所说,我正在尝试使用 BufferReader,但我无法在网上找到一个很好的来源
  • 有更好的方法吗?我需要能够发送一个多行的字符串,以便稍后解析。但是从套接​​字发送和读取数据我不确定什么是更好的解决方案。
  • 好吧,如果你想使用BufferedReaderBufferedInputStream 这很简单,你可以调用这个包装了InputStream 的构造函数:docs.oracle.com/javase/7/docs/api/java/io/…
  • 我去看看。如果我想发送一个字符串,哪个选项最有效?
  • 如果您使用的是缓冲输入流,它应该适合大多数用途。网上有很多这样的例子
【解决方案2】:

如果您读取 UTF 行,则可以写入 UTF 或 ASCII 字符,但与读取 ASCII 字符相反,您必须将这些字符写入 ASCII。 尝试使用out.write(userInput); 而不是out.writeUTF(userInput);

【讨论】:

  • 没有“UTF 行”之类的东西。
  • 我的意思是几个字符而不是由 \n @user207421 分隔的行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
相关资源
最近更新 更多