Can';t正确跟踪已连接的java客户端
我似乎不知道如何通知我的服务器类连接丢失。我的服务器代码是:Can';t正确跟踪已连接的java客户端,java,multithreading,server,Java,Multithreading,Server,我似乎不知道如何通知我的服务器类连接丢失。我的服务器代码是: public class Server { static int port = 4444; static boolean listening = true; static ArrayList<Thread>Clients = new ArrayList<Thread>(); static MatchMaker arena; public static void mai
public class Server {
static int port = 4444;
static boolean listening = true;
static ArrayList<Thread>Clients = new ArrayList<Thread>();
static MatchMaker arena;
public static void main(String[] args) {
Initialize();
Thread startConnections = new Thread(run());
startConnections.start();
}
private static Runnable run(){
System.out.println("(" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + ") Started listening on port: " + port);
try(ServerSocket socket = new ServerSocket(port)){
while(listening){
if(Clients.size() <= 4){
Socket clientSocket = socket.accept();
MultiThread connection = new MultiThread(clientSocket, arena, );
Clients.add(connection);
System.out.println("Client connected from " + clientSocket.getRemoteSocketAddress() + " Assigned ID: " + connection.getId());
System.out.println("Currently connected clients(" + Clients.size() + "): ");
for(int i = 0; i < Clients.size(); i++)
System.out.println(" - " + Clients.get(i).getId());
connection.start();
}
}
}
catch(Exception e){
e.printStackTrace();
}
return null;
}
private static void Initialize(){
arena = new MatchMaker();
}
}
公共类服务器{
静态int端口=4444;
静态布尔监听=真;
静态ArrayList客户端=新建ArrayList();
静态媒人竞技场;
公共静态void main(字符串[]args){
初始化();
线程开始连接=新线程(run());
startConnections.start();
}
私有静态可运行运行运行(){
System.out.println(“(“+新SimpleDataFormat(“HH:mm:ss”).format(new Date())+”)开始侦听端口:“+端口”;
try(ServerSocket=newserversocket(端口)){
边听{
如果(Clients.size()您可以将它们保持在同步映射中,如:
Map<Integer, ClientObject> connectedClients = new HashMap<Integer, ClientObject>(); //key integer will be the client id
Map connectedClients=new HashMap();//键整数将是客户端id
其他建议:
Map<String, ClientObject> connectedClients = new HashMap<String, ClientObject>(); //key String will be the client IP&userName (you decide)
Map connectedClients=new HashMap();//键字符串将是客户端IP和用户名(由您决定)
首先使用线程安全集合来监视客户端连接,因此请替换以下内容
ArrayList Clients=新的ArrayList();
具有
ConcurrentLinkedQueue客户端=新的ConcurrentLinkedQueue();
但你们的问题是,你们正试图以线程安全的方式使用有限的资源,所以最好的选择是使用信号量。我已经对你们的类进行了一些重新分析,给出了一个想法。希望它能有所帮助。请仔细查看“服务器\ U实例”
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Semaphore;
public class Server {
private final int MAX_AVAILABLE = 4;
public final Semaphore SERVER_INSTANCE = new Semaphore(MAX_AVAILABLE, true);
static int port = 4444;
static volatile boolean listening = true;
static MatchMaker arena;
public static void main(String[] args) {
Initialize();
Thread startConnections = new Thread(run());
startConnections.start();
}
private static void Initialize() {
//do somthing
}
private static Runnable run(){
System.out.println("(" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + ") Started listening on port: " + port);
ServerSocket socket = null;
while(listening){
try {
socket = new ServerSocket(port);
try {
SERVER_INSTANCE.acquire();
Socket clientSocket = socket.accept();
MultiThread connection = new MultiThread(clientSocket, arena, SERVER_INSTANCE);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
return null;
}
static class MultiThread implements Runnable{
Semaphore serverInstance ;
public MultiThread(Socket clientSocket, MatchMaker arena, Semaphore serverInstance) {
serverInstance = serverInstance;
}
@Override
public void run() {
try {
serverInstance.acquire();
//Do your work here
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
serverInstance.release();
}
}
}
class MatchMaker {
}
}
我应该如何访问另一个类中的映射?您可以创建一个单例来帮助您插入/从中获取数据。该单例将实际管理您获得的所有连接的客户端。顺便说一句,在main
中,您的代码根本没有启动新线程,并且已中断。您可以调用run()
而不是此代码。服务器中没有处理断开连接通知的代码。