Idtcpserver 发送问题
如何实现在button1.click事件中,让Idtcpserver发送Edit1.text 到客户端,最好能提供下代码
我照网上看来的试了下,客户端确收不到,请大侠们指点下小弟,谢!
服务器端:
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
AThread : TIdPeerThread;
begin
try
with IdTCPServer1.Threads.LockList do
for I := 0 to Count - 1 do
begin
AThread := Items[I];
if AThread.Connection.Socket.Binding.PeerIP = '127.0.0.1 ' then
AThread.Connection.WriteLn(Edit1.Text);
// ShowMessage('已发送');
end;
finally
IdTCPServer1.Threads.UnlockList;
end;
end;
客户端接收线程:
procedure TGetData.Execute;
var
a:string;
begin
while not Terminated do
begin
if not form1.IdTCPClient1.Connected then
begin//TCPclnt是一个idtcpclient
Terminate;
exit;
end
else
try
a:=form1.IdTCPClient1.Readln();
Form1.LbLog.Items.Add(a);
except
end;
end;
end;
[解决办法]
困扰很久一直没人回答
[解决办法]
应该是IdTCPClient1发送数据 IdTCPServer的Execute事件来接受,这个Indy自带demo
[解决办法]
难道没办法让服务器单独一个按纽事件中发给客户端吗?
[解决办法]
没办法的, 就是你自己约定 ,比如 101 102 103 ,这样发送的数据也简短。
[解决办法]
肯定有办法,别人的程序都能,期待高手解决
[解决办法]
有个聊天程序是把 tcp客户端和服务端控件都用上,也就是客户端和服务端都有两个控件。
[解决办法]
我这几天也在搞indy测试,不过是indy 10.
1,你贴出的客户端的倾听的线程有了,但是不跟idtcpclint一起建立的呢?
列子:
/////
try
IdTCPClient1.Connect;
ClientHandleThread := TClientHandleThread.Create(true);
ClientHandleThread.FreeOnTerminate:=True;
ClientHandleThread.Resume;
Button3.Enabled := IdTCPClient1.Connected;
Button1.Enabled:=not IdTCPClient1.Connected;
Button2.Enabled:=IdTCPClient1.Connected;
except
on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
end;
except
raise exception.Create('Error');
//////
ClientHandleThread是我的客户端线程。
你的TGetData是什么类型?
2,这是我的线程倾听方式
////
procedure TClientHandleThread.Execute;
var
RxBuf:TIdBytes;
MsnIN: TComandBlock;
begin
while not Terminated do
begin
if not Form1.IdTCPClient1.Connected then
Terminate
else begin
Form1.IdTCPClient1.ReadTimeout := 3000;
repeat
try
SetLength(RxBuf, SizeOf(MsnIN)); //否则读入不会改变 //这里可以直接放CB.
Form1.IdTCPClient1.IOHandler.ReadBytes(RxBuf, SizeOf(MsnIN), False);
// Move(RxBuf[0], CB, SizeOf(MsnIN));
Idglobal.BytesToRaw(RxBuf, MsnIN, SizeOf (MsnIN));
CB:=MsnIN;
//Synchronize(HandleInput);
HandleInput;
// if (cb.command = 0) or (cb.command = -1) then Terminate;
except
// nothing
end;
until (not Form1.IdTCPClient1.Connected);
//Free;
end;
end;
end;
/////
这里的问题是,你的idTCPclient是不是在断开的状态?
我的服务端是通过buf发包的,所以读入方式跟你不一样。
你直接发的是文本可以怎么读入
str:=form1.IdTCPClient1.ReadLn; //indy 9
r:=IdTCPClient1.IOHandler.ReadLn; //indy 10
3,这一步你可以放到同步的线程中
Form1.LbLog.Items.Add(a);
4.你服务端发送有问题,要这样
TIdPeerThread(Items[i]).Connection.WriteLn('xxx');
或者AThread:=TIdPeerThread(LThreads[i]); AThread.Connection.WriteLn(Edit1.Text);
而你的是
AThread := Items[I];
if AThread.Connection.Socket.Binding.PeerIP = '127.0.0.1 ' then
AThread.Connection.WriteLn(Edit1.Text);
你的AThread.Connection是空的,怎么发?
indy 10 的发送
ListThreadClients.LockList.Items[i];
with ListThreadClients.LockList do
try
for i := 0 to Count-1 do // iterate through client-list
begin
//RecInfoClient :=ListThreadClients.LockList.Items[i];
RecInfoClient :=Items[i]; // 获得客户对象
//RecInfoClient^.Context:=;
RecInfoContext := TIDContext(RecInfoClient^.Context); // 获取连接线
RxBuf := Idglobal.RawToBytes(NewPaquete, SizeOf (NewPaquete));
RecInfoContext.Connection.IOHandler.Write(RxBuf);// and there it goes...
RecInfoContext.Connection.IOHandler.WriteBufferFlush;
RecInfoContext.Connection.IOHandler.WriteBufferClose;
end;
finally
ListThreadClients.UnlockList;
end;
///////////////////////////////////
5, 结束,分数拿来,谢谢。
[解决办法]
if AThread.Connection.Socket.Binding.PeerIP = '127.0.0.1 ' then
这个判断是客户端是本机。有时候会获取你的IP192.168.1.X,而不是127.0.0.1,不要做这个判断直接发送一下试试?代码本身没有任何问题