【问题标题】:Java sockets are not reading dataJava 套接字不读取数据
【发布时间】:2019-06-06 17:17:42
【问题描述】:

我正在编写服务器 (Java) - 客户端 (Android/Java) 应用程序。服务器是W7。所有的通信都很顺利,直到客户端中的一次读取冻结并停止读取数据,直到我再发送 2 次。

未读取的数据是字节数组。我再说一遍,到目前为止,所有的沟通都很顺利。

这是我用来发送数据的代码:

Long lLength = new Long(length);
byte [] bLength = this.longToBytes(lLength.longValue());
dos.write(bLength);
dos.flush();

dos.write(bLength);
dos.flush();

dos.write(bLength);
dos.flush();

此代码将 long 值转换为 8 字节数组。正如我所说,当执行第一次写入时(并且客户端正在等待数据),读取还没有完成。直到我执行最后一个 write() 才完成。

这是阅读它的代码:

byte length[] = {0,0,0,0,0,0,0,0};
dis.read(length);

我使用Wireshark嗅探流量,可以看到字节数组已发送,客户端回复ACK,但读取未完成。

在客户端和服务器中,套接字设置如下:

socket = new Socket(sIP, oiPort.intValue());
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());

这快把我逼疯了……我不知道为什么,当我以与往常一样的方式发送数据时,应用程序有时会停止读取数据。

我想问题可能出在客户端套接字的输入缓冲区中……但我不知道该怎么做或尝试什么……

假设我也在 WXPSP3 中测试过服务器,但它仍然无法正常工作。

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    我首先要看的是longToBytes 方法的代码。它真的是在创建一个 8 字节的字节数组吗?如果它正在生成一个小于 8 字节的数组,那么这就解释了这个问题。 (您的客户端需要 8 个字节,并且会阻塞直到它们全部到达。)

    接下来我要问自己为什么我不只是使用writeLongreadLong。它会简化您的代码,并且很有可能解决问题。

    【讨论】:

    • 你好,斯蒂芬。你说的我都查过了。使用 Wireshark,我可以看到发送了 8 个字节。而且我不使用 writeLong,因为在写入时,客户端没有读取数据。 (起初它是一个 writeLong)。
    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2014-06-07
    相关资源
    最近更新 更多