用serversocket和clientsocket组件实现网络通信,服务器端有独立IP,客户端位于局域网里,可以和服务器端建立连接,但发送数据量大时,接收数据会出错。是不是winsocket有发送缓冲区大小限制?一次可以发送多少字节?
serversocket用的线程阻塞方式,clientsocket非阻塞方式。
服务器端服务线程如下:
procedure TMyServerThread.ClientExecute;
var
  Stream : TWinSocketStream;
  Buffer : array[0..307199] of Char;
  msg : string;
  JPEGImage : TJPEGImage;
  BmpStream : TMemoryStream; // , TmpStream
  iSendSize, iAllSize, iPosition, i : Integer;
begin
  try
    if clientsocket.Connected then
      // while (not Terminated) and ClientSocket.Connected do
      begin
        try
          Stream := TWinSocketStream.Create(ClientSocket, 10000);
          try
            FillChar(Buffer, 1024, 0); { initialize the buffer }
            if Stream.WaitForData(60000) then
              begin
                if Stream.Read(Buffer, 1024) = 0 then { if can't read in 60 seconds }
                  ClientSocket.Close
                else
                  begin
                    msg := pchar(@buffer);
                    if msg = '' then
                      begin
                        clientsocket.Close;
                        exit;
                      end;
                    msg := sDeCrypt(msg);
                    command := FString(msg);
                    parameter := EString(msg);                    if uppercase(command) = 'CATCHSCREEN' then
                      begin
                        JPEGImage := TJPEGImage.Create;
                        BmpStream := TMemoryStream.Create;
                        //TmpStream := TMemoryStream.Create;
                        try
                          synchronize(fmain.CatchScreen);
                          BmpStream.Clear;
                          JPEGImage.Assign(ScreenBMP);
                          JPEGImage.CompressionQuality := strtoint(FString(parameter));
                          JPEGImage.Compress;
                          JPEGImage.SaveToStream(BmpStream);                          backmsg := 'SENDSCREEN|' + formatfloat('000000', BmpStream.Size) + '|';
                          FillChar(Buffer, 100, 0);
                          strpcopy(buffer, backmsg);
                          stream.Write(buffer, length(backmsg) + 1);
                          sleep(10);                          FillChar(Buffer, 307200, 0);
                          if BmpStream.read(buffer, BmpStream.Size)=BmpStream.Size then
                            begin
                              stream.Write(buffer, BmpStream.Size); // CopyFrom(TmpStream, TmpStream.Size);
                            end;
                        finally
                          ScreenBMP.Free;
                          JPEGImage.Free;
                        end;
                      end;                    clientsocket.Close;
                  end;
              end
            else
              ClientSocket.Close; { if client doesn't start, close }
          finally
            clientsocket.Close;
            Stream.Free;
          end;
        except
          HandleException;
        end;
      end;
  except
  end;
end;功能大家也可能看清白了,就是抓屏。如果这样不行,发次发送,一次发送2048字节我也试了,好像接收到第三次或者第几次的时候接收就会出错,不知是什么原因?请大家帮我看看,有没有什么好的解决办法?