gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:01:59 24 4
gpt4 key购买 nike

我正在创建一个软件,多个客户端可以在“同一” 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com