0
目前我的java服务器工作正常,所有的客户端存储在一个新的线程,但不是那么擅长性能。Java服务器结构
我MainServer类
public class MainServer {
private ServerSocket server;
public MainServer(int port) {
try {
server = new ServerSocket(port);
System.out.println("Server started on port " + port + "...");
ServerLoop();
} catch (IOException e) {
System.out.println("[ERROR] Server cannot be started on port " + port + "...");
}
}
public void ServerLoop() {
Thread serverLoop = new Thread(new Runnable() {
public void run() {
ServerDispatcher dispatcher = new ServerDispatcher();
while (true) {
try {
Socket connectedClient = server.accept();
dispatcher.connectedClients.add(connectedClient);
System.out.println("Client number - " + dispatcher.connectedClients.size() + " connected...");
Thread clientThread = new Thread(new ClientHandler(connectedClient, dispatcher));
clientThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
serverLoop.start();
}
}
因此,这部分将开始为每一个客户一个新线程,将客户端添加到调度客户端列表
ClientHandler的类
public class ClientHandler implements Runnable {
private Socket currentClient;
private ServerDispatcher handler;
public ClientHandler(Socket s, ServerDispatcher dispatcher) {
currentClient = s;
handler = dispatcher;
}
public void run() {
while (true) {
}
}
}
这是我ServerDispatcher类
public class ServerDispatcher {
public ArrayList<Socket> connectedClients;
public ServerDispatcher() {
connectedClients = new ArrayList<Socket>();
CheckClients();
}
public void CheckClients() {
Thread checkClients = new Thread(new Runnable() {
public void run() {
while (true) {
Integer clientSize = connectedClients.size();
if (!clientSize.equals(0)) {
for (int i = 0; i < connectedClients.size(); i++) {
try {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connectedClients.get(i).getOutputStream()));
writer.write("1");
writer.flush();
//System.out.println("Checking");
} catch (IOException e) {
int clientNumber = i + 1;
System.out.println("Client number - " + clientNumber + " disconnected...");
connectedClients.remove(i);
}
}
}
}
}
});
checkClients.start();
}
}
而这将检查所有在线客户端...
问题是此服务器正在使用像67%的CPU在执行,我该如何改进代码?也许从ServerDispatcher中删除所有的线程,并离开客户端线程?
另一个问题:我想在我的while循环中发送一条消息给X客户端,但仅仅一次,我看着谷歌,似乎LinkedBlockingQueue是我在找什么,但我找不到任何教程轻松实现..
难道'while(true){}'是什么导致它? –
嗯,我真的需要同时实现真正的活命,我认为,(没有?) –
TCP协议保持活着没有你需要发送任何连接在服务器上的客户端连接。 –