【发布时间】:2017-12-28 04:54:53
【问题描述】:
我正在测试如何获取我的 Android 智能手机的定期屏幕截图,并且该服务器已经从我的设备接收大量屏幕截图,碰巧这些图像没有出现在 TImage 中,我认为这是因为 TServerSocket (接收图像的部分)不在线程中。是的,我正确地发送了这些屏幕截图:
Java (Android):
bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
byte[] array = bos.toByteArray();
DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream());
dos.writeInt(array.length);
dos.write(array, 0, array.length);
dos.flush();
这是我的 Delphi 代码,必须接收定期截图:
var
Form1: TForm1;
stSize: integer;
Stream: TMemoryStream;
Receiving: boolean;
png: TPngImage;
FSize: Integer;
writing: Boolean;
implementation
{$R *.dfm}
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
Item: TListItem;
begin
Item := ListView1.Items.Add;
Item.Caption := IntTostr(socket.Handle);
Item.SubItems.Add(Socket.RemoteAddress);
Item.SubItems.Add(socket.RemoteHost);
Item.Data := Socket.Data;
end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
Item: TListItem;
begin
Item:= ListView1.FindCaption(0, inttostr(socket.Handle), false, true, false);
if item <> nil then
Item.Delete;
end;
procedure TForm1.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
showmessage('socket erro');
ErrorCode := 0;
end;
procedure TForm1.Activate1Click(Sender: TObject);
begin
ServerSocket1.Active := true;
end;
procedure TForm1.Deactive1Click(Sender: TObject);
begin
ServerSocket1.Active := false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Stream:= TMemoryStream.Create;
writing:= False;
end;
procedure TForm1.SendMyReqst1Click(Sender: TObject);
begin
if ListView1.Selected = nil then exit;
ServerSocket1.Socket.Connections[ListView1.ItemIndex].SendText('screencapture' + #13#10);
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
BytesReceived: Longint;
CopyBuffer: Pointer;
ChunkSize: Integer;
TempSize: Integer;
const
MaxChunkSize: Longint = 8192;
begin
If FSize=0 then
begin
begin
Socket.ReceiveBuf(TempSize,SizeOf(TempSize));
TempSize := ntohl(TempSize);
Stream.SetSize(TempSize);
FSize:= TempSize
End;
End;
If (FSize>0) and not(writing) then
begin
GetMem(CopyBuffer, MaxChunkSize);
writing:= True;
While Socket.ReceiveLength>0 do
Begin
ChunkSize:= Socket.ReceiveLength;
If ChunkSize > MaxChunkSize then ChunkSize:= MaxChunkSize;
BytesReceived:= Socket.ReceiveBuf(CopyBuffer^,ChunkSize);
Stream.Write(CopyBuffer^, BytesReceived);
Dec(FSize,BytesReceived);
End;
end;
If FSize=0 then begin
Stream.Position := 0;
png:=TPngImage.Create;
png.LoadFromStream(Stream);
img1.Picture.Assign(png);
img1.Refresh;
Stream.SetSize(0);
png.Free;
FSize:= 0;
end;
FreeMem(CopyBuffer, MaxChunkSize);
Writing:= False;
end;
end.
上面的这个 Delphi 代码工作正常,但只接收 1 个屏幕截图,不是很大的变化。
更新:
this 是我在 Android 上获取定期截图的代码库。
PS:看他用了无限循环。
【问题讨论】:
-
@RemyLebeau,
This code does not need to be multi-threaded to work correctly. It needs to be fixed即使执行无限循环的屏幕截图并在客户端发送也可以? -
@RemyLebeau,见我上面的版本。
-
@JeffersonFarias 就像我说的,阅读代码全错了,需要重写。看我的回答
标签: multithreading sockets delphi