Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Нужна помощь в настройке (?) socketа

Автор: cooler 26.05.2009 0:46

Вот игра есть сетевая, суть такая
2 танка едут навстречу друг другу с разной скоростью, кто первый попадёт в противника - победил или столкнутся.
Примитивная
Но не синхронизируются сервер и клиент. Выдаёт asynchronys socket error
Никак не могу поймать ошибку smile.gif
Может что с компонентами напутал?


Прикрепленные файлы
Прикрепленный файл  Танки.rar ( 20.8 килобайт ) Кол-во скачиваний: 174

Автор: Unconnected 26.05.2009 15:12

Ну так там в диалоге подключения к серверу на обработчике кнопки "принять" вообще ничего не висит... ошибка, которая у тебя вываливается, просто означает что не удалось подключиться, а всё потому, что в свойствах TServerSocket ты не ввёл порт, на котором он будет слушать, а в свойствах TClientSocket тоже не ввёл порт и к тому же адрес, по которому располагается сервер.

Автор: cooler 27.05.2009 2:19

Что-то я совсем запутался, теперь не могу привязать к той кнопке процедуры с параметрами, всё не то
Что там нужно прописать? Помогите, пожалуйста подключить.
И в свойствах не знаю что прописывать, т.к смотрел в похожи программах всё также стоит и работает, нужно ли?

Автор: Unconnected 28.05.2009 0:03

Ну, если будешь удалённо подключаться, т.е. по IP-адресу, то для клиентского сокета будет так:

clientsocket1.port:=1001;
clientsocket1.address:='77.33.44.22'; {Это IP-адрес машины, на которой запущен сервер}
clientsocket1.open;



При подключении серверная часть должна быть запущена, и в её свойствах должен быть установлен порт, на который будет подключаться клиент, в данном случае 1001. Ещё не рекомендуется ставить значение порта меньше 1000, т.к. они якобы используются системой..

Автор: cooler 28.05.2009 0:38

Т.е также open сервер и порт прописываем сначала, а тот ip-адрес можно брать из диалогового окна, которое у меня было?

Автор: Unconnected 28.05.2009 0:41

Даже нужно. И ещё советую почитать про асинхронные сокеты в дельфи.

Автор: cooler 28.05.2009 1:25

Попробую соединиться smile.gif

Автор: cooler 28.05.2009 13:23

Опять не работает
Выдает ещё ошибку с памятью почему-то и ту же асинхронную

Вот на кнопку клиент:

Код
procedure TForm1.N3Click(Sender: TObject);
begin
     if Form2.ShowModal=mrOk then begin
        initgame;
        state:=1;
        client.port:=1001;
        Client.Host:=Form2.Edit1.Text;

        Client.Open;
        StatusBar1.SimpleText:='Связь установлена';
        btnClient.Enabled:=False;
        btnServer.Enabled:=False;
        lblIsServer.Caption:='Клиент';
        lblRightT.Enabled:=True;
     end;
end;



Вот на кнопку принять в клиенте :
Код

ModalResult:=mrOK;


А вот на сервер кнопку:

Код
initgame;
     state:=0;
     server.port:=1001;
     Server.Open;
   if server.Active then
     StatusBar1.SimpleText:='Ожидание';
     btnClient.Enabled:=False;
     btnServer.Enabled:=False;
     lblIsServer.Caption:='Сервер';
     lblLeftT.Enabled:=True;
end;

Автор: Unconnected 28.05.2009 14:28

Client.Host - почему не client.address? Ты вообще как тестируешь - по интернету, по локальной сети или на своей машине?

Автор: cooler 28.05.2009 19:39

Да client.address тоже пробовал
По идее на одной машине должно работать, если даже айпишник не вводить

Автор: Unconnected 28.05.2009 20:55

Это по какой-такой идее?))
Вводить надо, сокет тебе не телепат, чтобы догадываться, куда подключаться) Чтобы подключиться к своей машине, можешь свойству address клиентского сокета присвоить 127.0.0.1 или свойству host того же сокета значение localhost или имя твоего компьютера.

Автор: cooler 28.05.2009 21:04

Цитата
свойству address клиентского сокета присвоить 127.0.0.1

Я это имел ввиду smile.gif
Оно по умолчанию у меня такое, но всё равно даже на одном компьютере не связывается

Автор: Unconnected 28.05.2009 21:06

А брандмауэр Windows выключен? Или может ещё какой установлен?

Автор: cooler 28.05.2009 21:24

выключен, таскал на другие компы и по сети и на одном компе не работает sad.gif

Автор: Unconnected 28.05.2009 22:12

Прикрепи сюда проект.

Автор: cooler 29.05.2009 5:41

Вот


Прикрепленные файлы
Прикрепленный файл  Готова.rar ( 9.76 килобайт ) Кол-во скачиваний: 174

Автор: Unconnected 30.05.2009 0:54

