gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:02:25 26 4
gpt4 key购买 nike

我正在尝试调整我的简单套接字服务器,以便它可以通过多线程进行多个 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);
}
}
}

谁能给我一些关于如何做到这一点的指示,以及为什么我当前的实现不起作用?我正在阅读 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 类并不是真正的“外部”——它是示例的一部分。他们只是没有很清楚地表明 source is here ...)

关于java - 创建一个允许通过线程和 Java 进行多个连接的套接字服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5109654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com