|
WinSock是一組API,用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù)和交換信息。雖然現(xiàn)在有很多工具如FTP程序可以在網(wǎng)絡(luò)上傳輸數(shù)據(jù)和文件,但是通過WinSock編程有更大的靈活性,它不需要關(guān)心網(wǎng)絡(luò)連接的細(xì)節(jié),然而用WinSock編程卻很復(fù)雜,但是在Delphi中我們并不需要直接與WinSock的API打交道,因?yàn)門ClientSocket元件和TServerSocket元件(Internet頁)封裝了WinSock的大部分API,使得對WinSock的訪問大大簡化。下面這個遠(yuǎn)程控制的例子就很清楚地說明了這個問題,它可以發(fā)送一個消息給對方,并能夠使對方的電腦關(guān)閉、重新啟動或重新登錄。
一、實(shí)現(xiàn)原理 實(shí)行遠(yuǎn)程控制,實(shí)際上就是一個服務(wù)器程序(以下簡稱被控程序)和一個客戶程序(以下簡稱主控程序):被控方即為服務(wù)器程序,它監(jiān)聽客戶的請求,并作出處理;主控方即為客戶程序,它連接上服務(wù)器后,發(fā)出自己的請求,服務(wù)器便根據(jù)自已的請求進(jìn)行不同的響應(yīng)。
二、編寫主控程序 新建一個項(xiàng)目Client.dpr,并把一個TClientSocket元件放到Form上,它的屬性設(shè)置如下:Port設(shè)為100(端口號可任意設(shè)置,只要求雙方統(tǒng)一),其它屬性按默認(rèn)值。在窗體上添加兩個TEdit:Edit1用來輸入發(fā)送的字符,Edit2用來輸入IP地址;添加兩個TButton:Button1點(diǎn)擊后用來連接被控機(jī),Button2點(diǎn)擊后用來發(fā)送字符,然后聲明一個私有變量ConnectFlag,表示雙方是否連接好:
private ConnectFlag:Boolean;
---- 2、ClientSocket1的OnConnect事件代碼如下:
procedure TForm1.ClientSocket1Connect (Sender: TObject;Socket: TCustomWinSocket); begin ConnectFlag:=True; //表示連接成功 end;
---- 3、ClientSocket1的OnError事件代碼如下:
procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer); begin Application.MessageBox(PChar(' 不能連接到IP地址 : ' + Edit2.Text+'。'+ #13+'可能是監(jiān)聽程序沒有運(yùn)行或網(wǎng)絡(luò)故障!'),' 連接錯誤',MB_OK+MB_ICONSTOP); ErrorCode := 0; end;
---- 4、Button1的OnClick事件代碼如下:
procedure TForm1.Button1Click(Sender: TObject); begin with ClientSocket1 do begin if Active then begin Active := False;//在連接之前首先關(guān)閉 ConnectFlag:=False; //置連接標(biāo)志為假 end; if Length(Edit2.Text) > 0 then begin Host := Edit2.Text; //指定IP地址或主機(jī)名 Active := True; end; end; end;
---- 5、Button2的OnClick事件代碼如下:
procedure TForm1.Button2Click(Sender: TObject); begin if ConnectFlag then ClientSocket1.Socket.SendText(Edit1.Text) //如果連接成功則發(fā)送字符串 else Application.MessageBox(PChar(' 沒有連接到地址 : ' + Edit2.Text+'。'+ #13+'檢查IP地址是否存在或是否已經(jīng)連接!'),' 提示信息',MB_OK+MB_ICONSTOP); end;
三、編寫被控程序 ---- 1、新建一個項(xiàng)目Server.dpr,并把一個TServerSocket元件放到Form上,
它的屬性設(shè)置如下:Active設(shè)為True;Port設(shè)為100,其它屬性按默認(rèn)值。
---- 2、ServerSocket1的OnClientRead事件代碼如下:
procedure TForm1.ServerSocket1ClientRead (Sender: TObject;Socket: TCustomWinSocket); var Str:PChar; Code,V:Integer; begin Str:=PChar(Socket.ReceiveText); //接收字符串 Val(Str,V,Code); //處理接收的字符串,首先轉(zhuǎn)換字符串為整數(shù) if Code< >0 then Application.MessageBox(Str,'提示信息', MB_OK+MB_ICONINFORMATION) //如果轉(zhuǎn)換后的數(shù)據(jù)不是一個整型數(shù)就通過消息框來顯示字符串 else if (V=0)or(V=1)or(V=2) then ExitWindowsEx(V,0) //調(diào)用Windows的API函數(shù)(V=0表示重新登錄、 V=1表示關(guān)機(jī)、V=2表示重啟動) else Application.MessageBox(Str,'提示信息', MB_OK+MB_ICONINFORMATION); //轉(zhuǎn)換后數(shù)據(jù)不為0、1、2時在消息框內(nèi)顯示字符串 end;
---- 3、修改項(xiàng)目文件,不讓窗口顯示并且防止它運(yùn)行兩次,修改begin和end之
間的代碼如下:
begin Application.Initialize; if FindWindow('TForm1','Form1')=0 then begin //當(dāng)沒有找到Form1時執(zhí)行下面代碼 Application.ShowMainForm:=False; //不顯示主窗口 Application.CreateForm(TForm1, Form1); Application.Run; end; end.
四、注意事項(xiàng) ---- 1、網(wǎng)絡(luò)要裝配正確并安裝TCP/IP協(xié)議,且要正常運(yùn)行。
---- 2、首先要運(yùn)行被控程序。
---- 3、必須知道對方的IP地址或主機(jī)名。
不過要注意的是,此程序可以遠(yuǎn)程控制對方的計算機(jī),請慎用.如果出現(xiàn)問題,筆者概不負(fù)責(zé).
|