Trying to write video chat in Java using UDP. The fact is that when transferring frames from clients to the server and back, the server does not seem to cope, and, as a result, everything lags very strongly. Client code where the snapshot is taken:

while (true) { img = webcam.getImageFromWebcam(); labelList.get(0).setIcon(new ImageIcon(img)); try { sendDataThread(Utility.transformBufferedImageToBytes(img, userId)); Thread.sleep(10); } catch (IOException e) { JOptionPane.showMessageDialog(null, e); } catch (InterruptedException e) { e.printStackTrace(); } } 

sendDataThread method:

 void sendDataThread(final byte[] sendingData) { new Thread(new Runnable() { public void run() { try { udpSocket.sendData(sendingData); } catch (IOException e) { e.printStackTrace(); } } }).start(); } 

Methods of sending from the client:

  private DatagramPacket formPacket(byte[] data) { return new DatagramPacket(data, data.length, ipAddress, serverPort); } public void sendData(byte[] sendingData) throws IOException { clientSocket.send(formPacket(sendingData)); } 

Server UDP code:

 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.ArrayList; public class UDPWork { public static ArrayList<Integer> clientPortList; private DatagramSocket serverSocket; private byte[] buffer; private final int BUFFER_SIZE = 15000; private InetAddress ipAddress; void sendToClientsThread(byte[] data, int port) { new Thread(new Runnable() { @Override public void run() { try { sendToAnotherClients(data, port); } catch (IOException e) { e.printStackTrace(); } } }).start(); } public UDPWork(int port, String ipAddress) throws SocketException, UnknownHostException { serverSocket = new DatagramSocket(port); this.ipAddress = InetAddress.getByName(Utility.changeLastParameterIP(ipAddress)); clientPortList = new ArrayList<Integer>(); } public void startListening() throws IOException { new Thread(new Runnable() { @Override public void run() { try { listenClients(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void listenClients() throws IOException { buffer = new byte[BUFFER_SIZE]; while (true) { DatagramPacket receivePacket = defineReceivePacket(buffer); sendToClientsThread(receiveData(receivePacket), receivePacket.getPort()); } } public void sendData(byte[] data, int port) throws IOException { DatagramPacket sendPacket = new DatagramPacket(data, data.length, ipAddress, port); serverSocket.send(sendPacket); } private void sendToAnotherClients(byte[] data, int port) throws IOException { for (int clientPort : clientPortList) { if (clientPort != port) { sendData(data, clientPort); } } } private DatagramPacket defineReceivePacket(byte[] buffer) { return new DatagramPacket(buffer, buffer.length); } private byte[] receiveData(DatagramPacket receivePacket) throws IOException { serverSocket.receive(receivePacket); return receivePacket.getData(); } } 

I don’t understand how to improve the server’s performance so that 13kb frames are transmitted faster. Thanks for the help.

  • Are you sure that you need to create and start a new Thread for each shipment? They say it is quite a costly operation. Look toward the Executor . - zRrr
  • @zRrr, and you do not tell me how to implement it correctly? The dead time is already sitting .. - mrblamber

0