很少使用Socket控件,发现它只能单向传输数据,所以,我只能用类似下面的方法,采用两个socket,一个用于发送,一个用于接收。请问有没有知道有什么更好的处理方式?procedure TDM.TcpClient1Connect(Sender: TObject);
var
   str1: string;
begin
      str1:= '#1#'+ gConfig.stdid+ ','+ gConfig.stdid;
     TcpClient1.Sendln(str1);
     TcpClient1.Disconnect;
     TcpClient2.RemoteHost:= gConfig.host;
     TcpClient2.RemotePort:= inttostr(gConfig.port- 1);
     TcpClient2.Connect;
end;
procedure TDM.TcpClient2Connect(Sender: TObject);
var
   str1: UTF8STRING;
   str2, cmd, sInfo: string;
   a: integer;
begin
     str1:= TcpClient2.Receiveln;
     str2:= UTF8toansi(str1);
     cmd:= readBetween(str1, '#', '#', a);
     sInfo:= copy(str2, a, length(str2));
     if cmd= '101'  then begin
        UserInfo:= sInfo;
        DeviceState:= 1;
     end;
     TcpClient2.Disconnect;
end;另外,现在我用的处理方式只能接收文字,有什么好办法进行图片或者文件传输么?socket文件传输TCP/IP控件图片

解决方案 »

  1.   

    我的意思是使用Delphi自带的socket控件。
    我知道有些控件非常好用,但是由于还会和其他系统沟通,所以只能使用最基本的控件。
      

  2.   

    我客户端用的是TIdTCPClient,发送用WriteLn,接收用ReadLn。好像还不错,希望对你有帮助。
      

  3.   

    indy控件不错,只不过indy采用阻塞方式处理,所以客户端使用没什么太大问题
    服务端就不要用了,每个连接都自动开启一个线程,当客户端少的时候也没什么问题
    客户端多了后(比如1000个连接)之后,系统资源严重浪费
    如果是做服务器端,操作系统环境是Windows的话,完成端口技术是非常不错的选择
      

  4.   

    我用的是Delphi自带的控件,只有两类函数,send和receive,每次连接,只能执行其中一个。一旦其中一个执行成功后,连接就自动断开了,如果想想先send之后,再receive,就会出现连接无效的的提示。
      

  5.   

    关键在于你设置控件的阻塞模式。
    当你设置为阻塞(Blocked)模式时,
    行为就会像你描述的那样。
    将其设为非阻塞模式,
    可能可以获得你要的结果。话说回来,如果你要建构稳定的大型系统,你还是要认真学习阻塞模式,理论上阻塞模式比较稳定。
    当然,凡事都有例外,
    也许你的应用就是用非阻塞模式比较稳定也说不定。
      

  6.   

    socket 本来就是双向的,可以用自带的TTcpClient 和 TTCpServer ,这两个控件是非常不错的。
      

  7.   

    经过仔细调试,发现只有当客户端执行了Client.Close;之后,信息才真正传递给服务器。
    所以造成了传递信息之后就无法再接收信息的这种效果。