有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

发送图像时javasocket阻止客户端

所以我在做一个简单的聊天,我以对象的形式发送内容,在这种情况下,我的问题是,当我发送和镜像内容时,它只是阻止了我的客户端!,这是我的简短代码。 我已经将它与下面的代码隔离开来,因为我已经测试了其余的代码,并且工作得很好,我也尝试过调试它,但我似乎找不到问题所在

形象

package com.example.mtc.Packets;

import java.io.Serializable;

public class Image extends Message implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -3188407715959746920L;

    private byte[] content;
    private String type;

    public Image(byte[] content,String type, int sourceID,int destinationID,String sourceUsername) {
        super(destinationID,sourceID,sourceUsername);
        this.content = content;
        this.type = "." + type;
    }

    public byte[] getContent() {
        return content;
    }

    public String getType() {
        return type;
    }

}

ClientReaderThread:

        while (true) {
            try {
                inputData = in.readObject();
                if (inputData.getClass().getName().equals("com.example.mtc.Packets.Image")) {
                    Image imagePacket = (Image) inputData;
                    byte[] imageContent = imagePacket.getContent();
                    ImageIcon imageIcon = new ImageIcon(imageContent);
                    imageIcon.setImage(imageIcon.getImage().getScaledInstance(300, 300, java.awt.Image.SCALE_DEFAULT));
                    if (imagePacket.getDestinationID() == 0) {
                        if (Cliente.selectedChat == 0) {
                            Style style = chatCard.doc.addStyle("StyleName", null);
                            StyleConstants.setIcon(style, imageIcon);
                            chatCard.doc.insertString(chatCard.doc.getLength(), "ignored text\n", style);
                            chatCard.textPane.setCaretPosition(chatCard.textPane.getDocument().getLength());
                            Cliente.gui.revalidate();
                        }
                    } else if (imagePacket.getSourceID() == Cliente.selectedChat
                            || imagePacket.getSourceID() == Cliente.getUserID()) {
                        Style style = chatCard.doc.addStyle("StyleName", null);
                        StyleConstants.setIcon(style, imageIcon);
                        chatCard.doc.insertString(chatCard.doc.getLength(), "ignored text\n", style);
                        chatCard.textPane.setCaretPosition(chatCard.textPane.getDocument().getLength());
                        Cliente.gui.revalidate();
                    }

                }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(Cliente.gui, "Couldn't connect to Server!", "Error",
                        JOptionPane.ERROR_MESSAGE);
                System.exit(1);
            } catch (BadLocationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

服务器侦听器

private void Listener() {
        // TODO Auto-generated method stub
        while (connected) {
            inputData = readObject();
            if (inputData != null) {
                if (inputData.getClass().getName().equals("com.example.mtc.Packets.Image")) {

                    Image imagePacket = (Image) inputData;
                    byte[] imageContent = imagePacket.getContent();
                    ImageIcon imageIcon = new ImageIcon(imageContent);
                    imageIcon.setImage(imageIcon.getImage().getScaledInstance(300, 300,
                            java.awt.Image.SCALE_DEFAULT));

                    imageIcon.getImage().flush();
                    BufferedImage bi = new BufferedImage(
                            imageIcon.getIconWidth(),
                            imageIcon.getIconHeight(),
                            BufferedImage.TYPE_INT_RGB);
                        Graphics g = bi.createGraphics();
                        // paint the Icon to the BufferedImage.
                        imageIcon.paintIcon(null, g, 0,0);
                        g.dispose();

                    try {
                        File imageFile = File.createTempFile("image", imagePacket.getType(),
                                new File("./serverImages/"));
                        insertLog(imageFile.getAbsolutePath(), imagePacket.getDestinationID(), true);
                        new Thread(new Runnable() {

                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
                                try {
                                    Files.write(imageFile.toPath(), imageContent);
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }

                        }).start();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    if (imagePacket.getDestinationID() == 0) {

                        synchronized (Server.Threads) {
                            for (ClientHandler t : Server.Threads) {
                                if (!idExistsInBlockedList(t.getUserID(), userID)) {
                                    t.sendObject(imagePacket);
                                }
                            }
                        }
                    } else {
                        synchronized (Server.Threads) {
                            for (ClientHandler t : Server.Threads) {
                                if (!idExistsInBlockedList(t.getUserID(), userID)) {
                                    if (t.getUserID() == imagePacket.getDestinationID()) {
                                        t.sendObject(imagePacket);
                                    }
                                }
                            }
                            sendObject(imagePacket);
                        }
                    }
                }
            }
        }
    }

共 (1) 个答案

  1. # 1 楼答案

    用勇气解决了这个问题。invokeLater(),如R.L.M所建议