0

所以我已经建立了一个基本的客户端/服务器连接,我试图在连接时互相发送一条消息,我让客户端从服务器接收消息,但服务器没有收到客户端消息。这是我当前用于从客户端读取发送数据的代码:

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 部分,但没有发出错误。

任何帮助将不胜感激。

4

2 回答 2

0

正如 MaybeWeCouldStealAVan 指出的那样,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

于 2012-04-21T03:56:00.033 回答
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 并从中读取字节。

于 2012-04-21T03:08:10.853 回答