Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Обмен сообщениями между программами


Автор: dwik 1.12.2004, 14:11
Подскажите, плиз, как послать сообщение из одной программы и получить его в другой.
Знаю, это как-то можно сделать через TUDPSocket

Если у кого-нить есть примерчик, дайте ссылку.




Автор: <Spawn> 2.12.2004, 12:14
А программы то находятся на разных компьютерах? Если нет, то особого смысла использовать сокеты тут нет. И еще одно - TUDPSocket тебе тут вряд ли поможет, так как UDP это протокол не гаратирующий успешную передачу данных. Тебе нужно использовать, например TCP - компоненты TidTCPClient\TidTCPServer на вкладке IndyClients\IndyServers соответственно. Демки мпожно скачать http://www.indyproject.org/Demos/index.iwp

Автор: Плаха 2.12.2004, 14:46
это то что по сути тебе надо
Цитата
Изготовлением первой части мы сейчас и займемся. Запускаем Delphi и помещаем на форму компонент ServerSocket с вкладки Internet палитры компонентов:
Больше нам ничего не понадобится. Все, что нужно дополнительно указать, так это порт, через который будут связываться наши программы. Я задавал 7766. Берите что-нибудь похожее больше 5000 — не ошибетесь. Кликаем дважды по нашей форме и в обработчике пишем:

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.ShowMainForm:=false;
ServerSocket1.Port:=7766;
ServerSocket1.Active:=true;
end;

Этим кодом мы прячем главную форму, устанавливаем порт (его можно изменять, но главное — чтобы у клиента и сервера значения port были одинаковы) и активируем наш сервер. Теперь он висит в памяти в непрерывном ожидании сообщения от клиента. В качестве домашнего задания модифицируйте этот код так, чтобы при запуске сервер прописывал себя на автозагрузку системы. Сделать это легко, если вы внимательно ознакомились с первым пунктом данной статьи. Теперь займемся самим обработчиком сообщений. Выделяем на форме наш компонент ServerSocket и на вкладке Events инспектора объектов дважды кликаем по свойству OnClienRead:

procedure TForm1.ServerSocket1 ClientRead(Sender: TObject;Socket: TCustomWinSocket);
begin
MessageBox(0,PCHAR(Socket.ReceiveText),"Windows XP", MB_ICONERROR);
end;

Как видим, на экран выбрасывается окно с заголовком "Windows XP" , содержащее строку, пришедшую к нам от клиента в переменной Socket. ReceiveText.
Если с написанием сервера все довольно просто, то создание клиента потребует немного больше времени. Как-никак это ваше основное оружиеsmile. Создаем новый проект и помещаем на форму два Edit'а, две кнопки Button и компонент ClientSocket с вкладки Internet палитры компонентов:
Для начала заведем глобальную переменную булевского типа, которая будет устанавливаться в true при удачном соединении с сервером.

var
Form1: TForm1;
isconnect:boolean=false;

В первом поле должен быть введен IP-адрес машины, на которой должен быть запущен сервер. При нажатии на кнопку Button1 пробуем соединиться:

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address:=Edit1.Text;
ClientSocket1.Port:=7766;
ClientSocket1.Active:=true;
end;

Не забудьте, что перед нажатием на кнопку нужно ввести в поле Edit1 IP-адрес машины противника вида "xxx. xxx.xxx.xxx" (без кавычек), и у клиента и работающего сервера должны совпадать номера порта (в данном случае 7766). Для отслеживания удачного соединения или не менее удачного разъединения выделите Client Socket и в событиях управляйте свойствами OnConnect и OnDisconnect соответственно:

procedure TForm1.ClientSocket1 Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage('Соединение успешное!');
isconnect:=true;
end;

procedure TForm1.ClientSocket1 Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage('Соединение разорвано сервером!');
isconnect:=false;
end;

В случае успешного или неуспешного соединения с сервером мы получим соответствующее сообщение. Осталось только в поле Edit2 ввести нужный текст и нажать Button2:

procedure TForm1.Button2Click(Sender: TObject);
begin
if isconnect then
ClientSocket1.Socket.SendText(edit2. text)
else ShowMessage('Нет соединения!');
end;

Автор: fuckerok 9.12.2004, 08:22
А можно каналы использовать, если программы на одном компутере, только вроде это только под Unix системы smile

Автор: maxim1000 9.12.2004, 10:06
Цитата
А можно каналы использовать, если программы на одном компутере, только вроде это только под Unix системы

каналы есть и под Windows
более того: под Windows они работают по локальной сети

Автор: Akella 11.12.2004, 09:49
держи пример на компонентах UDP

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)