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

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

Сообщение Anonymous »

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

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

out.println("Image:" + imageInBytes.length);
bos.write(imageInBytes);
bos.flush();

} catch(IOException e){
e.printStackTrace();
}

}
< /code>
Сервер получает изображение и отправьте его всем клиентам: < /p>
public void run(){
try {
String inputLine;
while ((inputLine = in.readLine()) != null) {
if(inputLine.startsWith("Image")){

int imageSize = Integer.parseInt(inputLine.split(":")[1]);

byte[] imageData = new byte[imageSize];
int bytesRead = 0;
while(bytesRead < imageSize){
bytesRead += bis.read(imageData, bytesRead, imageSize - bytesRead);
}
for(ClientHandler aClient: clients){
aClient.sendImage(imageData);
}
}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(byte[] imageData){
try {
out.println("Image:" + imageData.length);

bos.write(imageData);
bos.flush();
}catch(IOException e){
e.printStackTrace();
}
}
}
< /code>
Клиент-приема изображения: < /p>
new Thread(() -> {
try{
String line;
while ((line = in.readLine()) != null){
if(line.startsWith("Image")){
int imageSize = Integer.parseInt(line.split(":")[1]);

byte[] imageData = new byte[imageSize];
int bytesRead = 0;
while(bytesRead < imageSize){
bytesRead += bis.read(imageData, bytesRead, imageSize - bytesRead);
}

ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
BufferedImage image = ImageIO.read(bais);

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>
Я думаю, что потоки сокетов перегружены, поэтому изображения не доставляются. В какой -то момент программа может даже начать выводить кучу байтов в виде текста вместо изображения. Получает изображение: < /p>
while(bytesRead < imageSize){
bytesRead += bis.read(imageData, bytesRead, imageSize - bytesRead);
}
< /code>
Для некоторых клиентов, когда цикл никогда не заканчивается, а изображение никогда не появляется. Но для других клиентов петля успешно заканчивается, и клиент получает изображение.


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

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