![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| nucer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 21.6.2004 Где: Москва Репутация: -1 Всего: 0 |
Есть например такой класс
Это сообщение отредактировал(а) nucer - 1.7.2004, 00:42 |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Смогут. Сделаuте что-нибудь вроде:
-------------------- |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Это механизм семафоров, лучше вынести в отдельный клас. Механизм синхронизации не до конца освоил, но по моему синхронизацию надо брать от socket: synchronized(socket);
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Собственно, у кого забирать лок, разницы особоu нет. Посмотрите фак:
http://forum.vingrad.ru/index.php?showtopic=24781 -------------------- |
|||
|
||||
| nucer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 21.6.2004 Где: Москва Репутация: -1 Всего: 0 |
А если synchronized ( this.socket ) тогда не смогут? И что будет, если в один и тот же сокет одновременно начнут записывать два потока?
|
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Перечитал первыu ваш пост и понял что вчера я его недопонял Другие потоки смогут работать с этим сокетом если получат на него ссылку. Если нужно чтобы в сокет писал только один поток в данныu момент, то приведенныж вами код работать будет, при условии что другие потоки не получают этот сокет, скажем my.socket . Можно сделать socket приватным и тогда вы будете уверены что ничего плохого не произоuдет.
getOutputStream() возврашает output стрим данного сокета. Если несколько потоков одновременно попытаются получить этот стрим и писать в него, то по-моему ничего хорошего не получится. -------------------- |
|||
|
||||
| nucer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 21.6.2004 Где: Москва Репутация: -1 Всего: 0 |
Приватным я его сделать не могу и как раз по ссылке socket и передаётся. Вообще у меня есть класс Server, есть класс Client, для каждого клиента есть свой сокет и не от него зависит что и когда другие клиенты будут ему посылать через этот сокет. И я не пойму, этот synchronized вообще как-нибудь работает?
|
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Погодите, я не понял, речь идет о сервере? Тогда вроде вы используете ServerSocket, в бесконечном цикле опрашиваете его while(true) { clientSocket = serverSocket.accept(); } и облуживаете клиента на сокете которыu открывается для каждого клиента своu причем автоматически.
Если хотите могу запостить код из книжки Java 2 Network Protocols - там есть пример сервера используюшеgо пул потоков для одновременнож работы с многими клиентами. Тем не менее, RMI проше -------------------- |
|||
|
||||
| nucer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 21.6.2004 Где: Москва Репутация: -1 Всего: 0 |
Да я так и делаю. Для каждого клиента создаётся отдельный поток, и потом клиенты посылают друг другу всякие данные. Т.е. один клиент обращается к сокету другого...
|
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Все равно мне не понятно. Может вы бу поподробнее написали?
-------------------- |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Есть еще вариант с классом ThreadLocal, который позволяет иметь отдельную переменную для каждого потока и не использовать синхронизацию, может это вам поможет.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| nucer |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 21.6.2004 Где: Москва Репутация: -1 Всего: 0 |
Вот это Server:
Вот кусок класса User:
Вроде так. Если ещё подробнее, то надо весь исходник выкладывать. Я думаю ни у кого не будет желания разбираться с ним. |
||||
|
|||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Я так понял вашу проблему: необходимо чтобы клиент захватывал блокировку на сокет и работал с ним монопольно, а остальные в этот момент ждали. Если так то вы правильно предпологали.
С одним сокетом может работать только один клиент одновременно, но если сокетов несколько а все равно надо всех синхронизировать, то надо использовать единый объект наподобии TreeLock в AWT.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
| nucer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 21.6.2004 Где: Москва Репутация: -1 Всего: 0 |
Да мне нужно первое их того, что вы сказали. Значит так и буду делать. Спасибо всем за участие
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |