2017-02-15 2 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 секунд сна [представляет собой некоторую работу, которая не требует процессора]. После сна, сервер будет отвечать клиенту.

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 Client:

Клиент не беспокоили о времени сервера сна и будет посылать 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(); 
     } 
    } 

} 

Теперь я ожидаю, что сервер обработает следующий запрос клиента, когда один поток будет продолжать сон. Но, к сожалению, сервер принимает следующий запрос только после обработки предыдущего запроса.

Ожидая о/р:

Сервер не должен ждать, пока текущий процесс завершения запроса перед печатью «Thread-X - Начато: Input» для следующего запроса.

ток о/р:

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

Смежные вопросы