Java多客户端服务器应用程序-如何组织套接字

标签 java sockets vector client

_嘿,我有一个问题。我想编写具有多个聊天、房间等的应用程序。 现在我的服务器遇到了一些麻烦。我的想法是将客户端数据存储在 ClientSocket 类的 Vector 中。

ClientSocket 类将如下所示:

public class ClientSocket {
    int client_id;
    Socket socket;
}

在主服务器线程上:

ServerSocket serverSocket;
Vector<ClientSocket> sockets;

想法是:当建立新连接时,创建一个新线程,传递套接字 vector 作为参数,生成玩家id,迭代 vector 元素,检查client_id是否存在,如果不存在,则设置id,如果存在,生成下一个并执行相同的操作。

问题出在哪里?我担心同步。如果两个客户端同时到达,并且 vector 大小同时发生变化,会发生什么?我这样做正确吗?也许有更好的想法来组织它?

提前致谢 马尔辛

//编辑

我的意思是这种情况,但我想我会使用 Peter Lawrey 解决方案:

Situation

最佳答案

由于您需要通过 client_id 查找客户端,因此我将使用 Map。如果您使用 ConcurrentMap,它将是线程安全的。

ConcurrentMap<Integer, Socket> socketByClientIdMap = new ConcurrentHashMap<>();

// check if a client exists already,
if (socketByClientIdMap.containsKey(clientId))

//  add a socket by client id.
socketByClientIdMap.put(clientId, socket);

// get a socket for a client_id
Socket s = socketByClientIdMap.get(clientId);

关于Java多客户端服务器应用程序-如何组织套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9859205/

相关文章:

java - API访问认证java

java - 无法跨不同网络连接套接字

java - 客户端没有从服务器接收消息,而是在 java 中接收 null

c++ - vector<wstring> 作为返回值和参数

C++ - 在创建类对象 vector 时使用 delete 的正确方法

java - 公开使用的 Vector 中的私有(private)类

java - 在数组中搜索标记并找到它们

java - java中读取文本文件

Java Reflection - 参数数量错误;期望 0,得到 1

Python IRC Bot 静默超时(?) - 突然停止工作