Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 995

/ вопрос открыт /

Приветствую, уважаемые эксперты! Столкнулся с такой проблемой. Действия начинаются только после двойного, а то и тройного нажатия на кнопку. Как сделать чтобы после одного нажатия клиент отправил на сервер данные, тот их обработал и ответил. Помогите пожалуйста разобраться.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Shouldercannon Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Shouldercannon (статус: Посетитель)
Вопрос отправлен: 14 октября 2008, 11:30
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 14 октября 2008, 16:11; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 14 октября 2008, 11:44 [#1]:

При вашем подходе к построению системы, я удивляюсь, как оно вообще работает.
на надо на клиентской части серверные компоненты, а на серверной - клиентскую.
Во вторых, много экспертов просто не сможет проверить Ваш код - Вы используете устаревшие компоненты.
И на последок, надо понять, что такое синхронные и асинхронные сокеты.
Галочка "подтверждения прочтения" - вселенское зло.
Пупкин В.В.

Пупкин В.В. (статус: 1-ый класс), 14 октября 2008, 11:49 [#2]:

Первое - что у сервера что у клиента должен быть один порт. Вообще не оч понятно как работает :)
Второе - не правильная логика программы. судя по всему вам необходимо создать 2 программы - одна будет сервер (компонент TServerSocket), вторая - клиент (компонент TClientSocket).
Второй вариант - одна программа где будут присутствовать эти два компонента, но в сети может быть только один сервер, т.е. надо учесть этот момент и программа, если она нашла сервер просто не включает компонет TServerSocket)
Shouldercannon

Shouldercannon (статус: Посетитель), 14 октября 2008, 14:18 [#3]:

Неудачный вариант получился. Решил использовать Сокеты, чтобы ответ с сервера доходил до клиента находящегося на DSL. Можно тоже самое осуществить на IdTCPClient и IdTCPServer. Какие будут при этом +/-?
Вадим К

Вадим К (статус: Академик), 14 октября 2008, 14:26 [#4]:

В Вашем случае и сервер и клиент должны иметь либо реальные IP, либо быть в одной подсети. Иначе этот код работать НЕ БУДЕТ! и проблема тут не в делфи, и не в компонентах.
На IdTCPClient и IdTCPServer это тоже можно сделать. Обсуждать плюсы/минусы бессмысленно, так как и первые и вторые компоненты являются просто обёртками над сокетами.
Просто Indy по умолчанию работают в синхронном режиме и я нахожу этот режим более удобным для программирования.
Вообще то Вам не надо две пары серверных и клиентских компонент. достаточно одного набора.
Галочка "подтверждения прочтения" - вселенское зло.
Shouldercannon

Shouldercannon (статус: Посетитель), 14 октября 2008, 14:38 [#5]:

В моём случае сервер имеет реальный IP, клиент 50/50 тоесть он может быть запущен как с реального так и не реального IP. Пробовал сделать так: на сервере только ServerSocket, на клиенте только ClientSocket. также безуспешно. Текст доходит до сервера только со второго раза.
Shouldercannon

Shouldercannon (статус: Посетитель), 14 октября 2008, 14:44 [#6]:

Тоесть вот так
Клиент
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host:='77.108.194.247';
ClientSocket1.Port:=777;
ClientSocket1.Active:=True;
ClientSocket1.Socket.SendText('ooo');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ClientSocket1.Port:=777;
end;

Сервер
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Port:=777;
if not ServerSocket1.Active then
ServerSocket1.Active:=True;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
LIP.Caption:=Socket.RemoteAddress;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
//var S:String;
//N:integer;
begin
//N:=Socket.ReceiveLength;
//SetLength(S, N);
//Socket.ReceiveBuf(S[1], N);
//LText.Caption:=(S);
LText.Caption:=Socket.ReceiveText;
end;
Вадим К

Вадим К (статус: Академик), 14 октября 2008, 15:02 [#7]:

Мне кажеться, я знаю в чём причина. Вы отправляете 3 байта и надеетесь что они тут же прибегут... А это асинхронные сокеты... А накладки в сети...
Вы пробовали локально тестировать? прямо на своем компе запускать и сервер и клиент.

Если клиент имеем реальный IP с вероятностью 50/50, то он однозначно будет клиентом. Хотя это не столь важно. Тут надо глубже копать - в идеологию - кто кому чего должен.
А так кодировать сокеты с наскока не получиться. Даже не надейтесь. Надо как минимум немного теории изучить.
Галочка "подтверждения прочтения" - вселенское зло.
Shouldercannon

Shouldercannon (статус: Посетитель), 14 октября 2008, 16:11 [#8]:

Да пробовал локально тестировать прямо на своем компе. Запускал и сервер и клиент (через IP 127.0.0.1) результат тот же.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 13 декабря 2017, 19:54
Выполнено за 0.08 сек.
Рейтинг@Mail.ru