[英]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.