|
|
|
сеть
|
|||
|---|---|---|---|
|
#18+
Есть сервер, есть клиент. Сервер многопоточный, т.е. для каждого соединения создается новый поток. например, клиент и сервер обмениваются сообщениями. все здорово. Вопрос, как сделать, чтобы и клиенты могли друг с другом общаться? Можно просто саму идею подкинуть. И еще одно. текст кода main сервера: ... public static void main(String args[]){ ServerSocket ss = new ServerSocket(2300); for(;;){ Socket client = ss.accept(); ClientThread thread = new ClientThread(client); thread.start(); } } ... Как-то оно так. Так вот, говорят, что за время создания нового экземпляра потока, могут проигнорироваться новые соединения. Это так? Как этого избежать? Ребята, подскажите пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 15:46 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
mastanikТак вот, говорят, что за время создания нового экземпляра потока, могут проигнорироваться новые соединения Кто говорит? по-моему это неправда. mastanikМожно просто саму идею подкинуть как вариант JMS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 15:53 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
Я такую фигню на диплом пишу. Создается список клиентов. Надо там синхронизовать по-моему этот список. так : public void runServer(){ try{ while (true){ Socket us = servSock.accept(); //получить IP адрес машины, а не имя InetAddress hostIP = us.getInetAddress(); ChatHandler cl = new ChatHandler(us, hostIP); synchronized(clients){ //сначала стартовать и проверить //потом добавить в список и разослать всем clients.add(cl); cl.start(); } } }catch(IOException e){ log("Ошибка при работе сервера: "+ e+"\n"); System.exit(0); } } Где /////////////////////////////////////////////////////////// /////////// ВНУТРЕННИЙ КЛАСС юзера чата ////////// ///////////////////////////////////////////////////////// protected class ChatHandler extends Thread { protected Socket clientSock; protected BufferedReader is; protected ObjectOutputStream pw; protected InetAddress ip;//уникальный ip адрес машины //это достается из дерева protected int num;//идентификатор protected String name;//фио public ChatHandler(Socket sock, InetAddress clnt) throws IOException { clientSock=sock; ip=clnt; is=new BufferedReader(new InputStreamReader(sock.getInputStream())); pw=new ObjectOutputStream(sock.getOutputStream()); //////////////////////////////////////////////////////////////// /////////// RUN для нитей //////////////////////// public void run(){ String line; try { //получаем сообщение while ((line=is.readLine())!=null){ //здесь рассылается всем, //но у меня тут слегка наворочено, char c = line.charAt(0);//вид сообщения } } }catch(IOException e){ log("Ошибка в нитях "+ e +"\n" ); }finally{//делается в любом случае log(name + " Отключился\n"); close(); synchronized(clients){ clients.remove(this); if (clients.size()==0){ log("Никого нет\n"); } } } } Очень просто отправлять сообщения всем клиентам сразу. Сервер получает их потока сообщение от кого-либо, потом посылает в поток всем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 15:55 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
окей, а если не прибегать к применению корпоративных технологий? если нужно общаться только 10 людям? и приложению не требуется быть масштабируемым? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:00 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
а можно код оформлять тэгами [ SRC java]...[/ SRC]? -- а? типа так: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:04 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
2 adf: спасибо за пример, но тут как я понял рассылка сразу всем клиентам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:04 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
mastanikокей, а если не прибегать к применению корпоративных технологий? если нужно общаться только 10 людям? и приложению не требуется быть масштабируемым? Че так? :) А если эти 10 челов потом в Сан или Мыкрософт превратятся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:05 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
mastanik2 adf: спасибо за пример, но тут как я понял рассылка сразу всем клиентам? Ну этот пример-да. Я тут комнатки сейчас делаю к звездочкам прибавляются и отсутствие [src]? Сорри, учту ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:10 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
правила форума: http://www.sql.ru/forum/rules.aspx ... Рекомендуется: ... Для повышения удобочитаемости сообщений - пользоваться ... тегом форматирования исходных кодов src. ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:10 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
и какого вырезают мои сообщения??? Народ, по второму вопросу кто-нить прокомментирует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:11 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
2mastanik Я когда с сокетами ознакомился, написал гуёвый чат на swing, там все как adf расписло, если надо, могу дать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:14 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
Вы пишете: mastanikЕсть сервер, есть клиент. Сервер многопоточный, т.е. для каждого соединения создается новый поток. например, клиент и сервер обмениваются сообщениями. все здорово. Вопрос, как сделать, чтобы и клиенты могли друг с другом общаться? Можно просто саму идею подкинуть. Представляется что в вашем случае клиент и сервер - это отдельные приложения. Все клиенты общаются только с сервером. В таком случае можно пойти по технологии чатов в интернете :). Еще аналог Почтовый клиент и Почтовый Сервер. Другая технология состоит в том что приложение которое вы напишите будет являться и клиентом и сервером одновременно (т.е будет прослушивать некий порт и общаться с таким же приложением). Я видел несколько таких чатов для локальной сети. Запускается приложение, далее выбираете компьюторы с которыми вы хотите общаться и общаетесь, при условии если на этих комьюторах тоже будет запущена такая программа. Минус конечно очевиден - вы общаетесь с компьютером (ip в сетях tcp/ip), а не с человеком, который может работать за разными компьютерами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:20 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
wessen2mastanik Я когда с сокетами ознакомился, написал гуёвый чат на swing У тебя рассылка всем была? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:24 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
adf wessen2mastanik Я когда с сокетами ознакомился, написал гуёвый чат на swing У тебя рассылка всем была? да. Ну там стондартно, сервер и много клиентов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:31 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
wessen adf wessen2mastanik Я когда с сокетами ознакомился, написал гуёвый чат на swing У тебя рассылка всем была? да. Ну там стондартно, сервер и много клиентов. А хотя нет, парю я, не так вопрос понял, там у каждого клиента есть список всех остальных, выбираешь мышкой нужного и говоришь с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:35 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
wessen wessen adf wessen2mastanik Я когда с сокетами ознакомился, написал гуёвый чат на swing У тебя рассылка всем была? да. Ну там стондартно, сервер и много клиентов. А хотя нет, парю я, не так вопрос понял, там у каждого клиента есть список всех остальных, выбираешь мышкой нужного и говоришь с ним. дак вот кто мирабилис основал! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:36 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
wessen wessen adf wessen2mastanik Я когда с сокетами ознакомился, написал гуёвый чат на swing У тебя рассылка всем была? да. Ну там стондартно, сервер и много клиентов. А хотя нет, парю я, не так вопрос понял, там у каждого клиента есть список всех остальных, выбираешь мышкой нужного и говоришь с ним. .. Просто у меня задача рассылки по комнатам, приходится че-то придумывать, а это 100% неоптимально. Я вот думала, может кто-то с этим сталкивался... У меня дерево отделов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:43 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
В чем проблема? добавить для клиента новый тип команд, которые будут пересылаться всем (определенным) подключенным клиентам. На сервере храните список открытых сокетов (если этого еще нет) и расталкиваете по ним сообщения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:45 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
Pitbull terrierВ чем проблема? добавить для клиента новый тип команд, которые будут пересылаться всем (определенным) подключенным клиентам. На сервере храните список открытых сокетов (если этого еще нет) и расталкиваете по ним сообщения. Я думала сделать список комнат, в которых будут хранится списки группы пользователей. На сервер приходит номер комнаты и сообщение которое надо разослать по комнате. Тут проблема с иерархией сотрудников. Кто кому имеет право отсылать сообщения (как сказал шеф:"Дворник дядя ваня не имеет право посылать запрос на открытие комнаты с директором тетей Зоей. А вот тетя Зоя имеет право"). Причем дерево может быть несбалансированным и уровней нефиксированное количество ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:51 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
херась тут думатьjms все проблемы решит чтобы был jms нужен сервер приложение, а это уже совсем другая история.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:54 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
херась тут думатьjms все проблемы решит Да? Этож диплом! И его надо еще дописать за 7 дней ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:55 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
adfЭтож диплом! И его надо еще дописать за 7 дней:) ты справишься :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 16:58 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
А.Грасоff™ JE adfЭтож диплом! И его надо еще дописать за 7 дней:) ты справишься :) :)Ладно бы этот долбанный чат, там еще и базка данных недописанная... Я чувствую каким-то местом, что я лишусь стабильного 8-часового крепкого сна и прочих радостей жизни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 17:02 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
wessen херась тут думатьjms все проблемы решит чтобы был jms нужен сервер приложение, а это уже совсем другая история.... ни нужен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 17:04 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
как вариант воспользоваться широковещательной рассылкой. вместо того чтобы хранить список клиентов и в цикле всем им слать сообщение, к тому же так быстрее будет рабоать, хотя какая, к слову скорость для диплома? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 17:06 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
black zorroкак вариант воспользоваться широковещательной рассылкой. вместо того чтобы хранить список клиентов и в цикле всем им слать сообщение, к тому же так быстрее будет рабоать, хотя какая, к слову скорость для диплома? :)) Главное чтобы хоть как-нибудь работал, а пока вообще не работает. Тут же еще типа вопросы "безопасности" есть. У меня в клиенте предполагается проверка запроса, а потом на сервере. Смешно самой. Зато по правилам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 17:09 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
неа wessen херась тут думатьjms все проблемы решит чтобы был jms нужен сервер приложение, а это уже совсем другая история.... ни нужен Просвети не знающих. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 17:19 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
wessen неа wessen херась тут думатьjms все проблемы решит чтобы был jms нужен сервер приложение, а это уже совсем другая история.... ни нужен Просвети не знающих. тынц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 17:30 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
Ребзя! давайте вернемся к истоку... во-первых, так никто и не ответил на второй МОЙ вопрос. во-вторых, Я диплом еще не пишу, пока только бакалаврскую (и то не по теме),и мне хотелось бы узнать КАК один клиент может послать сообщение другому через сервер, если сокеты создается в бесконечном цикле прослушивания? Или надо создать массив сокетов и потом по индексу каким-то раком рассылать... Широковещательная рассылка не особо требуется. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 21:43 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
2wessen wessenЯ когда с сокетами ознакомился, написал гуёвый чат на swing, там все как adf расписло, если надо, могу дать спасибо, но не надо. хочется все-таки самому написать, но с маленькой помощью. Так что там со вторым вопросом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 21:51 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
mastanik2wessen wessenЯ когда с сокетами ознакомился, написал гуёвый чат на swing, там все как adf расписло, если надо, могу дать спасибо, но не надо. хочется все-таки самому написать, но с маленькой помощью. Так что там со вторым вопросом? Проще чем пример, который я тебе привела (это почти весь сервер), не получится наверно. Это и не корпоративная штука ( или как ты там назвал) и предназначена как раз для малого числа пользователей. И че за "второй вопрос"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 22:01 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
adfПроще чем пример, который я тебе привела (это почти весь сервер), не получится наверно. я и не пытаюсь написать как проще, хочется главное самому. adfИ че за "второй вопрос"? повторяю: препод сказал, что во время создавания нового экземпляра потока и его запуска Код: plaintext 1. 2. могут поступить несколько запросов на соединение, которые будут игнорированы. в чем вопрос: это так? если так, то как избежать? корпоративная штука...гы8) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 22:53 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
mastanikпрепод сказал, что во время создавания нового экземпляра потока и его запуска Код: plaintext 1. 2. могут поступить несколько запросов на соединение, которые будут игнорированы. в чем вопрос: это так? если так, то как избежать? а сколько лет преподу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2005, 23:11 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
mastanik повторяю: препод сказал, что во время создавания нового экземпляра потока и его запуска Код: plaintext 1. 2. могут поступить несколько запросов на соединение, которые будут игнорированы. в чем вопрос: это так? если так, то как избежать? Я ж тебе уже сразу на него по-моему ответила (это про синхронизацию) Можешь его успокоить такими словами: "Из документации по классу ServerSocet следует, что метод accept() не синхонизирован, то есть этот метод может быть вызван любым количестом нитей. Это действительно может приводить к нежелательным последствиям, поэтому при вызове рекомендуется использовать синхронизацию, что мы и делаем! Тем самым гарантируется, что только один клиент запустит этот метод в данный момент времени. Т. о. будет только одна нить, запущенная в методе accept() и n-1 ожидающих соединения" /Для пущей убедительности потрясать какой-нибудь толстой книжкой по Яве и аппелировать к Яну Ф. Дарвину, текст из книги "Java. Сборник рецептов" которого я тебе недословно привела/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 08:31 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
? wessen неа wessen херась тут думатьjms все проблемы решит чтобы был jms нужен сервер приложение, а это уже совсем другая история.... ни нужен Просвети не знающих. тынц Эта штука стремится ставить себя как виндовский сервис. Если это не сервер, то зачем эти телодвижения??? Баян!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 11:13 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
Препод не прав, тут дело даже не в Java. Когда создается серверный сокет, создается буфер в который помещаются все запросы но соединения, это делает сама ОС. Когда создается класс ServerSocket, то вероятно(точно не знаю, но по другому то и не как вроде) создается специальный поток, который этот самый буфер сканирует и как только туда попадает запрос, то метод accept создает Socket и возвращает его. Кстати, про метод accpet написано: ...The method blocks until a connection is made. Следовательно синхронизировать его не надо. Когда мы находимся в методе accept или уже вышли из него и создаем клиентский поток и чего нибудь еще там делается, то конечно же может поступить еще пара сотен запросов на соединение, так вот, они не куда не пропадут, они попадут в буфер и следующий вызов метода accept создаст сокет, запрос на который пришол последним, но уже после того, как мы были внутри accept :) Вот так бы я препода грузонул. Все ИМХО кстати. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 11:29 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
Всем спасибо, особенно wessen и adf. грасофа сколько лет преподу? Скока лет точно не знаю, но этот перец, в дополнение к преподавательству, работает техдиром кой-какой компании, тесно связанной с Sun Microsystems. 2wessen автор...The method blocks until a connection is made. а где ты это прочел? Может я чего упустил, но КАК ПЕРЕДАТЬ СООБЩЕНИЕ ОТ ОДНОГО ПОТОКА ДРУГОМУ? спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 12:31 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
а где ты это прочел? Эта страница должна быть стартовой в твоем браузере :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 12:34 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
mastanik Может я чего упустил, но КАК ПЕРЕДАТЬ СООБЩЕНИЕ ОТ ОДНОГО ПОТОКА ДРУГОМУ? спасибо можно так: для каждого потока создаешь очередь сообщений (FIFO стек), которую он будет "слушать" (периодически пытаться выбирать элементы) и, если есть новые сообщения, обрабатывать их. Ссылки на очереди регистрируешь в каком-нть общедоступном вспомогательном классе, завязываешь их на идентификаторы твоих потоков. Когда надо передать сообщение потоку - выбираешь его очередь и передаешь ей сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 12:55 |
|
||
|
сеть
|
|||
|---|---|---|---|
|
#18+
авторЭта страница должна быть стартовой в твоем браузере :) Да, у меня есть апи спецификация скаченная, просто подумал может еще какой хороший источник есть. 2Pitbull terrier я что-то такое и задумывал...но обмозговать все нормально не могу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2005, 13:59 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2152511]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
90ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 421ms |

| 0 / 0 |
