亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

在Delphi中讀取另一臺計算機的屏幕

2019-11-18 18:54:28
字體:
來源:轉載
供稿:網友
[摘要] 編寫過Winsock應用程序的程序員都知道,編寫Winsock應用程序絕不是一件輕而易舉的事,您不得直接與復雜的Winsock中的Api打交道,幸運的是,Delphi4中的Tclientsocket 和Tserversocket封裝了Windows中有關的Api,大為簡化了對Winsock的訪問,使得我們能夠非常輕易的編寫Winsock應用程序。本文通過一個讀取局域網內另一臺計算機屏幕的示例,來介紹如何用Delphi編寫Winsock應用程序。

在單位做過網管的人都可能有這樣的經歷,通過電話“遙控”指導別人操作是一件多么心煩的事,而且我又是一個懶人,不想天天為一點小事從樓頂跑到樓下,怎么辦呢?編一個讀取另一臺計算機屏幕的程序怎么樣?不就直觀多了。在局域網內進行通信,最好的選擇當然是用Winsock,編寫過Winsock應用程序的程序員都知道,編寫Winsock應用程序絕不是一件輕而易舉的事,您不得直接與復雜的Winsock中的Api打交道,幸運的是,Delphi4中的Tclientsocket 和Tserversocket封裝了Windows中有關的Api,大為簡化了對Winsock的訪問,使得我們能夠非常輕易的編寫Winsock應用程序。盡管如此,最好還是對Winsock有一些了解,在這里我就不再贅述,您可以找些書自己看看。
通過網絡傳輸數據,您至少需要一對Socket,其中一個在客戶端,另一個在服務端,一旦客戶端與服務端的socket建立起連接,就可以相互通信了,用Socket建立連接是建立在Tcp/ip基礎上的,同時也支持ipx/spx等相關協議。在Delphi中 分別用Tclientsocket 和Tserversocket來操縱客戶端與服務端Socket的連接和通信。要說明的是,這兩個元件用于管理服務器與客戶的連接,本身并不是Socket對象,操縱Socket對象的是TcustomwinSocket,如Tclientwinsocket、 Tserverclientwinsocket、Tserverwinsocket。
一、Tclientsocket元件:
把一個Tclientsocket加到Form上,應用程序就變為一個Tcp/ip客戶,就可以用Tclientsocket來操縱客戶端的Socket對象。
要建立與服務器的連接,應先指定要連接的服務器。指定服務器有兩種方式,一種是設置Host屬性指定服務器的主機名,如http://www.inPRise.com或局域網中的機器名,這種方式直觀,但要進行域名解析,速度會稍慢一些;另一種方法是設置Adress屬性指定主機的ip地址,如130.0.1.1。這兩種方法是等價的,但如果同時設置了Host和Adress,Delphi將只使用Host屬性。
然后要指定連接服務器的端口號,這里也有兩種方式,一是設置Service使用默認端口號,一是直接設置Port端口號,在1024以下的端口號中,很多都已經分配出去了,如FTP的端口為20和21,SMTP的端口是25,WEB服務器的端口為80等,為防止無意間的沖突,建議在編制自已的應用程序時,最好將Port設為1024以上。如果同時設置了Service和port,Delphi將使用Service默認的端口。
指定好服務器和端口號后,調用open方法或將Active屬性設為True,客戶端的Socket就會向服務端的Socket提出連接請求,如果此時服務端處于監聽狀態,就會自動接受請求建立連接,建立連接時,會觸發其Onconnet事件。需要斷開連接時,只需要調用close方法或將Active屬性設為False,此時會觸發ondisconnet事件。
二、Tserversocket元件:
同Tclientsocket一樣,建造一個服務器,只需要將一個Tserversock元件放在Form即可。
服務端的socket對象管理起來較為復雜。當服務器處于監聽狀態,此時服務端的socket對象用Tserversocket來操縱;當客戶提出請求,服務器響應請求并建立了連接,此時用Tserverclientwinsocket來操縱服務端Socket與客戶端的Socket的連接。
要使服務器處于監聽狀態,必須先指定端口號,當然,應該和客戶端的端口號相同。然后調用open方法或Active屬性設為True。
三、通信:
一旦建立起客戶與服務器的連接后,就可以進行相互間的通信了。Delphi為Tserversocket和Tclientsocket提供了幾個通信用的方法,用sendtext發送本本信息,用sendstream發送流,用SendBuf發送指定長度的數據。
需要注意的是,由于windows默認緩沖區大小為4K,所以當發送長于4K的信息時,比如,從服務端向客戶端發送的一個二進制流,在服務端只需要用 Socket.SendStream()就行了,而在客戶端就不一樣,它將多次觸發onread事件,而Delphi又沒有定義如“onreadend”之類的事件,因此,必須在接收時程序員自己對數據進行組裝。本文采取的方法是先將流長度發給客戶端,然后發送流,客戶端將接收的數據寫進一個流中,當流長度等于服務端發回的長度時,就表明客戶端已接收完畢了。對服務端來說,做為sendstream參數的流,會為Socket 所“擁有”,Socket對象結束時,它也將結束,而不要自己去釋放它,否則,會觸發一個異常。
同樣,當發送的文本小于4K,例如在客戶端程序中進行如下調用時
clientsocket1.Socket.SendText(‘gets‘);
clientsocket1.Socket.SendText(‘gets‘);
clientsocket1.Socket.SendText(‘gets‘);
服務端接收時會出現getsgets之類的現象,這可能是因為當緩沖區內的數據還未發送完時,又將新的文本放入緩沖區,計算機把它也當成同一批數據進行處理的緣故。為避免這個現象的發生,在程序內可采用一來一回“拋球”式的做法:
客戶端 服務端
clientsocket1.Socket.SendText(‘data1‘) socket.ReceiveText;
socket.sendtext(‘ok‘);
socket.receivetext;
clientsocket1.Socket.SendText(‘ data2‘)
socket.ReceiveText;
socket.sendtext(‘end‘);
socket.receivetext;

