ObjectOutputStream 停止工作且没有错误消息

问题描述 投票:0回答:1

我目前正在开发一个视频传输程序,涉及一个客户端发送器、一个服务器接收器和多个客户端接收器。发送方每 75 毫秒向服务器发送一次视频帧,然后服务器将这些帧广播给一组客户端接收方。

我遇到的问题是,在大约 4 或 5 次迭代之后,服务器停止向客户端广播帧,即使它继续从发送方接收帧而没有任何错误。任何帮助或建议将不胜感激。

这是发件人代码:

public void sendImageToServer(BufferedImage screenshot) {
    try {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ImageIO.write(screenshot, "jpeg", byteArrayOutputStream);           
        byte[] imageBytes = byteArrayOutputStream.toByteArray();

        objectOutputVideoStream.writeObject(imageBytes);
        objectOutputVideoStream.flush();
        System.out.println("Frame sent");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是服务器代码:

private ExecutorService pool = Executors.newCachedThreadPool();

    public void receiveAndBroadcastVideo(Socket socket, int roomId) {
        try {
            InputStream inputStream = socket.getInputStream();
            ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
            while (true) {
                byte[] imageBytes = (byte[]) objectInputStream.readObject();
                System.out.println("Frame ricevuto");
                List<UserWithSocket> roomClients = videoChatRoomClients.get(roomId);
                for (UserWithSocket client : roomClients) {
                    if(client.getUserSocket()!=socket) {
                        pool.submit(() -> {
                            try {
                                ObjectOutputStream clientObjectOutputStream = client.getClientObjectOutputStream();
                                synchronized (clientObjectOutputStream) {
                                    clientObjectOutputStream.write(imageBytes);
                                    clientObjectOutputStream.flush();
                                }
                                System.out.println("Frame Broadcasted");
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        });
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这就是我创建 ObjectOutputStream 的地方:

public class UserWithSocket {

    private int id;
    private Socket userSocket;
    private ObjectOutputStream clientObjectOutputStream;

    public UserWithSocket(int id, Socket userSocket) {
        super();
        this.id = id;
        this.userSocket = userSocket;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Socket getUserSocket() {
        return userSocket;
    }

    public void setUserSocket(Socket userSocket) {
        this.userSocket = userSocket;
    }

    public void createStream() {
        try {
            OutputStream outputStream = userSocket.getOutputStream();
            clientObjectOutputStream = new ObjectOutputStream(outputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public ObjectOutputStream getClientObjectOutputStream() {
        return clientObjectOutputStream;
    }

    public void setClientObjectOutputStream(ObjectOutputStream clientObjectOutputStream) {
        this.clientObjectOutputStream = clientObjectOutputStream;
    }
    
    
}

由于我没有收到任何类型的错误,这可能是死锁情况,我只知道经过 4 或 5 次迭代后,这部分代码将不会运行:

synchronized (clientObjectOutputStream) {
    clientObjectOutputStream.write(imageBytes);
    clientObjectOutputStream.flush();
}
java sockets synchronization threadpool objectoutputstream
1个回答
0
投票

我写了clientObjectOutputStream.write(imageBytes);而不是 clientObjectOutputStream.writeObject(imageBytes);

使用 writeObject 之后,它工作得很好。

© www.soinside.com 2019 - 2024. All rights reserved.