【问题标题】:DataOutputStream write() not working [duplicate]DataOutputStream write()不起作用[重复]
【发布时间】:2023-03-13 02:40:01
【问题描述】:

我有 2 台设备通过 Socket 连接

服务器代码 -(Android 应用):

log("sending song to client - " + clientSocket.getInetAddress().toString());

            InputStream fileInputStream = new FileInputStream(songFile);
            socketDataOutputStream.writeLong(songFile.length());
            Thread.sleep(50);
            byte[] byteBuffer = new byte[16 * 1024];
            int count;
            while ((count = fileInputStream.read(byteBuffer)) > 0) {
                socketDataOutputStream.write(byteBuffer, 0, count);
            }
            log("song sent to client - " + clientSocket.getInetAddress().toString());
            socketOutputStream.flush();
            log("sending a message to client - " + clientSocket.getInetAddress().toString());
            socketDataOutputStream.writeUTF("play");
            log("message sent to client - " + clientSocket.getInetAddress().toString());

客户端代码 -(PC 代码):

OutputStream fos = new FileOutputStream(song);
        InputStream sis = socket.getInputStream();
        DataInputStream dis = new DataInputStream(new BufferedInputStream(sis));
        long size = dis.readLong();
        int count;
        log ("Receiving file");
        while (size > 0 && (count = dis.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) {
            fos.write(buffer, 0, count);
            size = size - count;
        }
        fos.close();
        log ("File received");
        String s;
        while ((s = dis.readUTF()) != null) {
            log(s);
        }

歌曲被成功接收,但之后无法与套接字通信!我尝试了不同的方法 - PrintWriterwrite(bytes[])。什么都没有发生 - 客户端代码没有进入第二个 while 循环。

我不明白我做错了什么。

【问题讨论】:

  • 你关闭socketOutputStream了吗?如果不是,readUTF() 怎么知道你是否要发送更多数据,只是速度很慢?
  • 你能解释一下你的评论吗?
  • 嗯...对不起,我可能是对的,但也可能是错的。服务器不会关闭流,因此不会向客户端发送流结束信号,它只会坐在那里等待更多数据。但是,您从哪里得到readUTF() 会返回null 的想法? javadoc 并没有说这是可能的。它实际上说,流结束将导致EOFException。由于您也不明白,我的第一个观察结果似乎是正确的:该方法正在等待更多数据。
  • 它必须等待更多数据。之前的 songFile 发送成功,客户端也记录了“File Received”,所以之后它读取了更多的数据,服务器正在为其提供更多的数据。有什么问题?
  • @Andreas 他不需要刷新任何东西,除非堆栈中有BufferedOutputStream

标签: java android sockets outputstream


【解决方案1】:
while ((s = dis.readUTF()) != null) {
        log(s);

删除这个。这没有意义。 readUTF() 不返回 null,您不应该只是丢弃输入。

如果这应该接收"play" 命令,您应该将一个 readUTF() 结果存储到String,然后比较它与@987654326 @ 适当地。但是命令是多余的。您可以在收到它后立即播放它,并且您知道那是什么时候。

睡眠实际上是在浪费时间。也删除它。

【讨论】:

  • @andreas 已经解决了这个问题!非常感谢!
  • 他已经解决了一部分问题,并且在您发布的代码中,flush() 的必要性并不明显。上面的循环仍然是错误的,需要按照上面的方法移除或修复,睡眠仍然是浪费时间。
  • 所以我将s = dis.readUTF() 写在while(true) 中,并检查它是否等于“播放”或其他内容。对吗?
  • 没有。读我写的。我说要删除循环,并使用onereadUTF()调用。
  • 如果你要扔掉任何写的东西,你一开始就不需要写它。您插入循环是因为您懒得正确实现您的应用程序协议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
相关资源
最近更新 更多