_嘿,我有一个问题。我想编写具有多个聊天、房间等的应用程序。 现在我的服务器遇到了一些麻烦。我的想法是将客户端数据存储在 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 解决方案:
最佳答案
由于您需要通过 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/