簡體   English   中英

Java多線程服務器無法按預期工作

[英]Java Multi threaded server not working as expected

我正在嘗試編寫一個多線程服務器,該服務器應該能夠一次接受多個HTTP請求。

服務器代碼:

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:

服務器不應等待當前請求過程完成,然后再為下一個請求打印“ Thread-X-Started: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

可能是什么問題?

我相信問題出在您的客戶身上。 客戶端僅在回答前一個請求后才發送下一個請求。 inFromServer.readUTF()阻塞,直到有可用數據為止,這僅在服務器發送實際答案時才會發生。

我建議您調試程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM