我目前正在开发一个视频传输程序,涉及一个客户端发送器、一个服务器接收器和多个客户端接收器。发送方每 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();
}
我写了clientObjectOutputStream.write(imageBytes);而不是 clientObjectOutputStream.writeObject(imageBytes);
使用 writeObject 之后,它工作得很好。