Задали написать сетевую игрушку "ножницы-бумага-камень", а я до этого сетевые проги вообще не писал, поэтому не пинайте сильно если что не так сделал У меня сделано так, что как только к серверу подключился клиент активным становится у сервера и у клиента только RadioGroup, а кнопка "Ход" остается затемненной. А мне надо еще чтобы как только сервер или клиент выбрали один из вариантов в RadioGroup , то RadioGroup сразу становится неактивным. Кнопка "Ход" должна стать активной у обоих только тогда, когда и сервер и клиент выберут свои варианты, а как это сделать я без понятия.
PS: Программа запускается либо как сервер, либо как клиент, который должен подключиться к серверу. Поиск сервера происходит с помощью UDP протокола. Для того, чтобы поиграть на одном компе, нужно запусти программу два раза, в одной выбрать сервер, в другой клиент и ввести в поле ввода IP адреса 127.0.0.1 у клиента и нажать "старт игры".
Unconnected
25.12.2009 17:50
А можно узнать, зачем используются все эти UPD компоненты?
Venom
25.12.2009 17:54
UPD используются для локальной сети, для того чтобы клиент, незная IP сервера, мог обнаружить и подключиться к серверу.
andriano
25.12.2009 18:12
Цитата(Venom @ 25.12.2009 17:23)
PS: Программа запускается либо как сервер, либо как клиент, который должен подключиться к серверу. Поиск сервера происходит с помощью UDP протокола. Для того, чтобы поиграть на одном компе, нужно запусти программу два раза, в одной выбрать сервер, в другой клиент и ввести в поле ввода IP адреса 127.0.0.1 у клиента и нажать "старт игры".
Вообще-то существует способ определения, в каком режиме работать программе: клиента или сервера, без лишних вопросов пользователю. Для этого программа посылает широковещательный запрос и ждет. Ждать может долго. Дождалась и приняла пакет. Она на этом этапе должна реагировать на 2 типа пакетов: "запрос сервера" и "ответ сервера". Если получен пакет "ответ сервера", то программа понимает, что она - клиент. Если получен пакет "запрос сервера", программа объявляет себя сервером и отсылает обратно пакет "ответ сервера".
Unconnected
25.12.2009 20:54
Venom, а у тебя работает этот автоматический поиск сервера? У меня, на D2007, не работает (тестирую на одном, своём компьютере, а ведь он по идее должен и на одном обнаруживать).
Если тебе нужно автоматическое нахождение сервера, то это можно сделать средствами только TClientSocket\TServerSocket.
Посмотри здесь, я там выкладывал пример сетевой игры с широковещанием на вышеупомянутых компонентах.
andriano
25.12.2009 22:00
Цитата(Unconnected @ 25.12.2009 20:54)
Если тебе нужно автоматическое нахождение сервера, то это можно сделать средствами только TClientSocket\TServerSocket.
Не "только", а "в частности".
Venom
25.12.2009 22:12
Unconnected, у меня на одном компе не работает. Скачал спички из соседней темы и они тоже не могут сервер на одном моем компе найти.
А все-таки можно мой способ реализовать с активными и неактивными компонентами или лучше все переделать, а переделывать я пока незнаю как?
Unconnected
25.12.2009 22:17
Цитата
Скачал спички из соседней темы и они тоже не могут сервер на одном моем компе найти.
А у меня находят замечательно, как думаешь, в чем проблема?
Добавлено через 1 мин. Надеюсь, ты сначала запускаешь программу, выбираешь сервер, потом запускаешь ещё одну копию этой программы и выбираешь клиент...
Venom
25.12.2009 22:46
Незнаю в чем проблема. Когда у меня комп соединен с инетом, то просто ничего не находится, когда отключаю инет и запускаю два окна проги, в одном сервер, в другом клиент, у меня начинают вылазить ошибки Socket Error 10065, вроде это означает невозможность установления связи с сервером.
Unconnected
25.12.2009 22:56
Смотри прикреплённый скриншот. Могу ещё видео снять.
Может, дело в каких-то твоих особо жестоких брандмауэрах\антивирусах?
PS: то, что замазано серым - мой IP.
Venom
26.12.2009 11:41
Unconnected, у тебя компьютер, случайно, не подсоединен к какой-нибудь локальной сети? Потому что сегодня проверял на компе который соединен с локалкой, там udp отлично находит сервак даже когда игра запущена на одной машине, а на автономной машине не прокатывает. У знакомого, который пишет аналогичную игрушку, также.
Unconnected
26.12.2009 11:46
Ни к какой не подсоединён. Я тебе говорю про широковещание на сокетах на любом компьютере, а ты мне про UPD только в локалке...
Кстати, слабо представляю, как такое может быть, чтобы на одиночном компьютере не находило, а вот именно в локальной сети - находило.
PS: не увидел сразу пост andriano.
Цитата
Если тебе нужно автоматическое нахождение сервера, то это можно сделать средствами только TClientSocket\TServerSocket.
Не "только", а "в частности".
Я имел в виду "только лишь средствами...", т.е. можно сделать без UDP.
andriano
26.12.2009 12:21
Unconnected, ты имеешь в виду протокол UDP или что-то другое? Если его, то я, например, использовал его с помощью лишь WinAPI без всяких TClientSocket\TServerSocket.
Unconnected
26.12.2009 12:34
Цитата
Unconnected, ты имеешь в виду протокол UDP или что-то другое?
Я имел в виду, что можно обойтись без классов, реализующих работу с UDP; используя лишь TClientSocket\TServerSocket, которые, насколько помню, работают с TCP\IP.
Venom
26.12.2009 16:46
Вроде работает как надо. Unconnected, можешь проверить широковещание, а то у меня оно так и не работает даже когда все антивирусы и фаерволы отключаю. Незнаю в чем причина.
Осталось только доделать чтобы нельзя было запускать на одном компе два сервера и два клиента. Сделал обработку на два сервера аналогично как в спичках, но мне все равно вылазит окно с ошибкой от винды, а не мое showmessage. Помогите решить проблему...
PS: кажется до этого выложил неработающий вариант)
Unconnected
26.12.2009 21:31
Цитата
Вроде работает как надо.
Что работает как надо?
Кстати, я, кажется, поспешил и ошибся, сказав, что широковещание можно сделать с помощью TClient/ServerSocket. Сейчас посмотрел протокол UDP, посмотрел Спички, там всё на UDP сделано.
Сейчас постараюсь разобраться, как сделать с дейтаграммами.
Venom
26.12.2009 21:33
Сделал что два сервера нельзя запустить на одном компе, но все еще можно запустить 2 клиента. Помогите сделать чтобы не запускались два клиента на одной машине и прога будет полностью готова
Это код, где описывается, что можно запускать только один сервер. Пытался аналогично сделать для клиента, но почему-то не срабатывает
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
26.12.2009 22:12
Ну попробуй взять в try\except второй кусок кода, где клиентские сокеты открываются. Попробуй с помощью трассировки выявить, на какой именно строке ошибка.
Venom
26.12.2009 22:16
Пробовал так сделать, там ошибки ни какой не появляется, вторая программа-клиент сообщает, что успешно соединена с сервером и все. Поэтому я незнаю что сделать.
Unconnected
27.12.2009 10:31
Давай сначала определимся. Ты сказал, что
Цитата
но все еще можно запустить 2 клиента.
Каких именно клиента? В UDP не знаю, а в TClientSocket если попытаться открыть сокет на порту(порте?), где уже висит ещё один сокет - будет ошибка, да. Можешь повесить на событие OnError TClientSocket'а примерно следующий код: