to insert2003(高级打字员) 你给的程序我试过了,和我原来的程序一样,在单机上没问题,在局域网内传输的话,数据量大了以后就会出错。
JPG可以压缩!1024*768的屏幕截取下来以后经过压缩处理,变成大约20K-80K大小
奇怪,这样大的数据量为什么不用UDP?TCP的三次SHARKHAND效率低而慢,增加了系统负荷
to realside 因为我不需要连续截屏,而且客户端和服务器端是在同一个局域网中的,所以速度问题不是我考虑的重点。 现在的问题是显示截屏画面的时候花屏现象严重(客户端和服务器端是不同的机子),而在单机上试的时候却一切正常。哪位高手能告诉我是什么原因吗,怎么解决?用的就是楼上insert2003给的例子。
服务端程序unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, JPEG,ExtCtrls, ScktComp;typeTForm1 = class(TForm)ServerSocket1: TServerSocket;procedure ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);privateprocedure Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean);{自定义抓屏函数,DrawCur表示抓鼠标图像与否}{ Private declarations }public{ Public declarations }end;varForm1: TForm1;MyStream: TMemorystream;{内存流对象} implementation{$R *.DFM}procedure TForm1.Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean);varCursorx, Cursory: integer;dc: hdc;Mycan: Tcanvas;R: TRect;DrawPos: TPoint;MyCursor: TIcon;hld: hwnd;Threadld: dword;mp: tpoint;pIconInfo: TIconInfo;beginMybmp := Tbitmap.Create; {建立BMPMAP }Mycan := TCanvas.Create; {屏幕截取}dc := GetWindowDC(0);tryMycan.Handle := dc;R := Rect(0, 0, screen.Width, screen.Height);Mybmp.Width := R.Right;Mybmp.Height := R.Bottom;Mybmp.Canvas.CopyRect(R, Mycan, R);finallyreleaseDC(0, DC);end;Mycan.Handle := 0;Mycan.Free;if DrawCur then {画上鼠标图象}beginGetCursorPos(DrawPos);MyCursor := TIcon.Create;getcursorpos(mp);hld := WindowFromPoint(mp);Threadld := GetWindowThreadProcessId(hld, nil);AttachThreadInput(GetCurrentThreadId, Threadld, True);MyCursor.Handle := Getcursor();AttachThreadInput(GetCurrentThreadId, threadld, False);GetIconInfo(Mycursor.Handle, pIconInfo);cursorx := DrawPos.x - round(pIconInfo.xHotspot);cursory := DrawPos.y - round(pIconInfo.yHotspot);Mybmp.Canvas.Draw(cursorx, cursory, MyCursor); {画上鼠标}DeleteObject(pIconInfo.hbmColor);{GetIconInfo 使用时创建了两个bitmap对象. 需要手工释放这两个对象}DeleteObject(pIconInfo.hbmMask);{否则,调用他后,他会创建一个bitmap,多次调用会产生多个,直至资源耗尽}Mycursor.ReleaseHandle; {释放数组内存}MyCursor.Free; {释放鼠标指针}end; end;procedure TForm1.FormCreate(Sender: TObject);beginServerSocket1.Port := 3000; {端口}ServerSocket1.Open; {Socket开始侦听}end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);beginif ServerSocket1.Active then ServerSocket1.Close; {关闭Socket}end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);varS, S1: string;MyBmp: TBitmap;Myjpg: TJpegimage;beginS := Socket.ReceiveText;if S = 'cap' then {客户端发出抓屏幕指令}begintryMyStream := TMemorystream.Create;{建立内存流}MyBmp := TBitmap.Create;Myjpg := TJpegimage.Create;Cjt_GetScreen(MyBmp, True); {True表示抓鼠标图像}Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}Myjpg.CompressionQuality := 10; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}Myjpg.free;MyStream.Position := 0;{注意:必须添加此句}s1 := inttostr(MyStream.size);{流的大小}Socket.sendtext(s1); {发送流大小}finallyMyBmp.free;end;end;if s = 'ready' then {客户端已准备好接收图象}beginMyStream.Position := 0;Socket.SendStream(MyStream); {将流发送出去}end;end;end.
你给的程序我试过了,和我原来的程序一样,在单机上没问题,在局域网内传输的话,数据量大了以后就会出错。
因为我不需要连续截屏,而且客户端和服务器端是在同一个局域网中的,所以速度问题不是我考虑的重点。
现在的问题是显示截屏画面的时候花屏现象严重(客户端和服务器端是不同的机子),而在单机上试的时候却一切正常。哪位高手能告诉我是什么原因吗,怎么解决?用的就是楼上insert2003给的例子。
各位有什么好的方法保证数据传输的准确性吗,高手们不妨支两招。