Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ServerSocket+многопоточность, возникла проблема с многопоточностью 
:(
    Опции темы
esi
Дата 28.5.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.3.2009

Репутация: нет
Всего: нет



Помогите разобраться с многопоточностью ServerSocket. Создаю serverSocket, для каждого клиента создаю отдельный поток и имитирую задержку ответа в 3 секунды. Запускаю сервер, открываю 3 окна браузера и из каждого одновременно отправляю запрос на сервер. Тем не менее, ответы не приходят одновременно, а последовательно. В чем может быть причина? (вместо sleep пробовал длинный for, результат такой-же) Как можно реализовать такую ситуацию, чтобы запросы действительно обрабатывались параллельно?
 
Код

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

public class BoringServer {
    public static void main(String [] args) {
        try {
            ServerSocket srvSock = new ServerSocket(5555);
            while(true) {
                Socket connection = srvSock.accept();
                (new Worker(connection)).start();
            }
        }catch(IOException e) {e.printStackTrace();}
    }
}

class Worker extends Thread {
    Socket sock = null;
    Worker(Socket s) {
        sock = s;
    }
    
    public void run() {
        try
        {
            System.out.println("accepted");
            try    {
                Thread.sleep(3000);
            }catch (InterruptedException e)    {e.printStackTrace();}
            System.out.println("closed");
            sock.close();
        }catch (IOException e) {e.printStackTrace();}
    }
}



PM MAIL   Вверх
COVD
Дата 28.5.2009, 13:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



ваш сервер принимает запросы последовательно (accept() в одном потоке), а обработка запросов (в вашем случае это sleep ) происходит параллельно ( в разных потоках). Если вы установите случайное время (а не 3 сек всем) обработки для каждого запроса, то обнаружите, что ответы на некоторые поздние запросы возвращаются раньше, чем на более ранние. Это и будет подтверждением параллельности обработки.

Это сообщение отредактировал(а) COVD - 28.5.2009, 13:16
PM MAIL   Вверх
esi
Дата 28.5.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.3.2009

Репутация: нет
Всего: нет



попробовал установить случайное время для обработки запросов - результат такой-же, с той разницей, что при одновременной отправке 3 запросов в первом случае ответ приходил через 3,6,9 секунд соответственно, при случайном времени обработки - не так равномерно, но суть не меняется, поскольку на сервере сообщения "accepted" и "closed" выводятся строго последовательно независимо от равномерности поступления запроса и порядок прихода ответов не меняется. 

Можно ли как-нибудь принимать accept()  не последовательно, а параллельно с использованием одного порта?
PM MAIL   Вверх
esi
Дата 28.5.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.3.2009

Репутация: нет
Всего: нет



при переделывании на UDP (DatagramSocket) работает без проблем, похоже, проблема именно в TCP. Пробовал создавать несколько потоков и в каждом из них вызывать accept - результат такой-же - запросы обрабатываются все равно последовательно. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0404 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.