创建一个允许通过线程和Java进行多个连接的套接字服务器

我试图调整我的简单套接字服务器,以便它可以有多个TCP连接,通过multithreading,但我似乎无法让它工作。 到目前为止,我的代码如下,我不确定从哪里开始:

import java.net.*; import java.io.*; public class DoSomethingWithInput implements Runnable { private final Socket clientSocket; //initialize in const'r public void run() { BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String nextline; while ((nextline = in.readLine())!=null) { System.out.println(nextline); } //... close socket, etc. } } public class Socket{ public Socket() { } @Override public void run() { try { ServerSocket serverSocket = null; serverSocket = new ServerSocket(5432); for (;;) { ServerSocket serverSocket = null; serverSocket = new ServerSocket(5432); for (;;) { Socket clientSocket = null; clientSocket = serverSocket.accept(); //delegate to new thread new Thread(new DoSomethingWithInput(clientSocket)).start(); } } }catch (IOException e) { System.err.println("Could not listen on port: 5432."); System.exit(1); } } } 

有人能够给我一些关于如何做到这一点的指示,以及为什么我当前的实现不起作用? 我在这里阅读了Java教程http://download.oracle.com/javase/tutorial/networking/sockets/examples/KKMultiServerThread.java中的提示,但是他们在这里提供的示例似乎使用了很多外部资源和类似KnockKnockProtocol等。

有人能帮我解决这个问题吗?

非常感谢你!

问题是,目前您正在接受连接,但随后立即执行阻塞读取直到它关闭:

 // After a few changes... Socket clientSocket = serverSocket.accept(); BufferedReader in = new BufferedReader(new InputStreamReader( clientSocket.getInputStream())); String nextLine; while ((nextLine = in.readLine()) != null) { System.out.println(nextline); } 

这意味着接受连接的同一线程正在尝试处理连接。 这不会让您同时使用多个连接。

相反,创建一个实现Runnable的类(例如ConnectionHandler ),并使用一个构造函数来获取Socket 。 它的run方法应该处理连接。 然后将您的代码更改为:

 Socket clientSocket = serverSocket.accept(); Runnable connectionHandler = new ConnectionHandler(clientSocket); new Thread(connectionHandler).start(); 

这将使您的“主”线程可以自由等待下一个连接。

(顺便说一句, KnockKnockProtocol类并不是真正的“外部” – 它是示例的一部分。他们只是没有说清楚源是在这里 ……)

你不是multithreading的。 您正在创建一个绑定在端口上的线程,然后从任何客户端套接字读取,直到连接关闭。

您需要将套接字传递给新线程并将其读取。

 public class DoSomethingWithInput implements Runnable { private final Socket clientSocket; //initialize in const'r public void run() { BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String nextline; while ((nextline = in.readLine())!=null) { System.out.println(nextline); } //... close socket, etc. } } //... ServerSocket serverSocket = null; serverSocket = new ServerSocket(5432); for (;;) { Socket clientSocket = null; clientSocket = serverSocket.accept(); //delegate to new thread new Thread(new DoSomethingWithInput(clientSocket)).start(); } //...