所以我设置了一个基本的客户端/服务器连接,我试图在连接时向另一个发送消息,我让客户端从服务器接收消息,但是服务器没有收到客户端消息。这是我当前用于从客户端读取已发送数据的代码:
ServerThread.socket = new ServerSocket(5556);
Socket client = ServerThread.socket.accept();
DataInputStream in = new DataInputStream
(
new BufferedInputStream(client.getInputStream())
);
String s = in.readUTF();
System.out.println("Client: " + s);
使用它不打印任何东西,甚至不只是'客户端:'
这是我的客户端连接代码,并发送消息。注意:我在VB中写了这个部分:
client = New TcpClient()
client.Connect("myiphere", 5556)
Dim stream As NetworkStream = client.GetStream()
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Hello server")
stream.Write(sendBytes, 0, sendBytes.Length)
有没有理由没有收到数据?或者为什么会被推迟?我尝试使用try catch块来代替代码的Java部分,但是没有发出错误。
任何帮助将不胜感激。
答案 0 :(得分:0)
DataInputStream中的UTF 前置,其长度为0。
<击> 我没有用VB做太多,所以我不知道是否还有其他错误,但请尝试:
stream.Write(0, sendBytes.Length, sendBytes)
击> <击> 撞击>
我不应该用我不知道的语言建议代码。如果你想用readUTF读取它,你必须在发送文本字节之前发送一个0
字节和一个等于字符串长度的字节。
编辑: 但是你可能根本不想使用DataInputStream。它用于存储二进制流。如果您正在接收文本,请在Java端尝试:
BufferedReader in = new BufferedReader(
new InputStreamReader(
client.getInputStream()
)
);
String s = in.readLine();
如果你没有发送文本,只需像你一样创建一个BufferedInputStream并读取它的字节。
答案 1 :(得分:0)
也许WeCouldStealAVan指出,readUTF
期望两个字节表示有多少字节的内容。有关详细信息,请参阅http://docs.oracle.com/javase/6/docs/api/java/io/DataInput.html#readUTF()。
然而,他/她使用InputStreamReader
的解决方案不起作用,因为InputStreamReader
期望输入UTF-16(每个字符两个字节),但是您的VB客户端正在发送ascii。如果可以的话,我建议让你的VB客户端发送UTF-16(然后使用maybeWeCouldStealAVan的java代码)。如果你不能这样做(对不起,我不知道VB允许的编码),那么只需写下使readUTF
工作所需的额外两个字节。