【问题标题】:How to make multiple threads use the same socket to read and write?如何让多个线程使用同一个socket进行读写?
【发布时间】:2015-07-20 20:49:59
【问题描述】:

**

会有多个客户端在 6069 端口向服务器发送消息。我希望同时处理多个请求,但我不确定下面的代码是否可以做到。

套接字队列上会有请求。由于只有一个线程,它将在一个请求上执行其迭代,然后它将从队列中获取下一个请求。如何同时为多个客户提供服务?

**

这是创建线程以侦听端口 6069 的类。

public class NetworkModule extends Thread {
  private ServerSocket serverSocket;

  public NetworkModule(int port) throws IOException {

    serverSocket = new ServerSocket(port);
  }

    public void run() {
      while (true) {

                /* Here I read strings from the inputstream and write
                  to outputstream corresponding to "serverSocket" and call
                functions from other classes*/
      }
    }

}


下面是 Main 类的样子

public class Main
{

   public static void main(String[] args) 
   {
       try
          {
            int port=6069;
             Thread t = new NetworkModule(port);
             t.start();

          }
       catch(IOException e)
          {
             e.printStackTrace();
          }

   }

}

【问题讨论】:

  • 提示:如果您想这样做,请记住注意关键部分。
  • 尽量不要扩展Thread - 而是扩展Runnable。无论如何,我不明白您的问题 - 请提供更多详细信息。
  • 参见 Java 教程的自定义网络部分。

标签: java multithreading sockets client server


【解决方案1】:

您应该以这种方式更改您的代码,以便从服务器端提供访问权限,以便更多客户端访问(处理)通过端口 6069 发送的数据。 您的第二个客户端应用程序只是一个简单的应用程序,它实现了连接到活动服务器的逻辑(如果有,或基于某些规则等)。 服务器应用程序提供了访问权限。这意味着每个客户端都可以看到其他客户端发送的每条消息,反之亦然。

我认为阅读有用:Knock Knock Protocol。它将向您解释很多事情的管理方式以及它们在您的情况下的工作方式。

【讨论】:

    【解决方案2】:

    如果您可以隔离客户端处理方法,例如在一个新类ClientHandler 中也扩展Thread,在run() 中您可以读取和写入流。然后在你的run()NetworkModule:

    while (true) {
         Socket socket = serverSocket.accept(); // blocks until new client connects
         ClientHandler handler = new ClientHandler(socket); // pass reference to socket
         handler.start(); // start executing in new thread
    }
    

    通常,最好使用implement Runnable 而不是extending Thread,因为您可以实现许多接口,但由于 Java 继承模型,您只能从单个类扩展。

    【讨论】:

      【解决方案3】:

      这不是编写服务器程序的好方法!
      你最好有两个班:

      • 1)client_handler :
        处理客户端并负责为客户端提供服务的类。我们将其命名为 client_handler.java 。
        应该为连接到服务器的每个客户端创建一个此类的对象。
        客户端应该并行获得服务,因此,这个类应该扩展 Thread 或实现Runnable 接口。

      • 2)Server:另一个等待客户端连接的类!让我们将其命名为:server.java
        这个类将实现main 方法!
        服务器类应该在每个连接上创建一个新线程,以便客户端可以并行获取服务。
        ************************************
        下面,有一些代码来演示我上面所说的内容:

        /*this is the server class i talked about : */
        public class server{
           static void main (String args[]){
                ServerSocket ss = new ServerSocket (args[0]);
                while (true){
                    Socket  s =  ss.accept();
                    client_handler ch = new client_handler(s);
                    Thread t = new Thread(ch);
                    t.start();
                }
            }
        
        }
        

      这是 client_handler 的示例代码:

      public class client_handler implements Runnable{
          private Socket s ;
          private Scanner in ;
          print PrintWriter out;
      
          public client_handler(Socket s){
              this.s =s;
              in= new Scanner(s.getInputStream());
              out= new PrintWriter(s.getOutputStream());        
          }
      
         public void run(){
            // this is the entry of your thread . 
            // you can analyse the request received here . and send responses !
      
         }
      }
      

      【讨论】:

      • 请注意,上面的两个代码都是服务器端程序的一部分!
      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 2012-07-04
      • 2019-05-11
      • 2012-08-18
      • 2020-10-03
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多