![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TCPClient вторая посылка не проходит
novichek © (2010-05-11 22:29:00)клиент:
if TcpClient1.Connected then TcpClient1.Sendln(edit2.Text);
сервер:
procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
begin
edit1.Text:= ClientSocket.Receiveln;
end;
первая отправка строки доходит до сервера, последующте нет, хотя connected клиента True.
добавил:
TcpClient1.Sendln(edit2.Text);
TcpClient1.Disconnect;
TcpClient1.Connect;
стало работать, но это херня рвать установленную связь..
помогите с решением, необходимо один раз законнектится с сервером и в дальнейшем независимо клиент серверу и сервер клиенту что бы могли отправлять сообщения в виде строк...
пока рука не поднимается пробывать на сокетах писать, если готовое решение не могу использовать...
novichek (2010-05-11 23:50:00) [21]стало ещё интересней..
procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
var
s: String;
begin
s:= ClientSocket.Receiveln;
while s<>'' do begin
edit1.Text:= edit1.Text + s;
s:= ClientSocket.Receiveln;
end;
end.
стало теперь принимать и последующие отправки и без setsockopt..
novichek (2010-05-11 23:43:00) [22]хм.. там кода пару строк:
procedure TForm1.FormCreate(Sender: TObject);
begin
TcpServer1.BlockMode:= bmThreadBlocking;
TcpClient1.BlockMode:= bmBlocking;
TcpServer1.Active:= true;
TcpClient1.Active:= true;
TcpClient1.Connect;
end;
procedure TForm1.TcpClient1Connect(Sender: TObject);
begin
setsockopt(TTCPClient(Sender).Handle, IPPROTO_IP, TCP_NODELAY, 0, 1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if TcpClient1.Connected then begin
TcpClient1.Sendln(edit2.Text);
// TcpClient1.Disconnect;
// TcpClient1.Connect;
end;
end;
procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
begin
edit1.Text:= ClientSocket.Receiveln;
end;
Сергей М. (2010-05-11 23:34:00) [23]
> всё равно вторая посылка не проходит.
Значит у тебя ошибка в программе.
novichek (2010-05-11 23:31:00) [24]procedure TForm1.TcpClient1Connect(Sender: TObject);
begin
setsockopt(TTCPClient(Sender).Handle, IPPROTO_IP, TCP_NODELAY, 0, 1);
end;
всё равно вторая посылка не проходит...
решил попытать счаcтья на инди (d2007)
var
myContext: TIdContext;
...
// отправка серверу
procedure TForm1.Button1Click(Sender: TObject);
begin
if IdTCPClient1.Connected then IdTCPClient1.IOHandler.WriteLn(TimeToStr(time));
end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
myContext:= AContext; // сохранил
edit1.Text:= AContext.Connection.IOHandler.ReadLn; // прочитал что пришло
end;
теперь пытаюсь со стороны сервера отправить
procedure TForm1.Button2Click(Sender: TObject);
begin
myContext.Connection.IOHandler.WriteLn(TimeToStr(time));
end;
на клиенте обрабатываю пиём так:
procedure TForm1.IdTCPClient1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
begin
if AWorkMode = wmRead then begin
edit2.Text:= 'принял';
end;
end;
1) тут не знаю как добраться до входящего буфера\текста
2) один фиг, ставил бряк - управление не приходит
подскажите пожалуйста где торможу..
Сергей М. (2010-05-11 23:11:00) [25]
> на событии connect'а клиента ?
Да.
> как тут socked вытянуть
TTCPClient(Sender).Handle
> я не чат пишу
Не суть как важно.
novichek (2010-05-11 23:02:00) [26]не могли бы вы уточнить, на каком этапе отключать?
на событии connect'а клиента ?
procedure TForm1.TcpClient1Connect(Sender: TObject);
begin
setsockopt(socked, IPPROTO_IP, TCP_NODELAY, 0, 1); // так ?
end;
только как тут socked вытянуть не могу понять ))
вообще-то я не чат пишу..
просто нужно организовать общение клиентов с сервером путем передачи строк.
Сергей М. (2010-05-11 22:37:00) [27]Если ты лепишь чат, то следует отключать алгоритм Нагеля.
По умолчанию он включен.