Не все клиенты получают изображение с сервераJAVA

Программисты JAVA общаются здесь
Anonymous
 Не все клиенты получают изображение с сервера

Сообщение Anonymous »

Я сделал простое приложение в чате в Java. Но когда один из клиентов, отправляющих изображение, не все клиенты получают его. И те, кто не получает его перелом ..
Есть мой код, ответственный за отправку и получение изображений:
Клиент отправляет изображение:
public void sendImage(File selectedFile){
try {
BufferedImage image = ImageIO.read(selectedFile);
OutputStream outputStream = socket.getOutputStream();

// Write image into ByteArrayOutputStream to get it size
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
baos.flush();
byte[] imageInBytes = baos.toByteArray();
baos.close();

out.println("Image:" + imageInBytes.length);
ImageIO.write(image, "png", outputStream);
} catch(IOException e){
e.printStackTrace();
}
< /code>
Сервер получает изображение и отправьте его всем клиентам: < /p>
public class ClientHandler implements Runnable{

...

public ClientHandler(Socket socket, List clients) throws IOException{
this.clientSocket = socket;
this.clients = clients;
this.out = new PrintWriter(clientSocket.getOutputStream(), true); // print messages from socket to client
this.in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); // read messages from client to socket
this.is = socket.getInputStream();
this.bis = new BufferedInputStream(is);
this.bos = new BufferedOutputStream(socket.getOutputStream());
this.baos = new ByteArrayOutputStream();

}

public void run(){
try {
String inputLine;
while ((inputLine = in.readLine()) != null) {
if(inputLine.startsWith("Image")){
for(ClientHandler aClient: clients){
aClient.sendImage();
}
}else {
// Broadcast message to all clients
for (ClientHandler aClient : clients) {
aClient.out.println(inputLine);
}
}
}
} catch (IOException | NumberFormatException e) {
System.out.println("Error processing image: " + e.getMessage());
} finally {
try{
in.close();
out.close();
bis.close();
bos.close();
clientSocket.close();
} catch (IOException e){
e.printStackTrace();
}
}

}

private void sendImage(){
try {
InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();
BufferedImage image = ImageIO.read(inputStream);

if(image == null){
System.out.println("Image is null");
return;
}
System.out.println("Image is not null!");

// Write image into ByteArrayOutputStream to get it size
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
baos.flush();
byte[] imageInBytes = baos.toByteArray();
baos.close();

out.println("Image:" + imageInBytes.length);
ImageIO.write(image, "png", outputStream);
System.out.println("Image is send to the client");

}catch(IOException e){
e.printStackTrace();
}
}
}
< /code>
Прием клиента изображение: < /p>
public void startClient(){
new Thread(() -> {
try{
String line;
while ((line = in.readLine()) != null){
if(line.startsWith("Image")){
System.out.println("Anus");
InputStream inputStream = socket.getInputStream();
System.out.println("Stream activated");
BufferedImage image = ImageIO.read(inputStream);
System.out.println("Image received");
if (image != null) {
SwingUtilities.invokeLater(() -> {
onImageReceived.accept(image);
});
}else{
System.out.println("Image is null");
return;
}
}else {
String finalLine = line;
SwingUtilities.invokeLater(() -> {
onMessageReceived.accept(finalLine);
});
}
}
}catch(IOException | NumberFormatException e) {
e.printStackTrace();
}
}).start();
}
< /code>
вставьте изображение в графический интерфейс: < /p>
private void onImageReceived(BufferedImage image){
try {
ImageIcon icon = new ImageIcon(image);
JLabel imageLabel = new JLabel(icon);

messageArea.insertComponent(imageLabel);
doc.insertString(doc.getLength(), "\n", null);
messageArea.setCaretPosition(doc.getLength());
System.out.println("Image displayed in chat GUI");

} catch (BadLocationException ex) {
throw new RuntimeException(ex);
}
}
< /code>
Я думаю, что потоки сокетов перегружены, поэтому изображения не доставляются. В какой -то момент программа может даже начать выводить кучу байтов в виде текста вместо изображения.
Но я не знаю, как его исправить.

Подробнее здесь: https://stackoverflow.com/questions/794 ... the-server

Вернуться в «JAVA»