IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Сетевая игрушка
Venom
сообщение 25.12.2009 17:23
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


Задали написать сетевую игрушку "ножницы-бумага-камень", а я до этого сетевые проги вообще не писал, поэтому не пинайте сильно если что не так сделал smile.gif
У меня сделано так, что как только к серверу подключился клиент активным становится у сервера и у клиента только RadioGroup, а кнопка "Ход" остается затемненной. А мне надо еще чтобы как только сервер или клиент выбрали один из вариантов в RadioGroup , то RadioGroup сразу становится неактивным. Кнопка "Ход" должна стать активной у обоих только тогда, когда и сервер и клиент выберут свои варианты, а как это сделать я без понятия.

PS: Программа запускается либо как сервер, либо как клиент, который должен подключиться к серверу. Поиск сервера происходит с помощью UDP протокола. Для того, чтобы поиграть на одном компе, нужно запусти программу два раза, в одной выбрать сервер, в другой клиент и ввести в поле ввода IP адреса 127.0.0.1 у клиента и нажать "старт игры".

Сообщение отредактировано: Venom - 25.12.2009 17:32


Прикрепленные файлы
Прикрепленный файл  qwer.rar ( 19.73 килобайт ) Кол-во скачиваний: 184
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 25.12.2009 17:50
Сообщение #2


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


А можно узнать, зачем используются все эти UPD компоненты?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Venom
сообщение 25.12.2009 17:54
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


UPD используются для локальной сети, для того чтобы клиент, незная IP сервера, мог обнаружить и подключиться к серверу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 25.12.2009 18:12
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Цитата(Venom @ 25.12.2009 17:23) *
PS: Программа запускается либо как сервер, либо как клиент, который должен подключиться к серверу. Поиск сервера происходит с помощью UDP протокола. Для того, чтобы поиграть на одном компе, нужно запусти программу два раза, в одной выбрать сервер, в другой клиент и ввести в поле ввода IP адреса 127.0.0.1 у клиента и нажать "старт игры".
Вообще-то существует способ определения, в каком режиме работать программе: клиента или сервера, без лишних вопросов пользователю.
Для этого программа посылает широковещательный запрос и ждет. Ждать может долго.
Дождалась и приняла пакет. Она на этом этапе должна реагировать на 2 типа пакетов: "запрос сервера" и "ответ сервера". Если получен пакет "ответ сервера", то программа понимает, что она - клиент.
Если получен пакет "запрос сервера", программа объявляет себя сервером и отсылает обратно пакет "ответ сервера".
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 25.12.2009 20:54
Сообщение #5


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Venom, а у тебя работает этот автоматический поиск сервера? У меня, на D2007, не работает (тестирую на одном, своём компьютере, а ведь он по идее должен и на одном обнаруживать).

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

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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 25.12.2009 22:00
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Цитата(Unconnected @ 25.12.2009 20:54) *
Если тебе нужно автоматическое нахождение сервера, то это можно сделать средствами только TClientSocket\TServerSocket.
Не "только", а "в частности".
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Venom
сообщение 25.12.2009 22:12
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


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

А все-таки можно мой способ реализовать с активными и неактивными компонентами или лучше все переделать, а переделывать я пока незнаю как?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 25.12.2009 22:17
Сообщение #8


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Цитата
Скачал спички из соседней темы и они тоже не могут сервер на одном моем компе найти.


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

Добавлено через 1 мин.
Надеюсь, ты сначала запускаешь программу, выбираешь сервер, потом запускаешь ещё одну копию этой программы и выбираешь клиент...


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Venom
сообщение 25.12.2009 22:46
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


Незнаю в чем проблема.
Когда у меня комп соединен с инетом, то просто ничего не находится, когда отключаю инет и запускаю два окна проги, в одном сервер, в другом клиент, у меня начинают вылазить ошибки Socket Error 10065, вроде это означает невозможность установления связи с сервером.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 25.12.2009 22:56
Сообщение #10


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Смотри прикреплённый скриншот. Могу ещё видео снять.

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

PS: то, что замазано серым - мой IP.

Сообщение отредактировано: Unconnected - 25.12.2009 22:56


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Venom
сообщение 26.12.2009 11:41
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


Unconnected, у тебя компьютер, случайно, не подсоединен к какой-нибудь локальной сети? Потому что сегодня проверял на компе который соединен с локалкой, там udp отлично находит сервак даже когда игра запущена на одной машине, а на автономной машине не прокатывает. У знакомого, который пишет аналогичную игрушку, также.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 26.12.2009 11:46
Сообщение #12


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Ни к какой не подсоединён. Я тебе говорю про широковещание на сокетах на любом компьютере, а ты мне про UPD только в локалке...

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

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

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

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


Я имел в виду "только лишь средствами...", т.е. можно сделать без UDP.

Сообщение отредактировано: Unconnected - 26.12.2009 12:31


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 26.12.2009 12:21
Сообщение #13


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Unconnected, ты имеешь в виду протокол UDP или что-то другое?
Если его, то я, например, использовал его с помощью лишь WinAPI без всяких TClientSocket\TServerSocket.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 26.12.2009 12:34
Сообщение #14


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Цитата
Unconnected, ты имеешь в виду протокол UDP или что-то другое?


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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Venom
сообщение 26.12.2009 16:46
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


Вроде работает как надо.
Unconnected, можешь проверить широковещание, а то у меня оно так и не работает даже когда все антивирусы и фаерволы отключаю. Незнаю в чем причина.

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

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

Сообщение отредактировано: Venom - 26.12.2009 17:23


Прикрепленные файлы
Прикрепленный файл  KNB.rar ( 19.85 килобайт ) Кол-во скачиваний: 158
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 26.12.2009 21:31
Сообщение #16


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Цитата
Вроде работает как надо.


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

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

Сейчас постараюсь разобраться, как сделать с дейтаграммами.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Venom
сообщение 26.12.2009 21:33
Сообщение #17


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


Сделал что два сервера нельзя запустить на одном компе, но все еще можно запустить 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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 26.12.2009 22:12
Сообщение #18


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Ну попробуй взять в try\except второй кусок кода, где клиентские сокеты открываются. Попробуй с помощью трассировки выявить, на какой именно строке ошибка.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Venom
сообщение 26.12.2009 22:16
Сообщение #19


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Михаил

Репутация: -  0  +


Пробовал так сделать, там ошибки ни какой не появляется, вторая программа-клиент сообщает, что успешно соединена с сервером и все. Поэтому я незнаю что сделать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 27.12.2009 10:31
Сообщение #20


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Давай сначала определимся. Ты сказал, что
Цитата

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


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


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


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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 10.07.2025 18:40
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"