首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Idtcpserver 发送有关问题

2012-12-17 
Idtcpserver 发送问题如何实现在button1.click事件中,让Idtcpserver发送Edit1.text 到客户端,最好能提供下

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,不要做这个判断直接发送一下试试?代码本身没有任何问题

热点排行