Java服务器Socket,从DataInputStream读取内容

时间:2012-04-21 02:32:08

标签: java vb.net sockets

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

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

任何帮助将不胜感激。

2 个答案:

答案 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工作所需的额外两个字节。