2017-02-15 55 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