_Hey,我有一个问题。我想编写具有多个聊天,房间等的应用程序。 现在我有一些服务器的麻烦。我的想法是在Vector of ClientSocket类中存储客户端的数据。
ClientSocket类将是这样的:
public class ClientSocket {
int client_id;
Socket socket;
}
在主服务器线程上:
ServerSocket serverSocket;
Vector<ClientSocket> sockets;
这个想法是:当建立新连接时,创建一个新线程,传递套接字向量作为参数,生成玩家ID,迭代向量元素,检查client_id是否存在,如果不存在,则设置id,如果是,生成下一个并执行相同操作。
问题出在哪里?我担心同步。如果两个客户同时到达,会发生什么情况,同时矢量大小会发生变化?我做得对吗? Maby有更好的想法来组织它吗?
提前致谢 马尔钦
//编辑
我的意思是这种情况,但我想我会使用Peter Lawrey解决方案:
答案 0 :(得分:1)
由于你需要通过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);
答案 1 :(得分:0)
如果两个客户同时到达,矢量大小会发生什么 会在此期间发生变化吗?
因为在新连接上你创建了一个新线程(正如你在帖子中所说)
建立新连接时,创建一个新线程,传递套接字 矢量作为参数
然后你有2个线程同时到达的2个客户端
因此,2个线程在您使用的Vector
上运行。
Vector
作为一个类本身就是synchronized
所以没有任何伤害。
但Vector
被认为是一个相当弃用的集合,所以你可能想要使用更新的集合数据结构,如List
,但这些数据结构是不同步的,并且必须使用同步的wrapper从Collection
提供或同步自己。