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

时间:2015-05-10 08:18:42

标签: java multithreading sockets client server

**

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

   }

}

3 个答案:

答案 0 :(得分:3)

如果您可以隔离客户端处理方法,请在新的类Thread中说明,该类也会扩展run() run()中您读取和写入流的位置。然后在NetworkModule的{​​{1}}中填写

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 :(得分:0)

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

  • 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 !

   }
}

答案 2 :(得分:-1)

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

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