在简单的聊天程序中,服务器发送字符串的Arraylist,但客户端接收旧值

高拉夫

我想用服务器和多个客户端创建一个简单的游戏。服务器将具有多个Hashmap和Arraylist。服务器将广播这些值给客户端,然后客户端可以逐个修改它们并发送回服务器,然后服务器会将更新后的值广播给所有客户端。

首先,我创建了服务器-客户端聊天应用程序。当客户端向服务器发送String消息时,Server会将该String消息添加到其Arraylist中,并将该arraylist广播给所有客户端。我使用了线程,以便多个客户端可以同时发送消息,但是我还没有应用线程安全。

让我们来解决问题。客户端第一次将String发送到服务器时,服务器会很好地打印它,添加到它的arraylist中,然后将其广播给所有客户端,所有客户端也可以看到。但是下一次客户端发送String消息时,服务器接受它,将其添加到arraylist并广播它,但是这一次所有客户端都获得旧的arraylist(仅添加了一个String的列表被首先添加)。我在广播之前已经打印了arraylist,它显示了修改后的值,但是在客户端,它仅显示了一个条目的列表。

服务器代码的一部分

public class ServerGUI extends javax.swing.JFrame {

public static final int SERVER_PORT = 4000;
private ServerSocket ss;
ArrayList<String> al;
ArrayList<ClientHandler> clients;

public ServerGUI() {
    initComponents();
    setVisible(true);
    al = new ArrayList<>();
    clients = new ArrayList<>();
    initNet();
}

private void initNet() {
    Socket ds = null;
    try {
        ss = new ServerSocket(SERVER_PORT, 1);
        while (true) {

            ds = ss.accept();

            clients.add(new ClientHandler(ds));
        }
    } catch (Exception e) {

        System.out.println("shutting down server......");
    }
}

class ClientHandler extends Thread {

    private Socket ds;
    private ObjectOutputStream out;
    private ObjectInputStream in;

    public ClientHandler(Socket ds) throws Exception {
        this.ds = ds;
        out = new ObjectOutputStream(ds.getOutputStream());
        in = new ObjectInputStream(ds.getInputStream());
        start();
    }

    public ObjectOutputStream getOut() {
        return out;
    }

