| 
| 
 | Вопрос # 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) результат тот же. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |