用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字节我也试了,好像接收到第三次或者第几次的时候接收就会出错,不知是什么原因?请大家帮我看看,有没有什么好的解决办法?
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字节我也试了,好像接收到第三次或者第几次的时候接收就会出错,不知是什么原因?请大家帮我看看,有没有什么好的解决办法?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货