Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2010, 17:41   #1
Alemas
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 18
Сообщение WSocketServer и WSocket

Для тех кто имел дело с данными компонентами такой вопрос. Как пользоваться WSocketServer? С WSocket я как бы разобрался, а вот с сервером не могу. Помогите пожалуйста)
Alemas вне форума Ответить с цитированием
Старый 19.02.2010, 19:15   #2
Alemas
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 18
По умолчанию

Не нашёл по данной теме ничего в нете, кроме самого компонента. Но без хелпа
Alemas вне форума Ответить с цитированием
Старый 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
Alemas
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 18
По умолчанию

Большое спасибо) Но у меня такая ещё проблема. Когда я прописываю порт и хост на сервере/клиенте (хост: 127.0.0.1, порт: 3187) то при подключении ничего не происходит... И вообще зачем на сервере хост прописывать? Есть ещё параметр LocalAddr, но по моему Delphi всё равно что я туда напишу...
Alemas вне форума Ответить с цитированием
Старый 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
Alemas
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 18
По умолчанию

Вроде всё подключается, работает. Но не работает отправка/чтение данных (ReceiveStr, SendStr)
И объясните пожалуйста как отправлять данные на определённый IP.

Вообще как по нормальному отправлять текстовые данные? Просто не понятен принцип работы SendStr

Последний раз редактировалось Alemas; 19.02.2010 в 22:09.
Alemas вне форума Ответить с цитированием
Старый 19.02.2010, 21:17   #7
Alemas
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 18
По умолчанию

Вроде всё подключается, работает. Но не работает отправка/чтение данных (ReceiveStr, SendStr)
И объясните пожалуйста как отправлять данные на определённый IP.
Alemas вне форума Ответить с цитированием
Старый 19.02.2010, 21:20   #8
Alemas
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 18
По умолчанию

Вообще как по нормальному отправлять текстовые данные? Просто не понятен принцип работы SendStr
Alemas вне форума Ответить с цитированием
Старый 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
Alemas
Пользователь
 
Регистрация: 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.
Alemas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц