WinSock是一組API,用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù)和交換信息。雖然現(xiàn)在有很多工具如FTP程序可以在網(wǎng)絡(luò)上傳輸數(shù)據(jù)和文件,但是通過(guò)WinSock編程有更大的靈活性,它不需要關(guān)心網(wǎng)絡(luò)連接的細(xì)節(jié),然而用WinSock編程卻很復(fù)雜,但是在Delphi中我們并不需要直接與WinSock的API打交道,因?yàn)門(mén)ClientSocket元件和TServerSocket元件(Internet頁(yè))封裝了WinSock的大部分API,使得對(duì)WinSock的訪問(wèn)大大簡(jiǎn)化。下面這個(gè)遠(yuǎn)程控制的例子就很清楚地說(shuō)明了這個(gè)問(wèn)題,它可以發(fā)送一個(gè)消息給對(duì)方,并能夠使對(duì)方的電腦關(guān)閉、重新啟動(dòng)或重新登錄。
一、實(shí)現(xiàn)原理 實(shí)行遠(yuǎn)程控制,實(shí)際上就是一個(gè)服務(wù)器程序(以下簡(jiǎn)稱(chēng)被控程序)和一個(gè)客戶(hù)程序(以下簡(jiǎn)稱(chēng)主控程序):被控方即為服務(wù)器程序,它監(jiān)聽(tīng)客戶(hù)的請(qǐng)求,并作出處理;主控方即為客戶(hù)程序,它連接上服務(wù)器后,發(fā)出自己的請(qǐng)求,服務(wù)器便根據(jù)自已的請(qǐng)求進(jìn)行不同的響應(yīng)。
二、編寫(xiě)主控程序 新建一個(gè)項(xiàng)目Client.dpr,并把一個(gè)TClientSocket元件放到Form上,它的屬性設(shè)置如下:Port設(shè)為100(端口號(hào)可任意設(shè)置,只要求雙方統(tǒng)一),其它屬性按默認(rèn)值。在窗體上添加兩個(gè)TEdit:Edit1用來(lái)輸入發(fā)送的字符,Edit2用來(lái)輸入IP地址;添加兩個(gè)TButton:Button1點(diǎn)擊后用來(lái)連接被控機(jī),Button2點(diǎn)擊后用來(lái)發(fā)送字符,然后聲明一個(gè)私有變量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)聽(tīng)程序沒(méi)有運(yùn)行或網(wǎng)絡(luò)故障!'),' 連接錯(cuò)誤',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(' 沒(méi)有連接到地址 : ' + Edit2.Text+'。'+ #13+'檢查IP地址是否存在或是否已經(jīng)連接!'),' 提示信息',MB_OK+MB_ICONSTOP); end;
三、編寫(xiě)被控程序 ---- 1、新建一個(gè)項(xiàng)目Server.dpr,并把一個(gè)TServerSocket元件放到Form上,
它的屬性設(shè)置如下:Active設(shè)為T(mén)rue;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ù)不是一個(gè)整型數(shù)就通過(guò)消息框來(lái)顯示字符串 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表示重啟動(dòng)) else Application.MessageBox(Str,'提示信息', MB_OK+MB_ICONINFORMATION); //轉(zhuǎn)換后數(shù)據(jù)不為0、1、2時(shí)在消息框內(nèi)顯示字符串 end;
---- 3、修改項(xiàng)目文件,不讓窗口顯示并且防止它運(yùn)行兩次,修改begin和end之
間的代碼如下:
begin Application.Initialize; if FindWindow('TForm1','Form1')=0 then begin //當(dāng)沒(méi)有找到Form1時(shí)執(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、必須知道對(duì)方的IP地址或主機(jī)名。
不過(guò)要注意的是,此程序可以遠(yuǎn)程控制對(duì)方的計(jì)算機(jī),請(qǐng)慎用.如果出現(xiàn)問(wèn)題,筆者概不負(fù)責(zé).
|