我正在尝试调整我的简单套接字服务器,以便通过多线程可以有多个TCP连接,但我似乎无法让它工作.到目前为止我的代码如下,我不确定从哪里开始:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有人能够给我一些关于如何做到这一点的指示,以及为什么我当前的实现不起作用?我是通过在Java教程中的提示运行http://download.oracle.com/javase/tutorial/networking/sockets/examples/KKMultiServerThread.java在这里,但他们在这里给出例子似乎使用大量的外部资源和类似KnockKnockProtocol等.
有人能帮我解决这个问题吗?
非常感谢你!
Jon*_*eet 52
问题是,目前您正在接受连接,但随后立即执行阻塞读取直到它关闭:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
这意味着接受连接的同一线程正在尝试处理连接.这不会让您同时使用多个连接.
相反,创建一个实现的类(例如ConnectionHandler)Runnable,并使用构造函数Socket.它的run方法应该处理连接.然后将您的代码更改为:
Socket clientSocket = serverSocket.accept();
Runnable connectionHandler = new ConnectionHandler(clientSocket);
new Thread(connectionHandler).start();
Run Code Online (Sandbox Code Playgroud)
这将使您的"主"线程可以等待下一个连接.
(顺便说一下,这个KnockKnockProtocol类并不是真正的"外部" - 它是这个例子的一部分.他们只是没有说清楚源是在这里 ......)
Mar*_*ers 20
你不是多线程的.您正在创建一个绑定在端口上的线程,然后从任何客户端套接字读取,直到连接关闭.
您需要将套接字传递给新线程并将其读取.
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();
} //...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76526 次 |
| 最近记录: |