繁体   English   中英

如何让多个线程使用相同的socket来读写?

[英]How to make multiple threads use the same socket to read and write?

**

将有多个客户端在端口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();
          }

   }

}

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

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继承模型,您可以实现许多接口,但只能从单个类扩展。

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

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

  • 2)服务器:等待客户端连接的另一个类! 我们将它命名为: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 !

   }
}

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

我认为阅读有用: Knock Knock Protocol 它将向您解释如何管理事物并且它们适用于您的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM