所以,我有以下代码捕获一个新连接,然后将该连接交给它自己的线程来处理客户端。
private void loop(int port) {
// Opens a port for connections.
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
System.out.println("Server running in port " + port);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// Listens for a connection
while (onlineState == true && serverSocket != null) {
Socket clientSocket = new Socket();
try {
clientSocket = serverSocket.accept();
System.out.println(clientSocket.getInetAddress() + " has connected to the port " + clientSocket.getPort());
new Thread(new SocketThread(clientSocket)).run();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
所以,我的问题是当我尝试将多个客户端应用程序连接到服务器时,服务器似乎只在任何给定时间接受一个连接。客户端本身是基本教程的一个非常简单的应用程序:它只是重复服务器发送给它的任何字符串。
我有两个猜测,为什么会发生这种情况:a)我的处理代码有问题,b)因为两个连接来自同一个IP。
但是,这两种情况都不是好事。我有什么想法我做错了吗? (除了一切)
答案 0 :(得分:1)
两件事:
您想在start()
对象上拨打run()
,而不是Thread
。不同之处在于start()
实际上是并且做了线程化的东西,比如在后台运行它。从您调用它的地方调用run()
将在那里处理内联的所有客户端通信。这就是为什么你只接受一个连接 - 在你为那个客户提供服务之前你不会再接受了。
您不想在主线程中调用clientSocket.close()
。在SocketThread
的实施中,请在clientSocket.close()
方法的末尾调用run()
,可能在finally
块内。
此外,SocketThread
是否会延长Thread
?如果是这样,您不需要new Thread()
,只需执行
new SocketThread(clientSocket).start();
如果不展开Thread
,为什么不将其命名为SocketRunnable
或ClientRunnable
或类似名称。