java - 在无限循环中设置 writeObject,以将数据发送到服务器

标签 java

我正在创建一个软件,多个客户端可以在“同一” Canvas 上绘图。这是通过将绘制点的 ArrayList 发送到服务器并返回来完成的。现在,我已经设置了 ListArray,但我需要它不断更新,以便服务器始终拥有最新信息。

客户端代码:

public class TCPClient extends JPanel {

    public static ArrayList<Point> location = new ArrayList<>();

    private JTextArea consoleOutput = new JTextArea(1,20);

    public void addComponentToPane(Container pane) {
        consoleOutput.setEditable(false);
    }

    public TCPClient() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                location.add(e.getPoint());
            }
        });

        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                location.add(e.getPoint());
                repaint();
            }
        });
        setPreferredSize(new Dimension(800, 500));
        setBackground(Color.WHITE);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        if(location.isEmpty()){
            return;
        }

         Point p = location.get(0);
         for (int i = 1; i < location.size(); i++) {
             Point q = location.get(i);
             g.drawLine(p.x, p.y, q.x, q.y);
             p = q;
         }
    }

    public static void main(String argv[])  throws Exception {

        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        Socket clientSocket = new Socket("localhost", 9000);
        ObjectOutputStream outToServer = new ObjectOutputStream(clientSocket.getOutputStream());

        InetAddress SERVERIP = InetAddress.getLocalHost();

        JFrame frame = new JFrame("Drawing with friends");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new CanvasFrame(), BorderLayout.CENTER);

        JTextArea IPadress = new JTextArea(1,20);
        IPadress.setEditable(false);
        IPadress.append("DEVICE IP: " + SERVERIP.getHostAddress());
        frame.add(IPadress, BorderLayout.SOUTH);

        frame.setSize(new Dimension(800,600));
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true);

        ObjectInputStream inFromServer = new ObjectInputStream(clientSocket.getInputStream());

        outToServer.writeObject(location);

        clientSocket.close();

    }
}

如您所见,所有与客户端/服务器相关的内容都在我的主线程中。我尝试将 writeObject 方法放入主线程内的 while 循环中,但没有结果。 后来我尝试创建一个新的 run() 函数,但这似乎也弄乱了我的输入和输出流。

澄清:我需要 outToServer.writeObject(location);重复发送。

最佳答案

很难说出你在说什么,但如果你不断发送相同的对象,你需要使用 ObjectOutputStream.writeUnshared()ObjectOutputStream.reset()确保发送新的值,或者更简单地说,每次创建一个新对象,而不是重新发送相同的对象。

关于java - 在无限循环中设置 writeObject,以将数据发送到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36737201/

相关文章:

java - Spring Fox Swagger - 有没有办法为不属于项目的 API 添加文档

java - 如何编写jPOS服务

java - AspectJ:一个方面内多个通知的执行顺序(优先级)

java - 在 Gradle 中声明对 war 文件的依赖

java - 无法从数组中随机搜索项目

java - 每次单击按钮时如何将值写入不同的文本字段?

java - 使用 java 的 MVC - 返回 NULL

java - 如何从池或堆中查找字符串

java - Cloud Speech API 返回代码=UNAUTHENTICATED,原因=java.io.IOException : Error getting access token for service account:

java - 如何通过 mongodb 模板在 Java 中使用 $redact 和聚合