【问题标题】:server socket multithreading confuses with the devices服务器套接字多线程与设备混淆
【发布时间】:2014-10-01 20:11:05
【问题描述】:

我正在编写一个使用套接字进行通信的 Android 应用程序。在一个名为 sever 的类中,我接受客户端(Android 设备)并为它们打开套接字。

服务器端:

public void run() {
    while (!Thread.currentThread().isInterrupted()) {

        try {
            Socket socket = serverSocket.accept();

            Client clientThread = new Client(socket);
            System.out.println("New client: " + clientThread.getName());
            new Thread(clientThread).start();

        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

连接成功后,用户可以创建一个group,这就像一个房间,可供多个客户端连接和一起玩。

组创建在这里完成:

服务器端:

客户:

private void client_create() {
    this.mGroup = new Group();
    mGroup.joinPlayer(this);
    System.out.println("New group for: " + name);
}

组:

public Group(int nClients){
    // Clients in this group
    this.clients = new ArrayList<Client>();
}

public void joinPlayer(Client player){
    clients.add(player);
}

客户端:

连接处理:

try {
            socket = new Socket(hostName, portNumber);

            out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())), true);

            in = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));

            Listener listener = new Listener();
            new Thread(listener).start();

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

我在 2 台 android 设备上运行这个程序,并在我的 localhost 作为服务器。建立连接后,我尝试创建 2 个独立的不同组。在调试时,这一切似乎都是合法的,直到我因为 2 个不同的运行线程而丢失它。

奇怪的是,在第一个组创建了第一个客户端之后(clients 包含第一个设备客户端对象),然后第二个组使用第二个播放器(clients 包含第二个设备客户端对象),第一组clients 数组包含第二个客户端对象(来自第二个设备)。 你对此有什么想法吗?我是不是做错了什么?

【问题讨论】:

    标签: android multithreading sockets


    【解决方案1】:

    想通了。 Clients 被错误地定义为静态,所以我猜当访问静态对象的 clients 数组时,它收到了最后一个创建的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2011-01-22
      • 2013-07-16
      • 1970-01-01
      相关资源
      最近更新 更多