java - DataOutputStream 卡住

标签 java sockets dataoutputstream

我制作了一个简单的服务器应用程序,用于将图像发送到连接的客户端。我在主线程中有一个循环,它接受传入的连接,并从相应的套接字创建一个 Client 对象。我有一份活跃客户名单。每次有新图片可用时,我都会遍历客户端,并向他们发送新数据。如果每个人都保持联系,一切都会顺利进行。但是一旦其中一个客户端断开连接,DataOutputStream 的 write 方法将永远卡住。我认为它必须抛出异常或其他东西,但事实并非如此。我想我错过了一些简单的东西,但我找不到什么。 这是我的 Client 类的代码:

package hu.rothens.webcam;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class Client {

    private static int next_id = 0;
    private int id;
    private Socket socket;
    private WebcamServer ws;
    private DataOutputStream dos;

    public Client(Socket socket, WebcamServer ws, int width, int height) throws IOException {
        this.socket = socket;
        this.ws = ws;
        id = next_id++;
        while (!socket.isConnected());
        dos = new DataOutputStream(socket.getOutputStream());
        dos.writeInt(width);
        dos.writeInt(height);
    }

    public synchronized void sendImage(byte[] array) {
        try {
            System.out.println(id);
            //the code will stuck somewhere after this line
            dos.writeByte(0xFF);
            dos.flush();
            dos.writeInt(array.length);
            dos.write(array);
            dos.flush();
        } catch (IOException e) {
            System.out.println(e); //it won't get here
            ws.removeClient(this);
            try {
                socket.close();
            } catch (Exception ex) {
            }
        }    
    }
}

最佳答案

它不会永远阻塞。它最终会抛出 IOException: 'connection Reset' 。 “永远”意味着你陷入了僵局。

'while (!socket.isConnected());'循环是完全没有意义的:套接字已连接,因为已被接受。如果不是,则无法处理。

写入 0xff 后不应刷新流,但应在 Client 的构造函数中刷新它。

如果客户端在自己的线程上运行,那么我没有看到任何同步的原因,这应该是。

您应该同时而不是迭代地发送给所有客户端,以便它们同时得到服务,并且其中一个客户端的错误或缓慢不会影响其他客户端。

关于java - DataOutputStream 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21417101/

相关文章:

java - DataInputStream readLong() 得到错误的值

Java 打印基于位置

java - 如何使无效数字不添加到我的最终计算和计数器总计中?

javascript - Socket.io:如何让每个人获得不同的 channel ?

c# - .net 中的 java 的 ServerSocket

javascript - Socket.io 和 Node.js 无法在 Heroku 上运行

java - 我无法在 java 中修改我的静态变量

java - 为什么在java中不允许将子类对象的子类集合转换为其父类(super class)对象的父类(super class)集合?

java - jTextArea 使用 BufferedReader 仅保存文本文件中的第一行文本?

java - 在 Java 中通过 DataOutputStream 发送多个 POST 请求