-
мы работаем над проектом Ангор (саморазвивающийся мир). Онлайн игра. http://angor.3dn.ruВопрос: клиентская часть не находит сервер. тестировал на своем компьютере(localhost). приложение консольное. использовал TClientSocket; написал мелкое оконное приложение, проблем нет, находит сервер и устанавливает соединение. ---------------------------- помогите!
-
Лошадью ходи.
-
> Вопрос: > клиентская часть не находит сервер.
вопрос: какие ошибки, как подключаешься?
-
ошибок нет никаких... просто пишет что ищет сервер...
события соединение не происходит
-
код подключения где? где пишет?
-
unit uClient;
interface
uses SysUtils, Classes, ScktComp;
type TDataModule1 = class(TDataModule) ClientSocket1: TClientSocket;
procedure ClientSocket1Lookup(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Connecting(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } procedure sendMsg; // процедура отправки сообщения серверу procedure initClient; // инициализация модуля procedure finitClient; // финализация модуля end;
var DataModule1: TDataModule1; clientname: string; // храним имя ангор.клиента implementation
uses uMenu;
{$R *.dfm}
//------------------------------------------------------------------------------ // Инициализация сокета, открытие соединения //------------------------------------------------------------------------------ procedure TDataModule1.initClient; var do_connect: Boolean; begin ClList.Add('Инициализация соединения'); {Показываем окно установки соединения с сервером} //Form2 := TForm2.Create(Application); {do_connect = True, если была нажата кнопка Connect} do_connect := true; //(Form2.ShowModal = mrOk); clientname := 'Cln.ang.tst';//Form2.Edit3.Text; {Уничтожаем форму} //Form2.Free; {Если была нажата кнопка Cancel, то уходим отсюда} if not do_connect then Exit; {Если соединение уже установлено, то обрываем его} if DataModule1.ClientSocket1.Active then DataModule1.ClientSocket1.Close; {Устанавливаем свойства Host и Port} DataModule1.ClientSocket1.Host := 'localhost'; DataModule1.ClientSocket1.Port := 4232; {Пытаемся соединиться} DataModule1.ClientSocket1.Open; //ClList.Add('Инициализация выполнена'); end; //------------------------------------------------------------------------
//------------------------------------------------------------------------------ // Закрытие сетевого подключения //------------------------------------------------------------------------------ procedure TDataModule1.finitClient; begin ClList.Add('Закрываем соединение'); {Закрываем соединение (если оно установлено)} if DataModule1.ClientSocket1.Active then DataModule1.ClientSocket1.Close; ClList.Add('Cоединение успешно закрыто!'); end; //------------------------------------------------------------------------
//------------------------------------------------------------------------------ // Обработка ошибок //------------------------------------------------------------------------------ procedure TDataModule1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin {Если произошла ошибка, выводим ее код в Memo1} {Insert вставляет строку в указанную позицию (в данном случае - 0 - в начало)} ClList.Add('Ошибка сокета ('+IntToStr(ErrorCode)+')'); end; //------------------------------------------------------------------------
//------------------------------------------------------------------------------ // Поиск сервера //------------------------------------------------------------------------------ procedure TDataModule1.ClientSocket1Lookup(Sender: TObject; Socket: TCustomWinSocket); begin {Сообщаем о том, что идет поиск хоста} ClList.Add('Одну минуту, ищем сервер...'); end; //------------------------------------------------------------------------
-
//------------------------------------------------------------------------------ // Процесс стыковки //------------------------------------------------------------------------------ procedure TDataModule1.ClientSocket1Connecting(Sender: TObject; Socket: TCustomWinSocket); begin {соединяемся...} ClList.Add('Сервер найцден, соединяемся...'); end; //------------------------------------------------------------------------
//------------------------------------------------------------------------------ // При удачном соединении //------------------------------------------------------------------------------ procedure TDataModule1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin {соединились!} ClList.Add('Соединение прошло успешно! Грац!'); end; //------------------------------------------------------------------------
//------------------------------------------------------------------------------ // Отсоединились //------------------------------------------------------------------------------ procedure TDataModule1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin {отсоединились :(} ClList.Add('Отсоединились'); end; //------------------------------------------------------------------------
//------------------------------------------------------------------------------ // Читаем данные с сокета //------------------------------------------------------------------------------ procedure TDataModule1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var s,from_,to_: string; begin {присваиваем s полученную от сервера строку} s := Socket.ReceiveText; {Если сервер посылает нам User List} if Copy(s,1,2) = '#U' then begin Delete(s,1,2); {Чистим ListBox1} //ListBox1.Items.Clear; {Добавляем по одному юзеру в список. Имена юзеров разделены знаком ";"} while Pos(';',s) > 0 do begin //ListBox1.Items.Add(Copy(s,1,Pos(';',s)-1)); Delete(s,1,Pos(';',s)); end; Exit; end;
{Если нам прислали общее сообщение (видимое для всех юзеров)} if Copy(s,1,2) = '#M' then begin Delete(s,1,2); {Добавляем его в Memo1} ClList.Add(Copy(s,1,Pos(';',s)-1)+'> '+ Copy(s,Pos(';',s)+1,Length(s)-Pos(';',s))); Exit; end;
{Если нам прислали запрос на наше имя юзера} if Copy(s,1,2) = '#N' then begin {Посылаем ответ} Socket.SendText('#N'+clientname); Exit; end;
{Если нам прислали приватное сообщение (или не нам :) )} if Copy(s,1,2) = '#P' then begin Delete(s,1,2); {Выделяем в to_ - кому оно предназначено} to_ := Copy(s,1,Pos(';',s)-1); Delete(s,1,Pos(';',s)); {Выделяем в from_ - кем отправлено} from_ := Copy(s,1,Pos(';',s)-1); Delete(s,1,Pos(';',s)); {Если оно для нас, или написано нами - добавляем в Memo1 (иногда полезно убрать этот оператор if :) )} if (to_ = clientname)or(from_ = clientname) then ClList.Add(from_+' (private) > '+s); Exit; end; end; //------------------------------------------------------------------------
//------------------------------------------------------------------------------ // Процедура отправки сообщения серверу //------------------------------------------------------------------------------ procedure TDataModule1.sendMsg; var s: string; begin {Если мы хотим послать приватное сообщение, но не выбрали адресата - нас покарают замечанием :) и выгонят из обработчика} //if (CheckBox1.Checked)and(ListBox1.ItemIndex < 0) then //begin //ShowMessage('At first you should select the user in the User List!'); //Exit; //end;
{Если это приватное сообщение} if false{CheckBox1.Checked} then s := '#P'+ {ListBox1.Items[ListBox1.ItemIndex]+}';' {добавляем спец.команду и адресат} else {А если не очень приватное?} s := '#M'; {Просто спец.команду} {Добавляем наше имя (от кого) и само сообщение} s := s + clientname + ';' + 'текст сообщения'{Edit1.Text}; {Посылаем все это добро по сокету} ClientSocket1.Socket.SendText(s); end; //------------------------------------------------------------------------
end.
-
почему-то событие "ClientSocket1Connecting", так и не происходит....
Еще раз повторяю, приложение консольное, использовал модуль с DataModule, для того чтоб разместить в нем TClientSocket
-
все, разобрался... сделал обработчик событий
-
|