多个客户端同时对一个SERVERSOCKET进行操作会不会出错?
(使用非阻塞方式)
举个例子:
N个客户端同时象一个服务器端写信息,服务器的功能是把收到的信息发送到一个固定的客户端上,会不会出现丢包,混包的现象!!!
最好能举个例子或给点代码!

解决方案 »

  1.   

    给你一个真实的例子,这是某通信公司的客服接口。服务器端用Delphi的ServerSocket(非阻塞方式),客户端用Java的Socket(阻塞)。其中,服务器端的代码如下:
    procedure Tgsmform.ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      PackLen: Integer;
      LenStr, VerStr, HeadStr: string;
      PackageStr: AnsiString;
    begin  if Socket.Receivelength >= 7 then
      begin
        Socket.Receivebuf(Inbuf[1], 7);
        HeadStr := '';
        HeadStr := GetStr(@Inbuf, 7);
        //...省略了部分代码
      end
      else
      begin
        Exit;
      end;  //如果经过三次检测后,数据包还没有完整地到达,则关闭连接
      if Socket.ReceiveLength >= PackLen - 7 then
      begin
        Socket.Receivebuf(Inbuf[8], PackLen - 7);
        PackageStr := '';
        PackageStr := GetStr(@InBuf, PackLen);
        AddPackage(PackageStr, PackageHeadP, Socket);
      end
      else
      begin
        //Sleep(100);
        if Socket.ReceiveLength >= PackLen - 7 then
        begin
          Socket.Receivebuf(Inbuf[8], PackLen - 7);
          PackageStr := '';
          PackageStr := GetStr(@InBuf, PackLen);
          AddPackage(PackageStr, PackageHeadP, Socket);
        end
        else
        begin
          if Socket.ReceiveLength >= PackLen - 7 then
          begin
            Socket.Receivebuf(Inbuf[8], PackLen - 7);
            PackageStr := '';
            PackageStr := GetStr(@InBuf, PackLen);
            AddPackage(PackageStr, PackageHeadP, Socket);
          end
          else
          begin
            Socket.SendText('DATAERROR3');
            Socket.Close;
            Exit;
          end;
        end;
      end;
    end;
    这里的服务器端在接收到客户端的信息后,马上把它打包放入一个队列中,然后由后台线程对其进行处理。这样做是为了让ServerSocket及时接收客户端的信息。
      

  2.   

    我试过了,如果是多个线程同时操作的话,会出现服务器错误!(多个线程同时读写一个SOCKET)
    如果是多个客户端同时操作的话好像没什么问题!
    type
      Tmytest = class(TThread)
      private
       socket:TCustomWinSocket;
       s:string;
      protected
        procedure Execute; override;
         public
        procedure send(var s:string);
      end;
    开一个线程正常,多了就~!◎#¥%……了!
      

  3.   

    BORLAND的VCL TSERVERSOCKET部件已经尽到了它的本份了。
    已经能够让你很好的完成你需要的操作,问题是你具体如何处理。