|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.02.2010, 17:41 | #1 |
Пользователь
Регистрация: 15.02.2010
Сообщений: 18
|
WSocketServer и WSocket
Для тех кто имел дело с данными компонентами такой вопрос. Как пользоваться WSocketServer? С WSocket я как бы разобрался, а вот с сервером не могу. Помогите пожалуйста)
|
19.02.2010, 19:15 | #2 |
Пользователь
Регистрация: 15.02.2010
Сообщений: 18
|
Не нашёл по данной теме ничего в нете, кроме самого компонента. Но без хелпа
|
19.02.2010, 20:18 | #3 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
Alemas, ну начнем с того, что к компоненту прилагаются примеры
Работа с ним достаточно проста. Для серверного сокета прописываем procedure TDModuleServer.WSocketServerClientC onnect(Sender: TObject; Client: TWSocketClient; Error: Word); begin WriteToLog('Подключился клиент '+Client.PeerAddr, ltApp); Client.LineMode:=False;//у меня прием нетекстовых данных ConnInfoList.AddSocket(Client);//собственная структура Client.OnDataAvailable:=ClientDataA vailable;//принципиально Client.OnError:=SocketError;//факультативно Client.OnBgException:=SocketBgExcep tion;//факультативно Client.OnSocksError:=SocketSocketEr ror;//факультативно Client.OnChangeState:=SocketChangeS tate;//факультативно end; Соответственно указанному прием данных с клиентского сокета идет в procedure TDModuleServer.ClientDataAvailable( Sender: TObject; ErrCode: Word); var TB:TBytes; j:Integer; Client: TWSocketClient; begin Client:=TWSocketClient(Sender); j:=Client.Receive(TB,<n>);//получить n байт, в j - число реально полученных байт ... end; Запуск сервера: WSocketServer.Port:=ServerPort; WSocketServer.Addr:=ServerIP; WSocketServer.Banner:=''; WSocketServer.Listen; Насчет адреса - я для простоты ставлю 0.0.0.0, но это по идее слушать все доступные соединения. Если хотите оптимизировать, то по Overbyte точно не скажу, а вот неделю назад отлаживал сервер на C# на двух машинах с выделенными IP, так вот на одной заработало при указании этого выделенного IP, а на другой - при указании IP локальной сети провайдера. Отправка данных - смотрим методы клиентского сокета. Удачи! |
19.02.2010, 20:44 | #4 |
Пользователь
Регистрация: 15.02.2010
Сообщений: 18
|
Большое спасибо) Но у меня такая ещё проблема. Когда я прописываю порт и хост на сервере/клиенте (хост: 127.0.0.1, порт: 3187) то при подключении ничего не происходит... И вообще зачем на сервере хост прописывать? Есть ещё параметр LocalAddr, но по моему Delphi всё равно что я туда напишу...
|
19.02.2010, 20:47 | #5 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
Я Вам говорил про указание адреса для серверного сокета, адрес для него прописывается, чтобы не тратить ресурсы на прослушивание ненужных сетевых соединений, которых на Вашей машине может быть несколько. Если поставите этот адрес в 0.0.0.0 (прослушивание всех), то клиент с адресом 127.0.0.1 на этой же машине подключится, если адрес для сервера - адрес в сети провайдера или белый Web-IP - проверяйте, какой из вариантов сработает, а 127.0.0.1 для сервера ставить не надо.
Последний раз редактировалось Антон Ю.Б.; 19.02.2010 в 20:51. |
19.02.2010, 21:02 | #6 |
Пользователь
Регистрация: 15.02.2010
Сообщений: 18
|
Вроде всё подключается, работает. Но не работает отправка/чтение данных (ReceiveStr, SendStr)
И объясните пожалуйста как отправлять данные на определённый IP. Вообще как по нормальному отправлять текстовые данные? Просто не понятен принцип работы SendStr Последний раз редактировалось Alemas; 19.02.2010 в 22:09. |
19.02.2010, 21:17 | #7 |
Пользователь
Регистрация: 15.02.2010
Сообщений: 18
|
Вроде всё подключается, работает. Но не работает отправка/чтение данных (ReceiveStr, SendStr)
И объясните пожалуйста как отправлять данные на определённый IP. |
19.02.2010, 21:20 | #8 |
Пользователь
Регистрация: 15.02.2010
Сообщений: 18
|
Вообще как по нормальному отправлять текстовые данные? Просто не понятен принцип работы SendStr
|
19.02.2010, 21:30 | #9 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
Alemas, Вам модераторы вкатят предупреждений за даблпостинг - объединяйте последовательные сообщения.
Если логика работы Вашего сервера реально асинхронна (то есть не в режиме вопрос-ответ, а в режиме произвольных сообщений в обе стороны), то в любом случае необходимо на сервере заводить свою структуру, где хранятся данные об открытых клиентских сокетах и их идентификационной информации в терминах Вашей бизнес-логики (для самого серверного сокета непринципиально, что этот сокет для Вашей логики - Вася, Петя или UIN 123). Если Вам понадобилось отправить сообщение Пете, то ищете в этой структуре Петю, а для соответствующего ему клиентского сокета вызываете Client.Send<...>. На клиенте Вы не просите эти данные когда хотите, а только для сокета в его OnDataAvailable. Логика Client.SendStr - отправка строки. При открытом сокете это работает вполне нормально. Вы, вероятно, вместо этого вызвали WSocketServer.SendStr. |
19.02.2010, 21:44 | #10 |
Пользователь
Регистрация: 15.02.2010
Сообщений: 18
|
Мне нужно что то на подобие ICQ. У меня будет такая схема: Клиент№1>сервер>клиент№2 и в обратную. Также у меня будет БД в которую будет занесён идентификатор каждого пользователя и какая либо информация о нём. На сервера клиентов будет не более 50 чел.
Из Вашего примера понял и написал: //сервак procedure TForm1.WSocketServer1DataAvailable( Sender: TObject; Error: Word); var Server: TWSocketServer; begin Server:=TWSocketServer(Sender); ShowMessage(Server.ReceiveStr); end; //кнопка отправки данных на сервак procedure TForm1.SendBtnClick(Sender: TObject); var Client: TWSocketClient; begin Client:=TWSocketClient(TWSocketClie nt); Client.SendStr('From ' + Client.PeerAddr); end; Последний раз редактировалось Alemas; 19.02.2010 в 22:00. |