如何让多个线程使用同一个socket读写?
How to make multiple threads use the same socket to read and write?
**
将有多个客户端向端口 6069.I 上的服务器发送消息我希望同时处理多个请求,但我不确定下面的代码是否可以做到。
套接字队列中将有请求。由于只有一个线程,它将对一个请求执行迭代,然后从队列中获取下一个请求。如何同时服务多个客户?
**
这是 class 创建线程以侦听端口 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*/
}
}
}
below is how Main class looks like
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();
}
}
}
您应该以这种方式更改您的代码,以便从服务器端提供访问权限,以便更多客户端访问(处理)通过端口 6069 发送的数据。
您的第二个客户端应用程序只是一个简单的应用程序,具有连接到活动服务器的实现逻辑(如果有的话,或基于某些规则等)。
服务器应用程序提供访问的魔力。这意味着每个客户端都可以看到其他客户端发送的每条消息,反之亦然。
我认为阅读有用:Knock Knock Protocol。它会向您解释很多事情是如何管理的以及它们在您的情况下如何工作。
如果您可以隔离客户端处理方法,比如在一个新的 class 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 继承模型,您可以实现许多接口但只能从单个 class 扩展.
这不是编写服务器程序的好方法!
你最好有两个 classes :
1)client_handler :
一个class 处理客户并负责为客户服务.我们将其命名为 client_handler.java 。
应为每个连接到服务器的客户端创建此 class 的一个对象。
客户端应该并行获得服务,因此,这个 class 应该扩展 Thread 或实现 Runnable
接口。
2)服务器: 另一个等待客户端连接的class!让我们将其命名为:server.java
这个 class 将实现 main
方法!
server class 应该在每个连接上创建一个新线程,以便客户端可以并行获得服务。
**********************************
下面,有一些代码可以演示我上面所说的内容:
/*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.I 上的服务器发送消息我希望同时处理多个请求,但我不确定下面的代码是否可以做到。
套接字队列中将有请求。由于只有一个线程,它将对一个请求执行迭代,然后从队列中获取下一个请求。如何同时服务多个客户?
**
这是 class 创建线程以侦听端口 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*/
}
}
}
below is how Main class looks like
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();
}
}
}
您应该以这种方式更改您的代码,以便从服务器端提供访问权限,以便更多客户端访问(处理)通过端口 6069 发送的数据。 您的第二个客户端应用程序只是一个简单的应用程序,具有连接到活动服务器的实现逻辑(如果有的话,或基于某些规则等)。 服务器应用程序提供访问的魔力。这意味着每个客户端都可以看到其他客户端发送的每条消息,反之亦然。
我认为阅读有用:Knock Knock Protocol。它会向您解释很多事情是如何管理的以及它们在您的情况下如何工作。
如果您可以隔离客户端处理方法,比如在一个新的 class 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 继承模型,您可以实现许多接口但只能从单个 class 扩展.
这不是编写服务器程序的好方法!
你最好有两个 classes :
1)client_handler :
一个class 处理客户并负责为客户服务.我们将其命名为 client_handler.java 。
应为每个连接到服务器的客户端创建此 class 的一个对象。
客户端应该并行获得服务,因此,这个 class 应该扩展 Thread 或实现Runnable
接口。2)服务器: 另一个等待客户端连接的class!让我们将其命名为:server.java
这个 class 将实现main
方法!
server class 应该在每个连接上创建一个新线程,以便客户端可以并行获得服务。
**********************************
下面,有一些代码可以演示我上面所说的内容:/*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 !
}
}