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

时间:2012-03-25 09:41:47

标签: java sockets vector client

_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解决方案:

Situation

2 个答案:

答案 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,但这些数据结构是不同步的,并且必须使用同步的wrapperCollection提供或同步自己。