该项目是一个带有多线程服务器的聊天程序,可以处理多个客户端。下面的代码是客户端连接后开始的线程的服务器端代码。 ConnectionHandler使用已连接的客户端套接字和“ ID”。
run()中调用的静态“广播”方法与问题以及finally子句中的两个函数都不相关。
我一直在Windows 10台式机和运行Ubuntu 18.04的XPS笔记本电脑上进行项目开发。
一旦IOException被run()方法捕获,就处理客户端断开连接。这可以在Windows上按设计工作,但是对于Ubuntu并非如此。退出GUI客户端时,似乎只有异常在Windows上捕获,而在Ubuntu上不会发生。因此,该服务器在Linux上无法正常工作,而在Windows上则可以正常工作。
这通常不是处理客户端断开连接的良好实践方法吗?还是我需要更改其他内容才能使其在Linux上运行?我不知道该怎么办,因为我不确定这是我的代码中的错误还是Linux处理Java与Windows的方式?
任何帮助或提示都将受到赞赏。预先感谢。
class ConnectionHandler implements Runnable
{
//Begin declarations for new client thread
int clientId;
Socket connection;
BufferedReader reader;
BufferedWriter writer;
String message;
//end declarations for new client thread
public ConnectionHandler(int clientId, Socket connection)
{
this.clientId = clientId;
this.connection = connection;
}
@Override
public void run()
{
try
{
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
while (true)
{
message = reader.readLine();
if (message != null)
{
System.out.println("Message from " + message);
CrosstalkServer.broadcast(message);
}
}
}
catch (IOException e)
{
System.out.println("Client has disconnected. Recycling client ID: " + clientId);
}
finally
{
//Close the reader, writer, and socket.
terminateClient();
//Client has disconnected, handle client count and recycle client ID
CrosstalkServer.recycleClientId(this);
}
}
编辑:我在Windows 10,Windows 7和Ubuntu 18.04上测试了该程序。经过一些测试,这是客户端导致问题。我在Ubuntu笔记本电脑上运行服务器,并测试了Windows 7客户端和Windows 10客户端。 Windows 7客户端没有引发IOException,而Windows 10则引发了。 Ubuntu客户端也不会引起IOException。确定客户端断开连接的更好方法是什么?通过尝试不断写入我的客户端数组列表中的每个客户端来启动监视线程吗?