这是一种客户端服务器模式。服务器使用多线程来处理客户端请求,如果有新的客户端请求到特定的服务器,服务器会初始化一个新的线程来处理它。但是,我需要向服务器线程添加一个逻辑流,它可能还需要初始化对另一台服务器的请求。基本上,服务器本身同时充当服务器和客户端。它对搜索很有用,例如,如果客户端向服务器发送搜索请求,并且服务器在其本地文件中没有找到它,那么它可以请求另一个服务器获取结果并返回给客户端.
我尝试通过在服务器线程运行方法中添加一个请求方法来实现这一点,如:
// server thread handle request for client
public void run(){
try{
// input output stream with client
PrintWriter out = new PrintWriter(clnt.getOutputStream(), true);
BufferReader in = new BufferReader( new InputStreamReader( clnt.getInputStream() ) );
...
// try to initial a new request to anther server which is already listening
reqstAntherServ();
...
}
}
reqstAntherServ 方法:
public void reqstAntherServ(){
try{
// initial a new socket request
Socket reqstAnthrServ = new Socket(hostname, port);
// input output stream with anther server
PrintWriter out = new PrintWriter(clnt.getOutputStream(), true);
BufferReader in = new BufferReader( new InputStreamReader( clnt.getInputStream() ) );
...
}
}
但是,在运行时我发现reqstAntherServ方法似乎没有成功初始化请求,例如服务器A想通过该方法请求服务器B,结果是已经在监听的服务器B没有听到任何请求。通常,它应该向控制台打印一条消息,指示已创建套接字。
然后我认为这可能是线程的事情,我猜一个服务器线程不能同时与客户端保持通信并初始化一个新请求。所以我尝试将 reqstAntherServ 方法放入另一个新线程。基本上,如果服务器想要向另一个服务器发送请求,它需要创建一个用于处理该请求的新线程。但是,它也不起作用。
我不知道是什么问题,或者还有其他方法可以实现这个机制吗?谢谢!
更新!包括最初的一个新线程来放置reqstAnerthServ方法,我尝试的是使用一个静态类作为线程处理程序并将reqstAnotherServ方法的内容放入run方法中,如:
private static class ThreadRqstAntherServ implements Runnable {
...
public void run() {
try{
// initial a new socket request
Socket reqstAnthrServ = new Socket(hostname, port);
// input output stream with anther server
PrintWriter out = new PrintWriter(clnt.getOutputStream(), true);
BufferReader in = new BufferReader( new InputStreamReader( clnt.getInputStream() ) );
...
}
}
}
然后在客户端的服务器线程处理请求中,我没有直接调用reqstAntherServ方法,而是使用上面的ThreadRqstAntherServ初始化一个新线程,如:
// server thread handle request for client
public void run(){
try{
// input output stream with client
PrintWriter out = new PrintWriter(clnt.getOutputStream(), true);
BufferReader in = new BufferReader( new InputStreamReader( clnt.getInputStream() ) );
...
// try to initial a new request to anther server which is already listening
Runnable r = new ThreadRqstAntherServ(...);
Thread t = new Thread(r);
t.start();
...
}
}
在 main 函数中还包括创建服务器进程代码:
public static void main(String[] args) throws IOException{
try{
ServerSocket serv = new ServerSocket(port);
while (true) {
Socket clnt = serv.accept();
Runnable rServ = new Threadhandler(clnt, ...); // thread handler for the server thread
Thread tServ = new Thread(rServ);
tServ.start();
...
}
}
}