检测要在服务器中注册的第一个客户端线程



我的服务器代码的一个简单版本可以描述为…

public class Server implements Runnable {
static boolean isFirstClient=false;
...
...
public void run(){
ServerSocket ss=new ServerSocket(port);
while(true){
Socket s= ss.accept();
if(!isFirstClient){
isFirstClient=true;
new ClientHandler(s,true);
}
else{
new ClientHandler(s,false);
}
}
}
...
...
}

其中客户端处理程序处理客户端,并且客户端处理程序中的第二参数确定其是否为第一客户端,并相应地向客户端发送分组。(我写了一个不同的功能,让第一个客户端在服务器中注册,服务器的响应决定了第一个客户端。(

public class Client implements Runnable(){
boolean iamFirst=false;
public void run(){
InetAddress ip = InetAddress.getByName("localhost");
Socket soc = new Socket(ip, port);
...
// response from server is stored in responsePacket.
...
iamFirst=responsePacket.isFirst();
if(iamFirst){
...
...
}
else{
...
...
}
}
}

但由于大量客户端同时运行,并且还使用静态变量来检测服务器中的第一个客户端,因此会导致以"firstClient"的身份运行1个以上的客户端线程。

有人能提出区分第一个在服务器中注册的客户端的最佳方法吗?事实上,大量客户端同时启动?

(注意:我不想在代码中使用sleep((函数来将一个客户端与另一个客户端分离,以模拟实际场景。(

您可以使isFirstClient不稳定;这样可以确保所有线程都能看到变量的最新值。

另一种方法是同步接受客户的方法;但既然你在循环中这样做,那么在这种情况下就没有意义了。

最新更新