    public void run() {
        try {
            while (true) {
                acceptData(in);
                broadcastData();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("Finally called. socket closed");
            if (ds != null) {
                try {
                    ds.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

private void acceptData(ObjectInputStream in) throws Exception {
    System.out.println("acceptData called by " + Thread.currentThread().getName());
    String s = (String) in.readObject();
    al.add(s);
    jta.setText(al.toString());
}

private void broadcastData() throws Exception {
    System.out.println("broadcast called by " + Thread.currentThread().getName());
    System.out.println("al is : \n" + al);

    for (ClientHandler clnt : clients) {
        clnt.getOut().writeObject(al);
        clnt.getOut().flush();
    }
}

客户代码的一部分

public class ClientGUI extends javax.swing.JFrame {

public static final int SERVER_PORT = 4000;
public static final String SERVER_IP = "127.0.0.1";
private Socket s1;
private ObjectOutputStream out;
private ObjectInputStream in;
private ArrayList<String> al;

public ClientGUI() {
    initComponents();
    setVisible(true);
    initNet();
}

private void initNet() {
    try {
        s1 = new Socket(SERVER_IP, SERVER_PORT);
        out = new ObjectOutputStream(s1.getOutputStream());            
        in = new ObjectInputStream(s1.getInputStream());
        System.out.println("connected to server");

        new ReadData();

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

class ReadData extends Thread {

    public ReadData() {
        start();
    }

    public void run() {
        System.out.println("client thread started");
        try {
            while (true) {
                al = (ArrayList<String>) in.readObject();
                System.out.println("client read completed, al is "+al);

                jta.setText(al.toString());                    
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
private void textFieldActionPerformed(java.awt.event.ActionEvent evt) {                                    
    try {
        out.writeObject(jtf.getText());
        out.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
JB Nizet

这是正常现象。如果您多次将同一个对象(您的ArrayList)发送到给定对象ObjectOutputStream,则流将在第一次发送完整的对象,而在下一次仅发送对该对象的引用。这样一来,就可以发送对象图而不会占用太多带宽,也不会陷入无限循环,因为a引用b也引用a

为了确保ArrayList中发送第二次,你需要调用reset()ObjectOutputStream

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

客户端/服务器聊天,发送在线用户列表,仅由最近连接的客户端接收?

来自分类Dev

如何从客户端接收整数和字符串的缓冲区,并正确存储它们?(cpp 服务器,python 客户端)

来自分类Dev

简单的rpyc客户端和服务器,用于发送字符串数据

来自分类Dev

Java,聊天,服务器发送,客户端接收正常,但没有其他方式。YouTube上的视频以观看问题

来自分类Dev

测量udp服务器发送的数据与客户端接收的数据之间的延迟

来自分类Dev

使用WiFi Direct在客户端和服务器端发送和接收字符串

来自分类Dev

从Android客户端向Python服务器发送字符串时的多余字符

来自分类Dev

在服务器端接收支付宝移动支付的请求字符串

来自分类Dev

如何在onc-rpc中从服务器向客户端发送字符串(char *)

来自分类Dev

如何使用Java中的套接字从服务器向特定客户端发送字符串消息?

来自分类Dev

在客户端和服务器之间发送字符串时出错

来自分类Dev

Java客户端/服务器发送或获取int或字符串类型

来自分类Dev

从客户端向服务器发送字符串,然后保存文件(使用C)

来自分类Dev

PHP-C#TCP客户端/服务器如何发送字符串?

来自分类Dev

从客户端向服务器Python发送字符串消息

来自分类Dev

将字符串消息从Netty客户端发送到服务器

来自分类Dev

高速公路扭曲的Websocket服务器不会向客户端发送消息,除非它从客户端接收到消息

来自分类Dev

当服务器具有标签<head> </ head>时,询问服务器发送json和客户端接收器以使进程[php]无法工作吗?

来自分类Dev

服务器/客户端应用程序和JSONDecodeError:字符串python终止

来自分类Dev

Android中的多线程服务器套接字,可从连接的客户端接收图像-不起作用

来自分类Dev

TCP套接字服务器如何判断从客户端接收到的数据何时完成?

来自分类Dev

客户端接收到的从服务器返回的字节数组不同

来自分类Dev

TLS服务器未从客户端接收证书,无法终止握手

来自分类Dev

python多线程服务器无法从客户端接收数据

来自分类Dev

C ++套接字服务器从Java客户端接收味精,但不是

来自分类Dev

C ++ IP服务器套接字始终从PHP套接字客户端接收“ 0100000001000000”

来自分类Dev

nginx如何从客户端接收请求并将其转发到实际服务器?

来自分类Dev

为什么我的Android客户端无法从Winsock C ++服务器接收字符串消息?

来自分类Dev

Java网络客户端-服务器(文件固定),卡在客户端接收循环中

Related 相关文章

  1. 1

    客户端/服务器聊天,发送在线用户列表,仅由最近连接的客户端接收?

  2. 2

    如何从客户端接收整数和字符串的缓冲区,并正确存储它们?(cpp 服务器,python 客户端)

  3. 3

    简单的rpyc客户端和服务器,用于发送字符串数据

  4. 4

    Java,聊天,服务器发送,客户端接收正常,但没有其他方式。YouTube上的视频以观看问题

  5. 5

    测量udp服务器发送的数据与客户端接收的数据之间的延迟

  6. 6

    使用WiFi Direct在客户端和服务器端发送和接收字符串

  7. 7

    从Android客户端向Python服务器发送字符串时的多余字符

  8. 8

    在服务器端接收支付宝移动支付的请求字符串

  9. 9

    如何在onc-rpc中从服务器向客户端发送字符串(char *)

  10. 10

    如何使用Java中的套接字从服务器向特定客户端发送字符串消息?

  11. 11

    在客户端和服务器之间发送字符串时出错

  12. 12

    Java客户端/服务器发送或获取int或字符串类型

  13. 13

    从客户端向服务器发送字符串,然后保存文件(使用C)

  14. 14

    PHP-C#TCP客户端/服务器如何发送字符串?

  15. 15

    从客户端向服务器Python发送字符串消息

  16. 16

    将字符串消息从Netty客户端发送到服务器

  17. 17

    高速公路扭曲的Websocket服务器不会向客户端发送消息,除非它从客户端接收到消息

  18. 18

    当服务器具有标签<head> </ head>时,询问服务器发送json和客户端接收器以使进程[php]无法工作吗?

  19. 19

    服务器/客户端应用程序和JSONDecodeError:字符串python终止

  20. 20

    Android中的多线程服务器套接字,可从连接的客户端接收图像-不起作用

  21. 21

    TCP套接字服务器如何判断从客户端接收到的数据何时完成?

  22. 22

    客户端接收到的从服务器返回的字节数组不同

  23. 23

    TLS服务器未从客户端接收证书,无法终止握手

  24. 24

    python多线程服务器无法从客户端接收数据

  25. 25

    C ++套接字服务器从Java客户端接收味精,但不是

  26. 26

    C ++ IP服务器套接字始终从PHP套接字客户端接收“ 0100000001000000”

  27. 27

    nginx如何从客户端接收请求并将其转发到实际服务器?

  28. 28

    为什么我的Android客户端无法从Winsock C ++服务器接收字符串消息?

  29. 29

    Java网络客户端-服务器(文件固定),卡在客户端接收循环中

热门标签

归档