OPF_Nik
Сообщений: 49
Оценки: 0
Присоединился: 2009-11-06 12:00:12.700000
|
Народ нашел код для чата на два компа! Проблема в том что работет через раз, иногда сервер не находит(( не подскажите в чем проблема? вроде бы все правильно.. Код программы: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp; type TForm1 = class(TForm) ServerSocket1: TServerSocket; ClientSocket1: TClientSocket; Port: TEdit; Name: TEdit; Send: TEdit; Host: TEdit; Memo1: TMemo; ServerOn: TButton; Client: TButton; SendText: TButton; ServerOff: TButton; procedure FormCreate(Sender: TObject); procedure ServerOnClick(Sender: TObject); procedure ServerOffClick(Sender: TObject); procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure SendTextClick(Sender: TObject); procedure ClientClick(Sender: TObject); procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Port.Text:='454'; // при проверке программы на одном ПК Host.Text:='127.0.0.1'; // поле Memo и Send просто очистим Send.Clear; Memo1.Lines.Clear; //блокируем клавишу Закрыть сервер ServerOff.Enabled:= False; end; procedure TForm1.ServerOnClick(Sender: TObject); Begin // клавишу Client, ServerOn и поля Host, Port надо заблокировать, // а ServerOff разблокировать соответственно ServerOn.Enabled:=False; Client.Enabled:=False; Host.Enabled:=False; Port.Enabled:=False; ServerOff.Enabled:=True; // запишем указанный порт в ServerSocket ServerSocket1.Port:=StrToInt(Port.Text); // создание сервер ServerSocket1.Active:=True; // добавим в Memo сообщение с временем создания Memo1.Lines.Add('['+TimeToStr(Time)+'] Сервер создан '); end; procedure TForm1.ServerOffClick(Sender: TObject); Begin // клавишу Client, ServerOn и поля Host, Port разблокируем, ServerOff заблокируем Client.Enabled:=True; Host.Enabled:=True; Port.Enabled:=True; ServerOff.Enabled:=False; ServerOn.Enabled:=True; // закрываем сервер ServerSocket1.Active:=False; // выводим сообщение в Memo Memo1.Lines.Add('['+TimeToStr(Time)+'] Сервер закрыт!'); end; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin // добавим в Memo сообщение с временем подключения пользователя Memo1.Lines.Add('['+TimeToStr(Time)+'] Подключился пользователь.'); end; procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); begin // добавим в Memo клиентское сообщение Memo1.Lines.Add(Socket.ReceiveText()); end; procedure TForm1.SendTextClick(Sender: TObject); begin // проверка, в каком режиме находится программа If ServerSocket1.Active=True then // отправляем сообщение с сервера ServerSocket1.Socket.Connections[0].SendText('['+TimeToStr(Time)+'] '+Name.Text+': '+Send.Text) else // отправляем сообщение с клиента ClientSocket1.Socket.SendText('['+TimeToStr(Time)+'] '+Name.Text+': '+Send.Text); // отобразим сообщение в Memo Memo1.Lines.Add('['+TimeToStr(Time)+'] '+Name.Text+': '+Send.Text); Send.Clear; end; procedure TForm1.ClientClick(Sender: TObject); begin If Client.Tag=0 then Begin // клавишу ServerOn, ServerOff и поля Host, Port заблокируем ServerOff.Enabled:=False; ServerOn.Enabled:=False; Host.Enabled:=False; Port.Enabled:=False; // запишем указанный порт в ClientSocket ClientSocket1.Port:=StrToInt(Port.Text); // запишем хост и адрес ClientSocket1.Host:=Host.Text; ClientSocket1.Address:=Host.Text; // запускаем клиента ClientSocket1.Active:=True; // изменяем тэг Client.Tag:=1; // меняем надпись клавиши Client.Caption:='Отключиться'; end else Begin // клавишу ServerOn и поля Host, Port разблокируем ServerOn.Enabled:=True; ServerOff.Enabled:=False; Host.Enabled:=True; Port.Enabled:=True; // закрываем клиента ClientSocket1.Active:=False; // выводим сообщение в Memo Memo1.Lines.Add('['+TimeToStr(Time)+'] Сессия закрыта.'); // возвращаем тэгу исходное значение Client.Tag:=0; // возвращаем исходную надпись клавиши Client.Caption:='Подключиться'; end; end; procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); begin // добавим в Memo пришедшее сообщение Memo1.Lines.Add(Socket.ReceiveText()); end; procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin // добавим в Memo сообщение о соединении с сервером Memo1.Lines.Add('['+TimeToStr(Time)+'] Подключение к серваку.'); end; procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin // добавим в Memo сообщение о потере связи Memo1.Lines.Add('['+TimeToStr(Time)+'] Сервер не был найден.'); end; procedure TForm1.FormActivate(Sender: TObject); begin Name.SetFocus; end; end.
|