Я сделал простое приложение в чате в 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();
String header = "IMAGE:" + imageInBytes.length;
out.println(header);
bos.write(imageInBytes);
bos.flush();
} catch(IOException e){
e.printStackTrace();
}
}
< /code>
Сервер получает изображение и отправьте его всем клиентам: < /p>
public void run(){
try {
while (true){
String header = in.readLine();
if (Objects.equals(header, "")) continue;
String[] parts = header.split(":");
String type = parts[0];
int length = Integer.parseInt(parts[1]);
if (type.equals("TEXT")){
char[] messageData = new char[length];
in.read(messageData, 0, length);
for (ClientHandler aClient : clients) {
aClient.sendMessage(messageData, length);
}
} else if (type.equals("IMAGE")){
byte[] imageData = new byte[length];
int bytesRead = 0;
while (bytesRead < length) {
int result = bis.read(imageData, bytesRead, length - bytesRead);
if (result == -1) {
System.out.println("End of stream reached before reading the expected image size");
break;
}
bytesRead += result;
System.out.println(bytesRead);
}
for (ClientHandler aClient : clients) {
aClient.sendImage(imageData, length);
}
}
}
} 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, int length){
try {
String header = "IMAGE:" + length;
out.println(header);
bos.write(imageData);
bos.flush();
System.out.println("Image is send" + Arrays.toString(imageData));
}catch(IOException e){
e.printStackTrace();
}
}
< /code>
Клиент-приема изображения: < /p>
new Thread(() -> {
try{
while(true){
String header = in.readLine();
if (Objects.equals(header, "")) continue;
String[] parts = header.split(":");
String type = parts[0];
int length = Integer.parseInt(parts[1]);
if(type.equals("TEXT")){
char[] messageData = new char[length];
in.read(messageData, 0, length);
SwingUtilities.invokeLater(() -> onMessageReceived.accept(new String(messageData)));
} else if (type.equals("IMAGE")) {
byte[] imageData = new byte[length];
int bytesRead = 0;
while (bytesRead < length){
int result = bis.read(imageData, bytesRead, length - bytesRead);
if (result == -1){
System.out.println("End of stream reached before reading the expected image size");
break;
}
bytesRead += result;
System.out.println(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");
}
}
}
}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