gpt4 book ai didi

java - 使基本的 Java 文件服务器成为多线程的

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:11 26 4
gpt4 key购买 nike

我有一个服务器,它向它的客户端发送一个文本文件的内容。

“服务器”包有一个“Main”(从 cmd 行参数获取端口号并解析它)、“Server”和一个“FileHandler' 类,我想我已经以某种方式(使用线程池)获得它们,以便服务器能够同时为两个客户端提供服务。

现在我正在尝试构建一个带有启动和停止服务器选项的 CLI。我希望实现 2 个线程,其中一个线程将监听输入,另一个线程将监听“accept()”调用。

到目前为止,我的尝试是创建一个新类“Commander.java”并在构造函数中接收一个AtomicBoolean,然后将其存储在对象中用作停止服务器线程的标志。

我希望正在监听“accept()”调用的线程定期检查是否已发出停止请求 - 我如何使用我的“Commander”类执行此操作?

包括一些代码片段(也就是我到目前为止的尝试)以便您更好地理解:

class Server implements Runnable 
{
Socket sock;
ExecutorService executor;
private int port ;

public Server(int p) {
port = p ;
executor = Executors.newFixedThreadPool(2);
}

public void startServer() {
ServerSocket s = new ServerSocket(port);
...
while (true)
{
Socket temp = s.accept();
sock = temp;
executor.execute(new FileHandler(sock));
// serveFile(temp) ;
}

public void run() {
startServer();
}
}

public class Main {

public static void main(String[] args) {

while(true) {
System.out.println("Main menu:\n" +
" 1 - Start server\n"+
" 2 - Stop Server\n"+
" 0 - Exit");
int in = Integer.parseInt(scanner.nextLine());

switch(in) {
case 1:
// start server
System.out.println("Starting server...");
Thread th1 = new Thread(new Server(port));
th1.start();
System.out.println("Case continuity...");
// server.startServer() ;
break;
case 2:
// stop server
System.out.println("Server stopped.\n");
break;
case 0:
// exit
System.exit(0);
break;
}
}
}
}

class FileHandler implements Runnable {

Socket socket;

public FileHandler(Socket socket) {
this.socket = socket;
}

private void serveFile() {
...code for serving file...
}


public void run() {
serveFile();
}
}

public class Commander implements Runnable
{

private AtomicBoolean bool;

public Commander(AtomicBoolean bool) {
this.bool = new AtomicBoolean(bool);
}

public boolean value() {
return bool.get();
}

最佳答案

你的方法是错误的。在 accept() 上阻塞的线程除了等待并在建立连接后启动新线程(或提交新任务)外不应做任何事情。

当你想关闭服务器时,调用 ServerSocket 上的 close()(当然是从不同的线程)。在 accept() 上阻塞的线程将抛出一个 SocketException,然后您可以清理并退出。

关于java - 使基本的 Java 文件服务器成为多线程的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36277582/

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