Java-сервер для обработки нескольких соединений TCP - PullRequest
2 голосов
/ 12 сентября 2010

я пытаюсь написать простой веб-сервер в Java.

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

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

Я немного потерял в том, как создавать новые потоки в Javaхотя и чтобы дать каждому новому потоку соединение.

я думаю, что у меня был бы такой цикл, который бы получал новые соединения и передавал каждое новое соединение в новый поток

// make new ServerSocket
while (true) {
     Socket newConn = serverSocket.accept();
     // make new thread, and pass in newConn
}

canкто-нибудь дать мне несколько советов о том, как двигаться вперед?(также, если я где-то допустил ошибку, пожалуйста, укажите на это. Я новичок в многопоточном программировании, поэтому вполне возможно, что я его неправильно понял)

rob

edit:

k спасибо всем.

я пошел и написал кое-что, этот учебник по Java очень помог.

у меня появилась новая проблема

я добавил цикл в свой прогон () метод в новом потоке, который содержит 10-секундный обратный отсчет (используя Thread.sleep (1000)) всякий раз, когда сервер получает запрос на изображение, поэтому я могу видеть, когда какие потоки работают.(index.html имеет 4 изображения)

, поэтому я запросил страницу index.html и мой сервер работает нормально.Затем я открыл около десятка новых вкладок.Я ожидал, что запрос на страницу index.html будет мгновенным, но для отправки изображений в браузер потребуется 10 секунд (из-за той задержки, которую я вставил туда), после чего сервер получит запросдля следующей страницы index.html и так далее.В общем, я подумал, что дюжина страниц index.html будет обслуживаться мгновенно, в то время как 4 * 12 = 36 изображений будут отображаться на всех вкладках. Это займет 10 секунд.

что на самом деле произошло, это заняло 10 секундчтобы получить первые 4 изображения, затем 10 секунд для следующих 4 изображений и т. д., вместо того, чтобы обслуживать несколько веб-страниц, мой сервер просто ставит в очередь запросы и обрабатывает по одной странице за раз.

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

ОДНАКО, когда я открывал IE, FF и Chrome и запрашивал index.html в разное время (с интервалом около 2 секунд), казалось, что каждый браузер одновременно получает страницу, другими словами,в один момент было подано 12 разных изображений, по 4 на каждый браузер

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

(для тех, кто спрашивал, я планирую нормально пройти курс по сети, следующийгод, но я сейчас пытаюсь сделать что-то из базовых вещей, так что половина самообучения, половина ч / б)

Ответы [ 4 ]

5 голосов
/ 12 сентября 2010

Если вы ищете что-то надежное, поищите в Интернете работающее решение.
Если это для учебных целей, то создайте свой собственный.
Есть несколько способов сделать это. Проще всего сделать это Как взято из Java Tutorial :

import java.net.*;
import java.io.*;
public class MultiServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        boolean listening = true;

        try {
            serverSocket = new ServerSocket(4444);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(-1);
        }

        while (listening)
        new MultiServerThread(serverSocket.accept()).start();

        serverSocket.close();
    }
}




import java.net.*;
import java.io.*;

public class MultiServerThread extends Thread {
    private Socket socket = null;
public MultiServerThread(Socket socket) {
super("MultiServerThread");
this.socket = socket;
}

public void run() {

try {
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
                new InputStreamReader(
                socket.getInputStream()));

    String inputLine, outputLine;
    KnockKnockProtocol kkp = new KnockKnockProtocol();
    outputLine = kkp.processInput(null);
    out.println(outputLine);

    while ((inputLine = in.readLine()) != null) {
    outputLine = kkp.processInput(inputLine);
    out.println(outputLine);
    if (outputLine.equals("Bye"))
        break;
    }
    out.close();
    in.close();
    socket.close();

} catch (IOException e) {
    e.printStackTrace();
}
}

}

Вы бы реализовали свою логику для обработки ваших запросов в:

KnockKnockProtocol kkp = new KnockKnockProtocol();
outputLine = kkp.processInput(null);

Вы можете оптимизировать свой код, поместив свои потоки в пул потоков, чтобы вам не приходилось каждый раз создавать новый поток.

Часть ниже является субъективной и зависит от типов запросов и от того, что вы делаете с каждым. Если у вас много одновременных клиентских запросов, NIO - это то, что вам нужно.
Если ваши запросы короткие, и у вас более 10 одновременных запросов, создайте пул.
Если ваших запросов больше 100, то я бы начал смотреть на NIO.

1 голос
/ 12 сентября 2010

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

1 голос
/ 12 сентября 2010

Вы также можете рассмотреть Netty и Java NIO. Есть несколько способов сделать это.

0 голосов
/ 12 сентября 2010

веб-сервер - это не что иное, как прославленный сервер сокетов с обменом сообщениями.Технология существует с самого первого подключения к сети.У меня был проект полтора года назад, который был похож на то, что вы пытаетесь сделать.Java NIO - лучший выбор для начала, имеет пул соединений и потоков, а также все расширенные возможности, которые нужны веб-серверу, но он немного сложен.если вы хотите, чтобы ОЧЕНЬ хороший базовый уровень начался, проверьте http://www.quickserver.org/ система, которую я написал, была основана на этом, и теперь она обрабатывает около 45 000 устройств на одном сервере, который последний раз слышал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...