Помощь - Поиск - Пользователи - Календарь
Полная версия: Сетевая игрушка
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Venom
Задали написать сетевую игрушку "ножницы-бумага-камень", а я до этого сетевые проги вообще не писал, поэтому не пинайте сильно если что не так сделал smile.gif
У меня сделано так, что как только к серверу подключился клиент активным становится у сервера и у клиента только RadioGroup, а кнопка "Ход" остается затемненной. А мне надо еще чтобы как только сервер или клиент выбрали один из вариантов в RadioGroup , то RadioGroup сразу становится неактивным. Кнопка "Ход" должна стать активной у обоих только тогда, когда и сервер и клиент выберут свои варианты, а как это сделать я без понятия.

PS: Программа запускается либо как сервер, либо как клиент, который должен подключиться к серверу. Поиск сервера происходит с помощью UDP протокола. Для того, чтобы поиграть на одном компе, нужно запусти программу два раза, в одной выбрать сервер, в другой клиент и ввести в поле ввода IP адреса 127.0.0.1 у клиента и нажать "старт игры".
Unconnected
А можно узнать, зачем используются все эти UPD компоненты?
Venom
UPD используются для локальной сети, для того чтобы клиент, незная IP сервера, мог обнаружить и подключиться к серверу.
andriano
Цитата(Venom @ 25.12.2009 17:23) *
PS: Программа запускается либо как сервер, либо как клиент, который должен подключиться к серверу. Поиск сервера происходит с помощью UDP протокола. Для того, чтобы поиграть на одном компе, нужно запусти программу два раза, в одной выбрать сервер, в другой клиент и ввести в поле ввода IP адреса 127.0.0.1 у клиента и нажать "старт игры".
Вообще-то существует способ определения, в каком режиме работать программе: клиента или сервера, без лишних вопросов пользователю.
Для этого программа посылает широковещательный запрос и ждет. Ждать может долго.
Дождалась и приняла пакет. Она на этом этапе должна реагировать на 2 типа пакетов: "запрос сервера" и "ответ сервера". Если получен пакет "ответ сервера", то программа понимает, что она - клиент.
Если получен пакет "запрос сервера", программа объявляет себя сервером и отсылает обратно пакет "ответ сервера".
Unconnected
Venom, а у тебя работает этот автоматический поиск сервера? У меня, на D2007, не работает (тестирую на одном, своём компьютере, а ведь он по идее должен и на одном обнаруживать).

Если тебе нужно автоматическое нахождение сервера, то это можно сделать средствами только TClientSocket\TServerSocket.

Посмотри здесь, я там выкладывал пример сетевой игры с широковещанием на вышеупомянутых компонентах.
andriano
Цитата(Unconnected @ 25.12.2009 20:54) *
Если тебе нужно автоматическое нахождение сервера, то это можно сделать средствами только TClientSocket\TServerSocket.
Не "только", а "в частности".
Venom
Unconnected, у меня на одном компе не работает. Скачал спички из соседней темы и они тоже не могут сервер на одном моем компе найти.

А все-таки можно мой способ реализовать с активными и неактивными компонентами или лучше все переделать, а переделывать я пока незнаю как?
Unconnected
Цитата
Скачал спички из соседней темы и они тоже не могут сервер на одном моем компе найти.


А у меня находят замечательно, как думаешь, в чем проблема?

Добавлено через 1 мин.
Надеюсь, ты сначала запускаешь программу, выбираешь сервер, потом запускаешь ещё одну копию этой программы и выбираешь клиент...
Venom
Незнаю в чем проблема.
Когда у меня комп соединен с инетом, то просто ничего не находится, когда отключаю инет и запускаю два окна проги, в одном сервер, в другом клиент, у меня начинают вылазить ошибки Socket Error 10065, вроде это означает невозможность установления связи с сервером.
Unconnected
Смотри прикреплённый скриншот. Могу ещё видео снять.

Может, дело в каких-то твоих особо жестоких брандмауэрах\антивирусах?

PS: то, что замазано серым - мой IP.
Venom
Unconnected, у тебя компьютер, случайно, не подсоединен к какой-нибудь локальной сети? Потому что сегодня проверял на компе который соединен с локалкой, там udp отлично находит сервак даже когда игра запущена на одной машине, а на автономной машине не прокатывает. У знакомого, который пишет аналогичную игрушку, также.
Unconnected
Ни к какой не подсоединён. Я тебе говорю про широковещание на сокетах на любом компьютере, а ты мне про UPD только в локалке...

