2017-02-15 51 views
0

我想写一个多线程服务器,它应该能够一次接受多个HTTP请求。Java多线程服务器没有按预期工作

服务器代码:

package test.thread.server; 

    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 
    import java.net.ServerSocket; 
    import java.net.Socket; 

    public class MyServer implements Runnable { 
     private int serverPort = 8080; 
     private ServerSocket serverSocket; 
     private Thread runningThread; 
     private boolean isStopped; 

     public MyServer(int port){ 
      this.serverPort = port; 
     } 


     @Override 
     public void run() { 
      synchronized (this) { 
       this.runningThread = Thread.currentThread(); 
      } 

      openServerSocket(); 


      while(!isStopped){ 

       Socket clientSocket = null; 

       try { 
        clientSocket = this.serverSocket.accept(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 


       //start a new thread for processing each request 
       new Thread(new RequestHandler(clientSocket)).start(); 
      } 

     } 

    public synchronized void stop(){ 
     this.isStopped = true; 
     try { 
      this.serverSocket.close(); 
     } catch (IOException e) { 
      throw new RuntimeException("Error closing server", e); 
     } 
    } 


    private void openServerSocket(){ 
     try { 
      this.serverSocket = new ServerSocket(this.serverPort); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

工人处理该请求:

它读取从输入流和打印的数据。之后,它应该进行30秒的睡眠[代表一些不需要CPU的工作]。睡眠后,服务器会响应客户端。

package test.thread.server; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.Socket; 
import java.util.Date; 

public class RequestHandler implements Runnable { 
    Socket clientSocket; 

    static int counter = 0; 

    public RequestHandler(Socket clientSocket){ 
     this.clientSocket = clientSocket; 
    } 

    @Override 
    public void run() { 

     try { 
      InputStream input = this.clientSocket.getInputStream(); 
      OutputStream output = this.clientSocket.getOutputStream(); 


      DataInputStream inFromClient = new DataInputStream(input); 
      System.out.println(new Date()+": " +Thread.currentThread().getName() + " - Started : "+inFromClient.readUTF()); 

      Thread.sleep(30000); 

      /*output.write(("HTTP/1.1 200 OK\n\n<html><body>" + 
        "Multi-threaded Server " + 
        "</body></html>").getBytes());*/ 

      DataOutputStream outFromServer = new DataOutputStream(output); 
      outFromServer.writeUTF("Output"); 
      outFromServer.flush(); 

      output.close(); 
      input.close(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

} 

HTTP客户端:

客户端没有困扰有关服务器的睡眠时间,并会发出连续的5个请求。

package test.thread.server; 

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.Date; 

public class MyClient { 

    public static void main(String[] args) throws UnknownHostException, IOException { 
     // TODO Auto-generated method stub 
     for(int i=0; i<5; i++){ 
      Socket clientSocket = new Socket("localhost", 8080); 
      DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
      DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream()); 


      outToServer.writeUTF("Input"); 
      outToServer.flush(); 

      String output = inFromServer.readUTF(); 
      System.out.println(new Date()+": "+output); 
      clientSocket.close(); 
     } 
    } 

} 

现在我期待的服务器当一个线程进入睡眠来处理一个客户端请求。但不幸的是服务器只有在处理完上一个请求后才接受下一个请求。

期待O/P:

服务器不应该等待当前请求的过程中打印“主题-X - 入门:输入”之前完成下一个请求。

当前O/P:

Server: Wed Feb 15 18:17:06 IST 2017: Thread-1 - Started : Input 
Client: Wed Feb 15 18:17:36 IST 2017: Output 
Server:Wed Feb 15 18:17:36 IST 2017: Thread-2 - Started : Input 
Client:Wed Feb 15 18:18:06 IST 2017: Output 
Server:Wed Feb 15 18:18:06 IST 2017: Thread-3 - Started : Input 
Client:Wed Feb 15 18:18:36 IST 2017: Output 
Server:Wed Feb 15 18:18:43 IST 2017: Thread-4 - Started : Input 
Client:Wed Feb 15 18:19:13 IST 2017: Output 
Server:Wed Feb 15 18:19:13 IST 2017: Thread-5 - Started : Input 
Client:Wed Feb 15 18:19:43 IST 2017: Output 

什么可以是问题?

回答

3

我相信问题出在您的客户端。客户端只在上一个请求被回答后才发送下一个请求。 inFromServer.readUTF()阻塞,直到数据可用,这只有当您的服务器发送实际答案时。

我建议你调试你的程序。

+0

Haaaaa ....客户端是罪魁祸首。我怀疑我的服务器,并花费2个多小时进行调试。我应该在不同的线程上启动客户端请求!!! ....我的不好。 – Renjith