当前位置: 首页 > 面试题库 >

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

韩瀚
2023-03-14
问题内容

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

这意味着接受连接的同一线程正在尝试 处理 该连接。这样一来,您将无法同时使用多个连接。

而是创建一个实现的类(例如ConnectionHandlerRunnable,并让构造函数接受Socket。它的run方法应该处理连接。然后将代码更改为:

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

这将使您的“主”线程有空等待下一个连接。

(顺便说一句,KnockKnockProtocol该类并不是真正的“外部”类,它是html" target="_blank">示例的一部分。他们只是不清楚源在这里
…)



 类似资料:
  • 这是服务器类的代码。 如有任何帮助,不胜感激

  • 问题内容: 我正在尝试用python创建一个非常基本的服务器,该服务器侦听端口,在客户端尝试连接时创建TCP连接,接收数据,发回一些东西,然后再次侦听(并无限地重复该过程)。这是我到目前为止所拥有的: 有时,这似乎工作得很好(如果我将浏览器指向“ localhost:4444”,则服务器将打印出HTTP GET请求,而网页将显示文本“ hello world”)。但是当我在最后几分钟关闭服务器后尝

  • 问题内容: 如何处理多个客户端以连接到一台服务器?我有这个LogServer.java 和一个嵌入式小程序,其中包含部分代码,例如 现在的问题是,如果我在服务器上运行“ java LogServer”,它将打开应用程序并等待输入流,如果打开站点,它将开始流式传输日志。但是,如果我使用其他计算机/网络再打开一个,则第二个站点不会记录该流。似乎是因为第一个仍绑定到端口5000。 我该如何处理?套接字实

  • 我对连接池的理解是;如果connectionstring完全相同,那么我们重用该连接,而不是建立新的连接。 我的问题是,我正在为并行处理创建许多线程。在这个“虚拟”程序中,我创建了500个线程,并让线程池函数处理这些线程。 步骤是: > < li> 每个线程在SQL中创建一个更新表。(说明更新的时间戳) 然后线程Hibernate1到10秒(随机)。 最后,线程在 SQL 中进行另一次更新(说明结

  • 如何处理多个客户端连接到一个服务器?我有这个logserver.java 和一个嵌入式applet,其中包含如下所示的部分代码,例如 现在的问题是,如果我在服务器上运行“Java日志服务器”,它将打开应用程序并等待输入流,如果我打开我的站点,它将开始流日志。但如果我使用其他计算机/网络再打开一个站点,第二个站点不会记录流。似乎是因为第一个仍然绑定到端口5000。 我该怎么处理?socket实际上是

  • 问题内容: 我正在运行一台正在监听的服务器,公开了2个服务:和。由于这两项服务都可以从访问,因此我只想从存根拨打该地址。 服务器看起来像这样: 为什么每种服务都需要拨不同的插座? 而且由于代码基本上是重复的,以适应每种服务,所以我不能只使用an 来减少代码吗? 然后使用它为每个服务实现客户端功能,而不是为每个服务创建新功能。我已经找到了cmux,但是必须有一种无需使用外部库即可执行此操作的方法。