|
Вопрос # 1 995/ вопрос открыт / |
|
Приветствую, уважаемые эксперты! Столкнулся с такой проблемой. Действия начинаются только после двойного, а то и тройного нажатия на кнопку. Как сделать чтобы после одного нажатия клиент отправил на сервер данные, тот их обработал и ответил. Помогите пожалуйста разобраться.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: 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 (статус: Посетитель), 14 октября 2008, 14:18 [#3]:
Неудачный вариант получился. Решил использовать Сокеты, чтобы ответ с сервера доходил до клиента находящегося на DSL. Можно тоже самое осуществить на IdTCPClient и IdTCPServer. Какие будут при этом +/-?
|
|
Вадим К (статус: Академик), 14 октября 2008, 14:26 [#4]:
В Вашем случае и сервер и клиент должны иметь либо реальные IP, либо быть в одной подсети. Иначе этот код работать НЕ БУДЕТ! и проблема тут не в делфи, и не в компонентах.
На IdTCPClient и IdTCPServer это тоже можно сделать. Обсуждать плюсы/минусы бессмысленно, так как и первые и вторые компоненты являются просто обёртками над сокетами.
Просто Indy по умолчанию работают в синхронном режиме и я нахожу этот режим более удобным для программирования.
Вообще то Вам не надо две пары серверных и клиентских компонент. достаточно одного набора.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Shouldercannon (статус: Посетитель), 14 октября 2008, 14:38 [#5]:
В моём случае сервер имеет реальный IP, клиент 50/50 тоесть он может быть запущен как с реального так и не реального IP. Пробовал сделать так: на сервере только ServerSocket, на клиенте только ClientSocket. также безуспешно. Текст доходит до сервера только со второго раза.
|
|
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 (статус: Посетитель), 14 октября 2008, 16:11 [#8]:
Да пробовал локально тестировать прямо на своем компе. Запускал и сервер и клиент (через IP 127.0.0.1) результат тот же.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|