我有一个多线程程序java java socket,我收到了bizare的信息。 像这样 ¤¤¤¤¤¤23456718900263678722¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
public void run()
{
try {
byte[] bs = new byte[64];
// read data into buffer
dataReception.read(bs);
// for each byte in the buffer
for (byte b:bs)
{
// convert byte into character
char c = (char)b;
// print the character
System.out.print(c);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 0 :(得分:3)
问题在于:
// read data into buffer
dataReception.read(bs);
Read并不能准确读取您希望在该数组中拥有的字节数。它可以读取任何个字节数。因此,您始终必须检查读取操作的返回值;并且只有当读取了所有预期的字节时......你应该继续!
您的输出看起来像垃圾的原因是不您将接收特殊字符。
会发生什么:
这可以通过在读取之前打印阵列来验证。您将看到只包含那些“特殊”字符。
答案 1 :(得分:1)
如果您预计恰好有64个byes,请使用readFully()
代替read(),
或至少注意其返回值。
答案 2 :(得分:0)
尝试:
public void run()
{
try {
byte[] bs = new byte[64];
// read data into buffer
int readed = dataReception.read(bs);
// for each byte in the buffer
for (int n=0; n<readed;n++)
{
byte b=bs[n];
// convert byte into character
char c = (char)b;
// print the character
System.out.print(c);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 3 :(得分:0)
DataInputStream通常在需要通过套接字共享文本信息时使用。如果从另一端使用DataOutputStream.writeUTF(String str)发送传输的数据,请使用DataInputStream.readUTF()方法。在发送实际数据之前,DataInputStream和DataOutputStream发送两个字节(无符号)长度的数据。
final String data = din.readUTF();