Многопоточный Java-сервер

1

Я кодирую сервер, и вот как это выглядит сейчас:

import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class HttpServer {

    public static void main(String[] args) throws Throwable {
        //http://localhost:3000
        ServerSocket ss = new ServerSocket(3000);

        while (true) {
            //Waiting for socket
            Socket s = ss.accept();
            System.out.println("Client accepted");
            //The main process
            new SocketProcessor(s,ss).start();
        }
    }

    private static class SocketProcessor implements Runnable {
        private Thread t;
        private Socket s;
        private ServerSocket ss;
        private InputStream is;
        private OutputStream os;

        private SocketProcessor(Socket s,ServerSocket ss) throws Throwable {
            t = new Thread(this, "Server Thread");
            this.ss=ss;
            this.s = s;
            this.is = s.getInputStream();
            this.os = s.getOutputStream();
        }

        public void run() {
            try {
                readInputHeaders(); 
                Thread.sleep(10000);
                writeResponse("<html><body><h1>Hello</h1></body></html>");


            } catch (Throwable t) {
                /*do nothing*/
            } finally {
                try {
                    s.close();
                } catch (Throwable t) {

                }
            }
            System.out.println("Client processing finished");
        }


        public void start()
        {
            t.start();
        }

        private void writeResponse(String s) throws Throwable {
            String response = "HTTP/1.1 200 OK\r\n" +
                    "Server: Server\r\n" +
                    "Content-Type: text/html\r\n" +
                    "Content-Length: " + s.length() + "\r\n" +
                    "Connection: close\r\n\r\n";
            String result = response + s;
            os.write(result.getBytes());
            os.flush();
        }

        private void readInputHeaders() throws Throwable {
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while(true) {
                String s = br.readLine();
                System.out.println(s);
                if(s == null || s.trim().length() == 0) {
                    break;
                }
            }
        }
    }
}

Разве это не

while (true) {
                //Waiting for socket
                Socket s = ss.accept();
                System.out.println("Client accepted");
                //The main process
                new SocketProcessor(s,ss).start();
            } 

сделать веб-сервер многопоточным? Я пытался запустить http://localhost:3000 из двух разных вкладок в моем браузере. Как вы можете видеть, я заставляю мой сервер ждать 10 секунд до ответа, поэтому каждая страница должна занимать равное время. Но нет, это не так: первая открытая страница занимает 10, а вторая - 20.

Что не так?

UPD: У меня есть мысли, что ss.accept(); зависает сервер.

  • 0
    Я могу ослепнуть, но нигде не вижу кода «подожди 10 секунд».
  • 0
    К сожалению. Обновленный ..
Показать ещё 5 комментариев
Теги:
multithreading
sockets
webserver

2 ответа

2
Лучший ответ

Пробовал в разных браузерах, и этого не происходит в них. Вы используете хром, как я? Это может быть хром, делающий некоторые странные вещи для тех же запросов.

Обратите внимание, что я

http://localhost:3000

а также

http://localhost:3000?diff=true

и я получаю их обоих за 10 секунд вместо 10 и 20 за тот же запрос.

Я все равно буду любить кого-то, чтобы объяснить это, но, возможно, это другой вопрос.

  • 1
    Может быть, поскольку это тот же самый запрос GET, chrome хочет их сериализовать, чтобы получить кешированный ответ при следующем вызове?
1

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

Если вы откроете два браузера и сделаете запрос, ваша программа будет работать по назначению.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню