我有一个小的TCP服务器程序和一个相应的客户端,它们通过ServerSocket和Socket类以及DataInputStream / DataOutputStream进行通信 . 我将字符串发送到服务器时遇到问题 .
connection = new Socket("localhost", 2233);
outStream = new DataOutputStream(connection.getOutputStream());
outStream.writeBytes(fileName);
此时,fileName是一个硬编码的字符串,其值为“listener.jardesc” . 服务器使用以下代码读取字符串:
inStream = new DataInputStream(connection.getInputStream());
String fileName = inStream.readLine();
正确接收字符串,但最后添加了三个零值字节 . 为什么这样,我怎么能阻止它发生? (当然,我可以修剪收到的字符串或以某种方式阻止这个问题,但我宁愿完全防止这个问题)
2 回答
我只是想把它扔出去 . 您正在使用已在Java 5,6和7中弃用的readLine()方法.API文档非常清楚地表明此方法“无法正确地将字节转换为字符” . 我会把它读作字节或使用缓冲读卡器 .
http://docs.oracle.com/javase/1.5.0/docs/api/java/io/DataInputStream.html#readLine%28%29
writeBytes()不会添加额外的字节 .
您编写的代码无效,因为您没有编写换行符 . 因此它不起作用,并在readLine()中永远阻塞 .
在尝试调试时,您似乎已经以其他方式读取了字节,可能使用read();并且忽略了read返回的返回值,并得出结论read()填充了你提供的缓冲区,当它没有时,将三个字节保留在它们的初始状态,即零 .