日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > 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)

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

新聞熱點

疑難解答

圖片精選

網友關注

亚洲素人一区二区| 久久99久久久久久久噜噜| 欧美日韩精品是欧美日韩精品| 久久久水蜜桃| 国产不卡一区二区在线观看| 搞黄在线观看| av首页在线| 国产九九在线| 日韩在线 中文字幕| 精品精品久久| 91精品国产自产观看在线| 亚洲国产欧美久久| 日韩久久久精品| 久久夜色精品国产噜噜亚洲av| 欧美三级一区二区三区| 欧美一卡2卡3卡4卡| 亚洲欧美伊人| 国产欧美日韩综合精品| 国产黄色在线网站| 日韩欧美一二三| 欧美日韩中国免费专区在线看| 国产一卡2卡3卡4卡网站免费| 欧美在线日韩在线| 玖玖在线免费视频| 日韩欧美专区在线| 欧美日韩久久不卡| 精品日韩av| 亚洲国产欧美久久| 国产黄色在线观看| 亚洲免费看av| 精品欧美久久久| 午夜伦欧美伦电影理论片| 天堂精品高清1区2区3区| 视频在线一区二区| 久久久水蜜桃| 国产91欧美| 久久人人88| 国产欧美日韩在线播放| 欧美日韩视频不卡| 色综合久久88色综合天天免费| 日韩在线视频一区| 日韩欧美字幕| 国产黄在线播放| 欧美三级精品| 国产一区精品| 午夜伊人狠狠久久| 亚洲一区三区在线观看| www日韩在线观看| 91久久精品国产91性色69| 欧美日韩精品久久久| 欧美日韩国产综合久久| 中文字幕日韩欧美在线视频| 日韩精品在线观| 91亚洲国产| 亚洲一区中文在线| 91最新在线| 色综合影院在线| 五月天久久比比资源色| 亚洲高清中文字幕| 欧美精品一区二区三区在线播放| 日韩亚洲欧美中文字幕| 久久精品卡一| 婷婷精品进入| 亚洲综合视频一区| 国产 欧美 在线| 日韩视频一区| 伊人亚洲视频| 日韩在线高清视频| 在线免费播放av| 国产婷婷一区二区| 伊人www22综合色| 亚洲中午字幕| 在线观看一区| 成人精品视频一区| 一区二区不卡在线| 国产在线高清精品| 国产调教精品| 中文字幕无线码一区| 中文精品在线| 亚洲女人天堂a在线播放| 亚洲 欧美综合在线网络| 欧美亚洲国产日韩2020| 欧美久久久网站| 99久久精品国产亚洲| 日韩视频在线免费播放| 中文字幕亚洲乱码| 日韩中文字幕综合| 亚洲va中文字幕| 日韩欧美中文字幕在线视频| 午夜成人鲁丝片午夜精品| 亚洲第一精品在线| 欧美日韩精品欧美日韩精品一| 日本不卡高清视频一区| 日韩一级免费在线观看| 欧美亚洲国产日韩2020| 日韩三级视频在线| 亚洲久草视频| 欧美日韩综合色| 91av久久久| 日韩一级视频在线观看| 欧美日韩性视频| 国产小视频在线观看免费| 精品视频资源站| 欧美1234区| 中文字幕在线观看欧美| 亚洲日本精品视频| 日本熟女一区二区| 精品视频123区在线观看| 久艹在线视频| 国产一区三区三区| 国产www在线观看| 在线国产99| 亚洲娇小xxxx欧美娇小| 国产在线看一区| 日韩精品视频在线观看网址| 三级精品视频| 日韩久久精品成人| 日韩在线 中文字幕| 日韩中文字幕观看| 91精品国产综合久久久久久漫画 | 97久久精品午夜一区二区| 欧美日韩中文字幕视频| 中文字幕亚洲欧美| 日韩不卡一二三区| 日本a口亚洲| 欧美日韩三级在线| 91久久精品网| 日韩免费视频一区二区| 在线不卡一区二区| 亚洲三级av| 日韩欧美资源站| 国产黄色小视频| 亚洲3区在线| 欧美日韩在线观看成人| 黄色一级大片在线免费看国产一| 91精品国产色综合久久不卡蜜臀 | 欧美不卡视频一区发布| 亚洲第一视频| 久久久精品午夜少妇| 日韩wumaV| 欧美日韩精品国产| 国产小视频在线观看免费| 精品一区二区三区中文字幕在线| 不卡一二三区| 久久福利视频一区二区| 亚洲经典中文字幕| 国产亚洲人成a一在线v站| 亚洲成在线观看| 欧美日韩免费高清| 日韩视频免费直播| wwwwww在线观看| 国产日产一区二区三区| 精品日韩在线观看| 欧美一级一级性生活免费录像| 欧美日韩国产影片| 中文字幕精品视频| 91精品啪在线观看国产60岁| 69堂精品视频在线播放| 亚欧成人精品| 国产免费久久久| 亚洲素人一区二区| 日韩欧美一二三区| 蜜桃视频一日韩欧美专区| 一级免费a一片| 欧美日韩一区二区在线视频| 久久精品视频免费看| 日韩不卡一二三区| 在线视频观看日韩| 蜜臀久久精品| 欧美日韩国产亚洲一区| 国产午夜在线观看| 中文字幕久久精品| 国产在线观看a| 精品免费视频| 中文 欧美 日韩| 久久久99久久精品欧美| 久久99精品国产| 国产福利精品导航| 免费国产h视频在线观看86| 日韩不卡高清视频| a级在线免费观看| 精品国产99久久久久久| 国产色综合网| 中文在线日韩| 日韩精品福利视频| 国产一级在线| 中文亚洲免费| 国产一级片网站| 久久精品99久久久久久久久| 亚洲国产欧美久久| 国产一级视频| 欧美日韩国产黄色| 亚洲一区日韩精品中文字幕| 精品综合久久久久| 国产一级久久久| 欧美sm一区| 亚洲视频在线观看三级| 精品1区2区3区| 日韩亚洲欧美中文字幕| 久久精品久久久久| 国产一区 二区 三区一级| 亚洲一区日韩在线| 亚洲视频在线观看三级| 亚洲视频电影在线| 日本а中文在线天堂| 欧美在线日韩| 中文字幕国产视频| 欧美日韩视频在线| 中文字幕最新精品| 一区二区三区鲁丝不卡| 精品成a人在线观看| 亚洲成a人片在线www| av免费观看网站| 日韩欧美一二三| 欧美日韩国产成人| 99亚洲视频| 日韩中文字幕在线视频观看| 日韩在线高清视频| 欧美三级在线播放| 日韩精品午夜| 日本中文字幕在线观看| 国产99在线|亚洲| 日韩欧美国产成人精品免费| 日韩福利视频导航| 欧美三级中文字幕| 国产一区激情在线| 中文字幕在线观看亚洲| av三级在线播放| 精品国自产在线观看| 亚洲成a人片在线www| 高清不卡一区二区| 日韩欧美在线网站| 国产欧美日韩在线| 久久精品国产视频| 91精品国产自产在线| 国产一区三区三区| 天堂√8在线中文| 亚洲三级免费看| 国产欧美日韩在线播放| 精品久久久久久综合日本欧美| 91九色在线播放| 日本a级黄色| 午夜伊人狠狠久久| 欧美日韩在线播放三区四区| 国产成人一区二区精品非洲| 九一久久久久久| 日本亚洲欧美| 中文字幕伊人| 国产一区精品在线| 亚洲免费精品| 欧洲精品在线一区| 中文字幕乱码在线| 精品国产乱码久久久久久牛牛| 亚洲欧美日本另类| 日韩精品乱码av一区二区| 91精品久久久久久蜜臀| 日韩三级视频在线播放| 九九在线精品| 国产成人精品av久久| 蜜臀91精品国产高清在线观看| 国产在线不卡一区| 天堂精品高清1区2区3区| 中文字幕精品www乱入免费视频| 亚洲va中文字幕| 欧美日韩国产亚洲一区| 国产 日韩 欧美 综合| 中文字幕视频一区二区三区久| 日韩在线观看精品| 精品久久久精品| 青青久在线视频免费观看| 国产高清精品在线观看| 日韩av一区二区在线| 国产美女主播视频一区| 中文字幕在线导航| 欧美久久综合性欧美| 中文字幕日韩欧美在线| 九九在线精品| 欧美日韩国产123区| 一区二区三区在线播| 视频在线一区二区| 欧美日韩中文字幕综合视频| 中文字幕亚洲一区在线观看| 日韩欧美中文字幕在线观看| 91麻豆精品国产91久久久使用方法 | 久久99久久99精品中文字幕| 久久99精品久久久久子伦| 拍真实国产伦偷精品| 久久久精品午夜少妇| 日韩视频精品在线| 精品亚洲综合| 亚洲欧洲日韩在线| 欧美久久久网站| 精品视频123区在线观看| 99这里有精品视频| 亚洲欧美日本另类| 蜜臀久久精品| 日韩一级二级三级精品视频| 快she精品国产999| 精品播放一区二区| 久久久精品欧美| 精品久久人人做人人爽| 欧美日韩高清| 二区视频在线观看| 国产视频一区二| 精品久久久91| 91九色精品视频| 国产一区日韩| 亚洲二区自拍| 中文字幕在线国产| 黄色资源在线观看| 欧美一级在线免费| 1区2区3区在线视频| 日韩中文字幕视频在线| 在线国产一级| 国产在线观看黄色| 欧美 亚洲 精品 三区| 国产激情久久久| 日韩高清不卡一区二区| 91精品国产综合久久久久久漫画| 日韩欧美99| 久久久久蜜桃| 一级特黄大欧美久久久| 国产日韩第一页v| 欧美日韩精品综合在线 | 日韩视频中文字幕| av免费不卡国产观看| 中文字幕最新精品| 久久久精品福利| 国产色在线 com| 999精品网| 国产一区成人| 日本精品二区| 1区2区在线| 不卡av免费在线| 久久久久久自在自线| 日韩中文字幕在线视频播放| 国产午夜精品视频免费不卡69堂| 国产成人精品亚洲| 91精品国产91久久久久久久久| 91精品国产调教在线观看| 在线欧美一级视频| 国产视频一区三区| 国产高清在线视频| 国产69精品久久久久孕妇国产69久久| 精品日韩av一区二区| 国产黄色在线免费观看| 国产一区不卡精品| 亚洲欧美99| 久久精品国产99| 国产日产一区二区| 欧美一卡2卡三卡4卡5免费| 国产亚洲人成a一在线v站| 亚洲欧美小说国产图片| 欧美激情一区二区三区在线| 亚洲综合在线小说| 97国产视频| 亚洲专区一二三| 最新中文字幕在线| 精品视频三区| 中文字幕在线视频第一页| 麻豆精品99| 精品对白一区国产伦| 日韩福利视频导航| 精品久久九九| 久久99久久久久久久噜噜| 91精品国产综合久久久久| 日韩欧美中文字幕在线观看| 在线亚洲免费| 久久人人88| 91精品观看| 中文字幕欧美亚洲| 91精品国产综合久久蜜臀| 91精品高清| 国产手机精品视频| 在线观看区一区二| 欧美日韩日本视频| 成年人黄国产| 欧美日韩综合在线免费观看| av免费观看国产| 欧美日韩在线三级| 久久久精品福利| 婷婷中文字幕一区三区| 91国内在线| 欧美 日韩 国产 在线| 欧美在线日韩精品| 先锋男人资源站| 欧美三级日本三级少妇99| 中文字幕在线视频久| 精品欧美日韩在线| a视频在线播放| 国产福利三区| 国产区视频在线观看| 欧美日韩一二三四| 精品视频资源站| 中文av字幕一区| 日韩av二区| 欧美日韩乱国产| 日韩免费高清一区二区| 欧美国产一区视频在线观看| 亚洲高清视频一区|