我有一个银行代理收费的接口问题,是用delphi的ServerSocket,采用多线程来做的,是阻塞模式。在银行已经进行了近一个月的测试没有发生问题,可是是现在正常使用后,发现银行的流量超过3K的时候,就会出错,连接停止!

解决方案 »

  1.   

    B公司(客户端)与A公司(服务器端)通过光纤进行连接,进行信息处理,B公司利用Cocket采用TCP/IP实时传输给A公司。A公司采用阻塞模式的Socket连接,但B公司的数据量很大的时候,A公司的接口程序读取缓冲区的时候,得到异常的信息(是多个信息的合成),之后程序出错,接口程序停止工作。
    例如:
    1、假设B公司连续发送该信息:200001000000111234567891
    信息长度不固定。
    2、A公司的接口程每次从缓冲区读出的正常信息:
    ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0
    以上是一个查询信息,A公司处理完本次查询后,再去读缓冲区。但在B公司发送信息的条数为123条的时候,发现A公司的接口程序读出的信息为:
    ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’, ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’, ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’, ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’, ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’, ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’, ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’, ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’, ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’, ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’1’, ’2’,’0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’,’1’,’1’,’1’
    读取下次的信息是从劫断的信息的后半部分开始的,信息内容基本同上。
    A公司的接口程序的读取部分的代码如下:
    var
      ReceiveStream, RequestStream,RequestStream1: TWinSocketStream;
      Rec_Bytes, I: Integer;
      OperationCode, ResultStr: string;
    begin
      while (not Terminated) and (ClientSocket.Connected) do
      begin
        try
          RequestStream := TWinSocketStream.Create(ClientSocket, 60000);
          try
            FillChar(Request_buf, SizeOf(Request_buf), 0);
             
            //Request_Buf_Bytes:=RequestStream.CopyFrom(RequestStream,MAXLENGTH);
            Request_buf_bytes := RequestStream.Read(Request_buf,MAXLENGTH);
            if Request_buf_bytes = 0 then
            begin
              Sleep(1);
              ClientSocket.Close;
              Terminate;
            end
            else
            begin
              try
                RecieveStr := Trim(Request_buf);
                //RecieveStr := Trim(RecieveStr);
                PostMessage(frmMain.Handle, CM_ADDSTRING, 0,
                  Integer(PChar('From '+ClientSocket.RemoteAddress+'('+FormatDateTime('yyyy-mm-dd hh:nn:ss',Now)+')'+':'+#13+#10+RecieveStr)));
                if Length(RecieveStr) > 20 then
                  ManageBankData(RecieveStr, ClientSocket);
              except
              end;
            end;
          finally
            RequestStream.Free;
          end;
        except
          HandleException;
        end;
      end;
    end;
    其中ClientSocket为TserverSocket类型,并且设置为阻塞模式,上面代码通过循环反复读取缓冲区的信息。采用了Socket流读取的方式进行操作的。A公司采用Windows2000 Server系统,B公司采用UNIX系统。
      

  2.   

    多用户并行的情况下要设置临界区TMultiReadExclusiveWriteSynchronizer;你帖这么多代码,没人喜欢看完的!