Java 客户端服务器中的客户端聊天CPU负载30-50%
客户端连接到服务器,服务器向客户端发送一条消息,客户端必须等待另一条消息。当客户端在While(true)循环中等待时,它将CPU加载到50%。我试着尽可能简单地做到这一点,以了解它是如何工作的 p.S.All catch()已隐藏以最小化此处的代码 客户:Java 客户端服务器中的客户端聊天CPU负载30-50%,java,multithreading,sockets,client-server,chat,Java,Multithreading,Sockets,Client Server,Chat,客户端连接到服务器,服务器向客户端发送一条消息,客户端必须等待另一条消息。当客户端在While(true)循环中等待时,它将CPU加载到50%。我试着尽可能简单地做到这一点,以了解它是如何工作的 p.S.All catch()已隐藏以最小化此处的代码 客户: public class SocketClient { String host; int port; static Socket connection; BufferedReader bfr; publi
public class SocketClient
{
String host;
int port;
static Socket connection;
BufferedReader bfr;
public SocketClient(String host, int port)
{
this.port = port;
this.host = host;
}
public void connect() throws UnknownHostException, IOException, Exception
{
connection = new Socket(new String(host), port);
System.out.println("Client is ready.");
bfr = new BufferedReader(new InputStreamReader(connection.getInputStream()));
}
public void readInput() throws IOException
{
String input;
if(input = bfr.readLine()) != null)
{
System.out.println(input);
}
}
public static void main(String[] args) throws UnknownHostException, IOException, Exception
{
SocketClient socketClient = new SocketClient("localhost", 19999);
try {
socketClient.connect();
try
{
while(true)
{
socketClient.readInput();
}
}
}
}
}
服务器:
public class MultipleSocketServer implements Runnable {
private Socket connection;
private String TimeStamp;
private int ID;
static PrintWriter writer;
private static File file;
public static void main(String[] args)
throws FileNotFoundException, UnsupportedEncodingException
{
int port = 19999;
int count = 0;
file = new File("E:/test.txt");
writer = new PrintWriter(file, "UTF-8");
try
{
ServerSocket socket = new ServerSocket(port);
System.out.println("MultipleSocketServer Initialized");
while (true)
{
Socket connection = socket.accept();
Runnable runnable = new MultipleSocketServer(connection, ++count);
Thread thread = new Thread(runnable);
thread.start();
}
}
}
MultipleSocketServer(Socket s, int i) {
this.connection = s;
this.ID = i;
}
public void run() {
try {
System.out.println("Connected: " + connection.getLocalSocketAddress() + " at port " + connection.getPort());
writer.println(ID + ": " + connection.getLocalSocketAddress() + " at port " + connection.getPort());
writer.flush();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
writer.write("MultipleSocketServer repsonded at " + new java.util.Date().toString());
writer.write("\n");
writer.flush();
}
finally {
try {
connection.close();
}
}
}
}
分析
似乎服务器端在发送数据后关闭了连接
客户端具有以下无限循环:
while (true)
{
socketClient.readInput();
}
循环可能导致CPU消耗:方法bfr.readLine()
方法调用将在连接关闭后立即返回null
解决方案
请考虑更改客户端的循环,直到“连接结束”:
分析 似乎服务器端在发送数据后关闭了连接 客户端具有以下无限循环:while (true)
{
socketClient.readInput();
}
循环可能导致CPU消耗:方法bfr.readLine()
方法调用将在连接关闭后立即返回null
解决方案
请考虑更改客户端的循环,直到“连接结束”:
你的问题是什么?请说明清楚,以便我们了解您的问题是什么以及我们如何帮助您您的问题是什么?请说明清楚,以便我们了解您的问题以及我们可以如何帮助您