Действительно была ошибка, acsess violation, насколько я понял, происходила после обращения к свойствам компонентов client и server (ты их переименовал). Попробовал удалить их с формы и добавить заново, переписал код под новые названия - заработало, даже поиграть удалось smile.gif
Вот что получилось:

Автор: cooler 30.05.2009 15:44

У меня всё-равно не работает. Точнее клиент-сервер не синхронизируются
А ты как запускал, в какой последовательности?

Автор: Unconnected 30.05.2009 17:02

Открывал 3(три) копии программы, на одной запускал сервер, на двух других - клиенты...

Автор: cooler 30.05.2009 21:17

И ездят и стреляют синхронно? Странно

Автор: Unconnected 30.05.2009 23:54

Едут навстречу друг другу, правда один быстрее, один медленнее, ну и стреляют по нажатию)

Автор: cooler 31.05.2009 16:04

Что за сообщение? blink.gif
Разная скорость и должна быть, только у меня в каждом окне разные игры, а не по сети - не синхронизируется ничего. Не пойму в чём дело.

Автор: Unconnected 31.05.2009 17:45

Цитата

Разная скорость и должна быть, только у меня в каждом окне разные игры, а не по сети - не синхронизируется ничего. Не пойму в чём дело.


Ниччего не понял, в каких таких разных окнах, и что ты подразумеваешь под "синхронизацией"?

Автор: cooler 31.05.2009 19:59

Ты на одном компе тестировал?
Ну так в разных окна запускаешь - в одном сервер, в другом клиент
Так если я левым танком в окне сервер стреляю, то в окне клиент эта пуля должна лететь smile.gif
Т.е всё что делает один пользователь также отображается у другого, не знаю как ещё объяснить, сетевая игра

Автор: cooler 1.06.2009 0:19

Так что?

Автор: Unconnected 1.06.2009 0:27

Можно сказать, я ввёл тебя в заблуждение, сказав, что работает.. Подключиться-то удалось, но "играл" я действительно в одной копии программы, во второй всё это не отображалось. Сейчас попробую разобраться, почему так blink.gif

Автор: cooler 1.06.2009 0:32

Спасибо, если можно то лучше сегодня. Т.к завтра уже нужна

Автор: Unconnected 1.06.2009 0:43

Вот, посмотри, перевешал все события со старых названий сокетов на новые - вроде работает.

Добавлено через 4 мин.
Только глючит она всё равно сильно, на сервере почему-то стрелять можно, а пушка не двигается...

Автор: cooler 1.06.2009 1:04

Архив повреждён
И пушка нужно чтобы двигалась

Автор: Unconnected 1.06.2009 1:28

Как повреждён, всё норм открывается, не докачал наверное...
Про пушку - посмотрю. Кстати, ты сам игру эту писал?


Добавлено через 16 мин.
Пушки двигаются...Более-менее... Глючит всё-равно.

Автор: cooler 1.06.2009 1:59

Спасибо, только теперь двигаются с одинаковой скоростью и косячит при попадании - в одном продолжают двигаться.
Прогу писал частично сам: взял движок и лепил из него что нужно

Автор: Unconnected 1.06.2009 2:10

Скорость - это я поменял, чтобы легче тестировать было, чтобы поставить такую, какая была, поставь значение timer4.interval=50, timer6.interval=100, вроде так было..

Автор: cooler 1.06.2009 2:16

Да, а как ты делал чтобы синхронизировалось хоть немного?
Переименовал что осталось?
Теперь просто пули клиента не видны в окне сервера

Автор: Unconnected 1.06.2009 3:00

Да, переименовал. Хотя можно было и не переименовывать, а просто вызвать конструкторы TServerSocket'а и TClientSocket'а, чего ты в самом начале не сделал, из-за этого и были ошибки. Про пули - ты, кажется, "движок" свой криво скопировал..

Автор: cooler 1.06.2009 4:27

Помогите отловить хотя бы этот косяк

Автор: cooler 3.06.2009 23:18

Помогите пожалуйста доделать хотя бы чтобы пули клиента отображались в окне сервера, срочно нужно

Автор: Unconnected 4.06.2009 1:00

Вроде бы нашёл ошибку, по всей видимости где-то портилось значение isConnect... Закомментировал кое-где проверку на подключение, теперь всё работает, советую детальнее изучить, а заодно и отформатировать код.

Автор: cooler 4.06.2009 1:41

Спасибо большое, там ещё проблема с синхронностью небольшая
когда нажимается кнопка, все танкаи стартуют кроме правого в окне клиента и сбивается поэтому

Автор: Unconnected 4.06.2009 18:19

Попробуй сделать по аналогии, я ж говорю, там где-то IsConnect портится, значит, одна из программ не отправляет вовремя то, что нужно... Либо ищи, где портится, либо, что легче, закомментируй все условия "If isconnect".