除了客户端刚连接上的时候可以发送一次,然后再用button发送就出错了,
用的INDY10.0.52版的 Idtcpserver和Idtcpclient
function  acsend(st:string):Boolean;
var
  Acontext:TIdContext;
begin
 
  AContext.Connection.Socket.WriteLn(st);
 
  end;procedure TForm1.TcpsConnect(AContext: TIdContext);
begin
acsend(mmo1.Text);
end;procedure TForm1.btn1Click(Sender: TObject);
begin
acsend(mmo1.Text);//这里点了就出错了,那个acc..什么的错误.
end;目的就是服务器端点按钮之后发送mmo1.text的内容

解决方案 »

  1.   

    function  acsend(st:string):Boolean;
    var
      Acontext:TIdContext;
    begin
     
      AContext.Connection.Socket.WriteLn(st);
     
      end;
    这样写的啊
      

  2.   

    你没有创建TIdContext不出错才怪
      

  3.   

    ?procedure TForm1.TcpsConnect(AContext: TIdContext);
    begin
    acsend(mmo1.Text);
    end;这也没创建可以执行啊.
      

  4.   

    ……
    AContext.Connection是个什么东西你都没说嘛,不错见鬼了
      

  5.   

    那高分求一个完整的例子, 要求TCP连接服务器和客户端可以即时互发消息的,INDY10.0.52的.
    现在通过修改已经可以发送出去和接受到,问题在如何处理同步上面.
    最好讲讲首先,服务器开启,然后客户端发起连接,之后服务端返回XX连接成功,然后客户端接受到返回信息提示连接成功,然后服务器端和客户端可以互相发送STRING
      

  6.   

    indy10我没怎么用过,这个参数TIdContext应该是和indy9里的TIdPeerThread类似吧
    连接时,你能够发送成功,是因为你发送给了刚刚连接成功的那个客户端,而你写的过程中没有实例话,访问了没有实例化的对象,自然会报错
    你即使实例化了,也会报错,因为它根本不知道你人发送给哪个客户端数据
      

  7.   

    客户端和服务器端建立连接后,会在Contexts.LockList里存在一个ID,可以用循环发给每个ID的客户端,相当于广播.
    问题是现在客户端和服务器连接之后,如何处理服务器端发送过来的数据,客户端的处理函数是idclient.iohandle.readln();问题是已经存在一个连接之后如何在当前连接里面实现双工通讯,按照现在来看至少在另外一个线程里面是可以接受到的.也就是把处理函数放入线程中执行.
      

  8.   


    indy10官方demo包:http://indy.fulgan.com/ZIP/Indy10demo.zip
      

  9.   

    你要用Locklist  那你就要再用过之后 把这个Lock给解掉。这是服务器端要做的。而且,Indy demo包中的例子里面都是设置了一个结构体,然后,通过自己够早的结构体List来存储线程的内容。当给指定的机器发送消息的时候,直接从结构体里面找出对应的线程,并对其发送消息。当然,不考虑程序的效率和安全性,完全可以For循环或者广播信息,将识别用户的任务交给客户端。然后,还要注意,在客户端要建立一个进程,时刻捕捉发过来的消息。同时,在客户端建立一个String的List,用来存放消息队列。而且,还要设置一个Timer,间隔就是1ms,对这个List的Stirng进行读写操作。如果不按照这个流程来做,很多弊病都会出来。有时候莫名其妙的错误也会出来。