在另一臺計算機上運行服務端程序后,在您的客戶端程序上文本框內輸入該計算機名,接“連接”,按“取圖”,如何,對方計算機的屏幕一覽無余了吧。以下是程序的全部源代碼,本程序在NT4.0、Win95、Win98、局域網內運行通過,當然,windows必須得裝tcp/ip協議,而且必須有動態分配的或指定的ip地址。
如果您覺邊看邊“指揮”還是比較麻煩,您還可以對image1上的鍵盤、鼠標事件進行分析,然后發給服務端,服務端接收后,再進行同樣的操作,這樣您就可以不用麻煩操作員了。利用Delphi的Tclientsocket 和Tserversocket,還可以完成諸如文件復制、網上聊天、ICQ等應用程序的開發,實現起來都很簡單,你可以自由的發揮出你的想象力,編寫出更富魅力的程序來。

客戶端程序:
unit cmain;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls, ExtCtrls,jpeg;

type
TForm1 = class(TForm)
Panel1: TPanel;
ScrollBox1: TScrollBox;
Image1: TImage;
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
ClientSocket1: TClientSocket;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
c:longint;
m:tmemorystream;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
try
clientsocket1.Close;
clientsocket1.Host:=edit1.text;
clientsocket1.Open; //連接服務端
except
showmessage(edit1.text+#13#10+‘未開機或未安裝服務程序‘);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
clientsocket1.Socket.SendText(‘gets‘); //發送申請,通知服務端需要屏幕圖象
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
caption:=‘連接到‘+edit1.text;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
caption:=‘連接‘+edit1.text+‘失敗‘;
showmessage(edit1.text+#13#10+‘未開機或未安裝服務程序‘);
errorcode:=0;

end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buffer:array [0..10000] of byte; //設置接收緩沖區
len:integer;
ll:string;
b:tbitmap;
j:tjpegimage;
begin
if c=0 then //C為服務端發送的字節數,如果為0表示為尚未開始圖象接收
begin
ll:=socket.ReceiveText;
c:=strtoint(ll); //設置需接收的字節數
clientsocket1.Socket.SendText(‘okok‘); //通知服務端開始發送圖象
end else
begin //以下為圖象數據接收部分
len:=socket.ReceiveLength; //讀出包長度
socket.ReceiveBuf(buffer,len); //接收數據包并讀入緩沖區內
m.Write(buffer,len); //追加入流M中
if m.Size>=c then //如果流長度大于需接收的字節數,則接收完畢
begin
m.Position:=0;
b:=tbitmap.Create;
j:=tjpegimage.Create;
try
j.LoadFromStream(m); //將流M中的數據讀至JPG圖像對象J中
b.Assign(j); //將JPG轉為BMP
Image1.Picture.Bitmap.Assign(b); //分配給image1元件
finally //以下為清除工作
b.free;
j.free;
clientsocket1.Active:=false;
clientsocket1.Active:=true;
m.Clear;
c:=0;
end;
end;
end;


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
m:=tmemorystream.Create;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
m.free;
ClientSocket1.Close;
end;

end.


服務端程序:
unit smain;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp,jpeg;

type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
m1:tmemorystream;

implementation

{$R *.DFM}

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s,s1:string;
desk:tcanvas;
bitmap:tbitmap;
jpg:tjpegimage;
begin
s:=socket.ReceiveText;
if s=‘gets‘ then //客戶端發出申請
begin
bitmap:=tbitmap.Create;
jpg:=tjpegimage.Create;
desk:=tcanvas.Create; //以下代碼為取得當前屏幕圖象
desk.Handle:=getdc(hwnd_desktop);
m1:=tmemorystream.Create; //初始化流m1,在用sendstream(m1)發送流后,
//它將保留到socket對話結束,
//不能用手工free掉,否則會觸發異常
with bitmap do
begin
width:=screen.Width;
height:=screen.Height;
canvas.CopyRect(canvas.cliprect,desk,desk.cliprect);
end;
jpg.Assign(bitmap); //將圖象轉成JPG格式
jpg.SaveToStream(m1); //將JPG圖象寫入流中
jpg.free;
m1.Position:=0;
s1:=inttostr(m1.size);
Socket.sendtext(s1); //發送圖象大小
end;
if s=‘okok‘ then //客戶端已準備好接收圖象
begin
m1.Position:=0;
Socket.SendStream(m1); //發送JPG圖象
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.open;
end;

end.

上一篇:用Delphi獲取當前系統時間

下一篇:擴展Delphi的線程同步對象(1)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美电影免费观看高清完整| 日韩视频在线一区| 国产在线观看精品一区二区三区| 精品福利一区二区| 亚洲欧美国产精品久久久久久久| 日韩69视频在线观看| 超碰日本道色综合久久综合| 欧美精品18videos性欧美| 亚洲欧洲在线视频| 一区二区三区久久精品| 中文国产亚洲喷潮| 久久香蕉国产线看观看网| 激情成人在线视频| 日韩精品高清在线| 粉嫩老牛aⅴ一区二区三区| 国产视频综合在线| 91免费看片网站| 韩国v欧美v日本v亚洲| 日韩在线视频国产| 久久久久久久亚洲精品| 国产91精品久久久久久久| 日本国产欧美一区二区三区| 91久久精品久久国产性色也91| 亚洲成在人线av| 欧美极品xxxx| 国模视频一区二区| 91av视频在线播放| 欧美老女人bb| 国产精品av在线| 欧美精品在线免费播放| 影音先锋欧美在线资源| 国产日韩中文在线| 精品综合久久久久久97| 欧美日韩福利视频| 成人黄在线观看| 亚洲最新在线视频| 午夜精品久久久久久久男人的天堂| 国产一区二区三区在线播放免费观看| 亚洲国产古装精品网站| 亚洲综合社区网| 久久久亚洲成人| 日韩欧美成人免费视频| 日本一欧美一欧美一亚洲视频| 欧美激情第1页| 九九热99久久久国产盗摄| 日韩免费观看在线观看| 国产精品三级在线| 亚洲黄色av网站| 欧美一二三视频| 欧美电影在线观看网站| 性色av一区二区三区在线观看| 国产精品久久久久久久久久久久久| 久久亚洲精品视频| 在线观看免费高清视频97| 亚洲精品理论电影| 国产成人精品免费久久久久| 欧美在线一区二区三区四| 亚洲综合中文字幕68页| 亚洲福利影片在线| 琪琪第一精品导航| 日韩成人在线电影网| 国产精品久久久久久亚洲调教| 国产一区香蕉久久| 97久久超碰福利国产精品…| 亚洲激情视频在线| 欧美一区二区三区图| 国产精品一二区| 亚洲第一区中文字幕| 久久国产精品偷| 亚洲男人第一网站| 欧美性视频精品| 日韩精品在线观| 成人黄色在线观看| 福利视频一区二区| 日韩欧美中文免费| 国产精品旅馆在线| 国产精品吹潮在线观看| 最近2019中文字幕一页二页| 久久99国产精品久久久久久久久| 国内伊人久久久久久网站视频| 欧美激情a∨在线视频播放| 亚洲午夜精品久久久久久久久久久久| 欧美在线视频免费观看| 全亚洲最色的网站在线观看| 国产精品美女主播在线观看纯欲| 欧美精品videos另类日本| 亚洲iv一区二区三区| 国产精品网红直播| 亚洲免费电影在线观看| 国产精品白丝av嫩草影院| 一区二区三区精品99久久| 77777少妇光屁股久久一区| 国产视频一区在线| 欧美黄色性视频| 一个色综合导航| 久久国产精品久久国产精品| 亚洲欧美国产一区二区三区| 久久成人在线视频| 国模精品系列视频| 中文字幕综合在线| 国产一区二区三区日韩欧美| 欧美日韩国产精品一区二区三区四区| 欧美性xxxx极品高清hd直播| 亚洲专区在线视频| 国产在线精品成人一区二区三区| 欧美wwwxxxx| 4k岛国日韩精品**专区| 久久久久久久一区二区| 亚洲一区二区三区毛片| 国产精品视频公开费视频| 亚洲一区二区三区毛片| 亚洲精品成人网| 欧美日韩一区二区在线播放| 狠狠色狠色综合曰曰| 成人激情黄色网| 色琪琪综合男人的天堂aⅴ视频| 国产成人黄色av| 国产成人综合久久| 国产啪精品视频| 中文字幕亚洲欧美一区二区三区| 国产免费亚洲高清| 正在播放欧美一区| 北条麻妃一区二区在线观看| 欧美大码xxxx| 欧美成人三级视频网站| 在线午夜精品自拍| 日韩av电影在线网| 成人免费看吃奶视频网站| 亚洲欧美成人在线| 亚洲免费高清视频| 啪一啪鲁一鲁2019在线视频| 久久艹在线视频| 成年无码av片在线| 欧美日韩在线视频一区二区| 午夜精品久久久久久99热| 欧美大胆在线视频| 国产成人精品在线| 欧美一区二区.| 欧美激情综合色| 26uuu另类亚洲欧美日本老年| 色婷婷久久av| 日韩免费av一区二区| 狠狠色香婷婷久久亚洲精品| 久久九九有精品国产23| 久久99亚洲热视| 日本在线精品视频| 96国产粉嫩美女| 亚洲精品国产品国语在线| 性欧美在线看片a免费观看| 亚洲综合av影视| 欧美又大粗又爽又黄大片视频| 国产精品综合网站| 国产精品扒开腿做| 欧美性猛xxx| 日韩经典第一页| 亚洲国产日韩一区| 成人免费淫片aa视频免费| 成人欧美一区二区三区黑人| 5566日本婷婷色中文字幕97| 色噜噜狠狠狠综合曰曰曰| 日韩免费看的电影电视剧大全| 欧美一级成年大片在线观看| 亚洲第一福利网| 综合激情国产一区|