Кстати, слабо представляю, как такое может быть, чтобы на одиночном компьютере не находило, а вот именно в локальной сети - находило.

PS: не увидел сразу пост andriano.

Цитата
Если тебе нужно автоматическое нахождение сервера, то это можно сделать средствами только TClientSocket\TServerSocket.

Не "только", а "в частности".


Я имел в виду "только лишь средствами...", т.е. можно сделать без UDP.
andriano
Unconnected, ты имеешь в виду протокол UDP или что-то другое?
Если его, то я, например, использовал его с помощью лишь WinAPI без всяких TClientSocket\TServerSocket.
Unconnected
Цитата
Unconnected, ты имеешь в виду протокол UDP или что-то другое?


Я имел в виду, что можно обойтись без классов, реализующих работу с UDP; используя лишь TClientSocket\TServerSocket, которые, насколько помню, работают с TCP\IP.
Venom
Вроде работает как надо.
Unconnected, можешь проверить широковещание, а то у меня оно так и не работает даже когда все антивирусы и фаерволы отключаю. Незнаю в чем причина.

Осталось только доделать чтобы нельзя было запускать на одном компе два сервера и два клиента. Сделал обработку на два сервера аналогично как в спичках, но мне все равно вылазит окно с ошибкой от винды, а не мое showmessage. Помогите решить проблему...

PS: кажется до этого выложил неработающий вариант)
Unconnected
Цитата
Вроде работает как надо.


Что работает как надо?

Кстати, я, кажется, поспешил и ошибся, сказав, что широковещание можно сделать с помощью TClient/ServerSocket. Сейчас посмотрел протокол UDP, посмотрел Спички, там всё на UDP сделано.

Сейчас постараюсь разобраться, как сделать с дейтаграммами.
Venom
Сделал что два сервера нельзя запустить на одном компе, но все еще можно запустить 2 клиента.
Помогите сделать чтобы не запускались два клиента на одной машине и прога будет полностью готова rolleyes.gif

Это код, где описывается, что можно запускать только один сервер. Пытался аналогично сделать для клиента, но почему-то не срабатывает sad.gif

procedure TNewGame.Button1Click(Sender: TObject);
begin
If RadioGroup1.itemindex=0 Then
Begin
try
Main.ServerSocket1.Active:=True;
Main.game_server:=True;
Main.IdUDPServer1.Active:=True;
Main.IdUDPServer2.Active:=False;
Main.IdUDPClient1.Active:=False;
Main.Label1.Visible:=true;
Main.Label1.Caption:='Ожидание игрока';
NewGame.ModalResult:=mrOK;
except ShowMessage('Сервер уже запущен');
end;

End;
If (RadioGroup1.itemindex=1) and (edit1.Text<>'') Then
Begin
If Edit1.Text='' Then Exit;
Main.ClientSocket1.Active:=False;
Main.ClientSocket1.Port:=3703;
Main.ClientSocket1.Address:=Edit1.Text;
Main.ClientSocket1.Active:=True;
Main.game_server:=False;
ModalResult:=mrOK;
inc(main.i);
End
end;
Unconnected
Ну попробуй взять в try\except второй кусок кода, где клиентские сокеты открываются. Попробуй с помощью трассировки выявить, на какой именно строке ошибка.
Venom
Пробовал так сделать, там ошибки ни какой не появляется, вторая программа-клиент сообщает, что успешно соединена с сервером и все. Поэтому я незнаю что сделать.
Unconnected
Давай сначала определимся. Ты сказал, что
Цитата

но все еще можно запустить 2 клиента.


Каких именно клиента? В UDP не знаю, а в TClientSocket если попытаться открыть сокет на порту(порте?smile.gif), где уже висит ещё один сокет - будет ошибка, да. Можешь повесить на событие OnError TClientSocket'а примерно следующий код:


...
errorcode:=0;
showmessage('Произошла ошибка!');
...


Вообще, у твоей программы немного странная логика. Я бы советовал сделать всё по образу и подобию спичек.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.