易語(yǔ)言“數(shù)據(jù)報(bào)、客戶、服務(wù)器 ”
━━━━━━━━━━━━━━━━━━━━━━━━━━ 這是三個(gè)典型的網(wǎng)絡(luò)控件,寫(xiě)網(wǎng)絡(luò)程序少不了它們。 通過(guò)網(wǎng)絡(luò)交互數(shù)據(jù),首先要明白“連接”和“無(wú)連接”的概念。最簡(jiǎn)單的例子莫過(guò)于打電話和寫(xiě)信。兩個(gè)人如果要通電話,得首先建立連接——即撥號(hào),等待對(duì)方應(yīng)答后才能相互傳遞信息,最后還要釋放連接——即掛電話。寫(xiě)信就沒(méi)有那么復(fù)雜了,地址姓名填好以后直接往郵筒一扔,收信人就能收到。用數(shù)據(jù)報(bào)控件進(jìn)行數(shù)據(jù)交互,類似于寫(xiě)信,是基于“無(wú)連接”的;用客戶、服務(wù)器進(jìn)行數(shù)據(jù)交互,類似于打電話,是基于“連接”的。 根據(jù)提供服務(wù)類型的不同,端口分為兩種,一種是TCP端口,一種是UDP端口。計(jì)算機(jī)之間相互通信的時(shí)候,分為兩種方式:一種是發(fā)送以后就不管了,不去確認(rèn)信息是否到達(dá),這種方式大多采用UDP協(xié)議(我們熟悉的OICQ就是采用這種協(xié)議);一種是發(fā)送信息以后,可以確認(rèn)信息是否到達(dá),也就是有應(yīng)答的方式,這種方式大多采用TCP協(xié)議。(這兩種交互方式分別類似于生活中的寫(xiě)信和打電話。)在易語(yǔ)言中,用數(shù)據(jù)報(bào)控件封裝了UDP協(xié)議,用客戶控件和服務(wù)器控件封裝了TCP協(xié)議。 Ⅰ- 數(shù)據(jù)報(bào) ------------------------ 數(shù)據(jù)報(bào)是一種不可靠、小數(shù)據(jù)量的網(wǎng)絡(luò)數(shù)據(jù)交互方式。如果傳遞的數(shù)據(jù)量過(guò)大,有可能會(huì)失敗,最好不要超過(guò) 127 字節(jié)。如需要大數(shù)據(jù)量或者可靠數(shù)據(jù)傳送方式,請(qǐng)使用基于連接的其它網(wǎng)絡(luò)組件(如客戶、服務(wù)器)。 雖然數(shù)據(jù)報(bào)控件傳遞的數(shù)據(jù)量小,又不夠可靠,但它簡(jiǎn)單易用,在對(duì)數(shù)據(jù)量、可靠性沒(méi)有特別要求的情況下,還是有它充分發(fā)揮作用的領(lǐng)域。最后我將用該控件做一個(gè)網(wǎng)絡(luò)聊天程序(數(shù)據(jù)報(bào)版),作為例程。 數(shù)據(jù)報(bào)的重要屬性有:端口。 數(shù)據(jù)報(bào)的重要方法有:發(fā)送數(shù)據(jù)()、取回?cái)?shù)據(jù)()。 數(shù)據(jù)報(bào)的重要事件有:數(shù)據(jù)到達(dá)。 一、數(shù)據(jù)報(bào)的重要屬性 ◆端口 端口屬性是一個(gè)整數(shù)型的值,默認(rèn)值是19730。如果要改動(dòng),盡量取大于1024的較大值。 端口是很重要的概念。首先需要明白的一點(diǎn)是,我們這里所說(shuō)的端口,不是計(jì)算機(jī)硬件的I/O端口,而是軟件概念上的端口。 服務(wù)器可以向外提供多種服務(wù),比如,一臺(tái)服務(wù)器可以同時(shí)是WEB服務(wù)器,也可以是FTP服務(wù)器,同時(shí),它也可以是郵件服務(wù)器。為什么一臺(tái)服務(wù)器可以同時(shí)提供那么多的服務(wù)呢?其中一個(gè)很主要的方面,就是各種服務(wù)采用不同的“端口”來(lái)分別提供不同的服務(wù),比如:HTTP(超文本傳送)采用80端口,F(xiàn)TP(文件傳輸)采用21端口,Telnet(遠(yuǎn)程登陸)采用23端口,POP3(郵件接收)采用110端口,SMTP(簡(jiǎn)單郵件傳送)采用25端口,DNS(域名解析服務(wù))采用53端口等。這樣,通過(guò)不同端口,計(jì)算機(jī)與外界進(jìn)行互不干擾的通信??梢赃@樣說(shuō):端口是計(jì)算機(jī)與外部通信的途徑,沒(méi)有它,計(jì)算機(jī)便又聾又啞。 如果把計(jì)算機(jī)比成一個(gè)餐廳的話,那端口就是一個(gè)個(gè)賣(mài)飯的窗口。我們都知道餐廳里的窗口大都有詳細(xì)的分工,要買(mǎi)饅頭跑到賣(mài)雞蛋湯的窗口前肯定是買(mǎi)不到的。如果要想和在餐廳工作的MM見(jiàn)見(jiàn)面,說(shuō)說(shuō)話,要通過(guò)哪個(gè)窗口呢?賣(mài)湯、賣(mài)菜、賣(mài)饃的窗口顯然是不現(xiàn)實(shí)的。好在計(jì)算機(jī)這個(gè)“大”的餐廳有非常多的窗口,并且絕大多數(shù)都不常用,只要隨便找一個(gè)(當(dāng)然要避免賣(mài)湯、賣(mài)菜、賣(mài)饃的窗口)就可以和MM交流了。 計(jì)算機(jī)中總共有256×256即65536個(gè)端口(編號(hào)從0到65535),其中前1024個(gè)端口都有確切的定義,它們對(duì)應(yīng)著因特網(wǎng)上常見(jiàn)的一些服務(wù)。1024號(hào)以后的端口是為應(yīng)用程序保留的,可以隨意選用(易語(yǔ)言中限32767以下)。這也提醒我們,在為數(shù)據(jù)報(bào)控件(包括以后的客戶、服務(wù)器控件)指定端口屬性時(shí),盡量取較大的數(shù)值,以免沖突。[注:其實(shí)端口也不是特別的重要,只要能保證發(fā)送數(shù)據(jù)一方和接收數(shù)據(jù)一方都知道對(duì)方的端口即可。這就象餐廳外的GG和餐廳內(nèi)的MM見(jiàn)面,通過(guò)哪一個(gè)窗口見(jiàn)面并不重要,重要的是他們?nèi)チ送粋€(gè)窗口。] 二、數(shù)據(jù)報(bào)的重要方法 ◆發(fā)送數(shù)據(jù) 功能:發(fā)送數(shù)據(jù)到指定主機(jī)上的指定端口。 語(yǔ)法:數(shù)據(jù)報(bào)名稱.發(fā)送數(shù)據(jù)([接收主機(jī)地址],接收主機(jī)端口號(hào),欲發(fā)送數(shù)據(jù)) 參數(shù):接收主機(jī)地址——文本型,可以為主機(jī)名、IP地址等。如果省略本參數(shù)或者提供空文本,則在指定端口廣播欲發(fā)送數(shù)據(jù)。接收主機(jī)端口號(hào)——整數(shù)型,必須是對(duì)方(接收主機(jī))數(shù)據(jù)報(bào)控件的端口屬性指定的數(shù)值。欲發(fā)送數(shù)據(jù)——欲發(fā)送的數(shù)據(jù),可以是文本型、整數(shù)型、小數(shù)型、邏輯型、日期時(shí)間型等(數(shù)據(jù)類型不限)。 返回值:邏輯型。如果數(shù)據(jù)發(fā)送成功,返回真;如果發(fā)送失敗,返回假。 應(yīng)用實(shí)例:1、數(shù)據(jù)報(bào)1.發(fā)送數(shù)據(jù)( 127.0.0.1,19730,123) 2、數(shù)據(jù)報(bào)1.發(fā)送數(shù)據(jù)(“liigo”,19730,“易語(yǔ)言”) //實(shí)例1:向IP地址為127.0.0.1的主機(jī)19730端口發(fā)送整數(shù)型數(shù)據(jù)123; //實(shí)例2:向主機(jī)名為“liigo”的主機(jī)19730端口發(fā)送文本數(shù)據(jù)“易語(yǔ)言”; //通過(guò)語(yǔ)法介紹和應(yīng)用實(shí)例,我們看到,要向?qū)Ψ桨l(fā)送數(shù)據(jù),需要指定對(duì)方的主機(jī)地址和端口號(hào)。這有點(diǎn)類似寫(xiě)信要指定收信人地址和收信人姓名(如果不寫(xiě)或?qū)戝e(cuò)是郵不到的)。也許您仍然要問(wèn),數(shù)據(jù)究竟發(fā)送給誰(shuí)了呢?答:發(fā)送給了另一個(gè)程序中的另一個(gè)數(shù)據(jù)報(bào)控件,這個(gè)程序必須是運(yùn)行在指定主機(jī)上(IP地址為127.0.0.1,或主機(jī)名為“liigo”),這個(gè)數(shù)據(jù)報(bào)控件的端口屬性必須是指定值(19730)。如果沒(méi)有滿足條件的接收對(duì)象,自然就不會(huì)有誰(shuí)收到數(shù)據(jù)——這跟寫(xiě)信也很類似。 [注意:本方法的邏輯型返回值只是標(biāo)志“發(fā)送”數(shù)據(jù)的成功與否,與數(shù)據(jù)能不能成功“到達(dá)”沒(méi)有任何關(guān)系。事實(shí)上,數(shù)據(jù)報(bào)控件只管發(fā)送數(shù)據(jù),而對(duì)數(shù)據(jù)是否到達(dá)毫不過(guò)問(wèn)。這就是前面說(shuō)的它的“不可靠性”。] ◆取回?cái)?shù)據(jù) 功能:取回?cái)?shù)據(jù)報(bào)控件所接收到的數(shù)據(jù)。 語(yǔ)法:數(shù)據(jù)報(bào)名稱.取回?cái)?shù)據(jù)() 返回值:字節(jié)集型。注意是字節(jié)集型,使用時(shí)經(jīng)常需要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。 應(yīng)用實(shí)例:1、x=數(shù)據(jù)報(bào)1.取回?cái)?shù)據(jù)() //取回?cái)?shù)據(jù)并存入字節(jié)集型變量x中 編輯框1.內(nèi)容=從字節(jié)集轉(zhuǎn)換(x,#文本型) //顯示到編輯框1中 //“從字節(jié)集轉(zhuǎn)換(x,#文本型)”表示將字節(jié)集型變量x轉(zhuǎn)換成文本型(第二個(gè)參數(shù)“#文本型”指定目標(biāo)數(shù)據(jù)類型,“#文本型”是易語(yǔ)言系統(tǒng)定義的常量)。 //[注:您可能非常熟悉“到文本()”函數(shù)了,但它只能將整數(shù)型、邏輯型、日期時(shí)間型轉(zhuǎn)換成文本型,并不能轉(zhuǎn)換字節(jié)集型。字節(jié)集是比較特殊的數(shù)據(jù)類型,易語(yǔ)言專門(mén)提供了針對(duì)它的類型轉(zhuǎn)換函數(shù)“從字節(jié)集轉(zhuǎn)換()”和“轉(zhuǎn)換為字節(jié)集()”。] //上述實(shí)例也可合寫(xiě)到一行中:“編輯框1.內(nèi)容=從字節(jié)集轉(zhuǎn)換(數(shù)據(jù)報(bào)1.取回?cái)?shù)據(jù)(),#文本型)”。 //注意“取回?cái)?shù)據(jù)”方法只能在數(shù)據(jù)報(bào)控件的“數(shù)據(jù)到達(dá)”事件的處理子程序中調(diào)用。在其它地方即使調(diào)用了也取不到正確的數(shù)據(jù)。 [補(bǔ)充:您可能正在感到奇怪,為什么非要返回字節(jié)集型的值呢,使用時(shí)還要多一步轉(zhuǎn)換,直接返回文本型多好!答:因?yàn)樵谒袛?shù)據(jù)類型中,只有字節(jié)集型最具有通用性。比如要傳遞的是一張圖片數(shù)據(jù),除字節(jié)集外,其它數(shù)據(jù)類型都不合適。] 三、數(shù)據(jù)報(bào)的重要事件 ◆數(shù)據(jù)到達(dá) 事件的產(chǎn)生時(shí)機(jī):當(dāng)有數(shù)據(jù)到達(dá)時(shí)自動(dòng)產(chǎn)生此事件。 在本事件的處理子程序中,一個(gè)最重要的任務(wù)就是取回“到達(dá)的數(shù)據(jù)”——通過(guò)“取回?cái)?shù)據(jù)()”方法。還得再提醒您一次,“取回?cái)?shù)據(jù)()”返回的是字節(jié)集型的數(shù)據(jù),通常需要用數(shù)據(jù)類型轉(zhuǎn)換函數(shù)“從字節(jié)集轉(zhuǎn)換()”將字節(jié)集數(shù)據(jù)轉(zhuǎn)換為其它數(shù)據(jù)類型(最常用的數(shù)據(jù)類型無(wú)疑是文本型)。 我寫(xiě)了一個(gè)使用數(shù)據(jù)報(bào)控件進(jìn)行網(wǎng)絡(luò)聊天的程序。在已經(jīng)連網(wǎng)的任意兩臺(tái)機(jī)器上分別運(yùn)行該程序,指定對(duì)方機(jī)器的IP地址或主機(jī)名之后,就能互相對(duì)話了。(如果在單機(jī)上測(cè)試,則自己發(fā)的信息自己收到。) Ⅱ- 客戶、服務(wù)器 -------------------------------------- 客戶控件和服務(wù)器控件是一對(duì)好搭擋。它們總是成對(duì)使用,分處于兩個(gè)獨(dú)立的應(yīng)用程序中,一個(gè)充當(dāng)客戶端,一個(gè)充當(dāng)服務(wù)器端。客戶端的應(yīng)用程序總是向服務(wù)器提出服務(wù)請(qǐng)求,而服務(wù)器端的應(yīng)用程則根據(jù)客戶端的請(qǐng)求提供服務(wù)??梢哉f(shuō)客戶端是主動(dòng)方,服務(wù)器端是被動(dòng)方。(當(dāng)然也可以在一個(gè)應(yīng)用程序中既使用客戶控件,又使用服務(wù)器控件,這樣它即充當(dāng)客戶端又充當(dāng)服務(wù)器端。) 您可能聽(tīng)說(shuō)過(guò)(甚至用過(guò))國(guó)內(nèi)著名的木馬——冰河,它就是一個(gè)典型的客戶服務(wù)器軟件。該軟件其實(shí)是兩個(gè)程序(一個(gè)客戶端,一個(gè)服務(wù)器端),通過(guò)各種途徑讓服務(wù)器端在欲監(jiān)示的機(jī)器上運(yùn)行后,就可以在客戶端向服務(wù)器端程序發(fā)送指令,以達(dá)到操縱對(duì)方機(jī)器的目的。我最后將提供一個(gè)用易語(yǔ)言編寫(xiě)的簡(jiǎn)單的類似例程。 千萬(wàn)不要把客戶服務(wù)器軟件跟黑客、木馬直接聯(lián)系起來(lái),它還有很多“正道”上的用途。您在電視上見(jiàn)過(guò)某老總在辦公室里操縱家里的電腦嗎?他用的那個(gè)軟件就是客戶服務(wù)器軟件,這能叫木馬嗎?他的行動(dòng)是黑客行動(dòng)嗎?顯然不是的。(他用的軟件還說(shuō)不定就是某個(gè)著名的木馬,但這至少說(shuō)明木馬不一定完全是駭客們搞破壞的工具,也可以為民造福,關(guān)鍵看怎么用它——同樣是刀,兇手可以用來(lái)殺人,櫥師卻可以用來(lái)做菜,刀本身并沒(méi)有過(guò)錯(cuò)。) 一、客戶的重要屬性 客戶控件沒(méi)有重要屬性。 二、客戶的重要方法 ◆連接 功能:連接到指定主機(jī)上的指定端口。 語(yǔ)法:客戶名稱.連接(服務(wù)器地址,服務(wù)器端口號(hào)) 參數(shù):服務(wù)器地址——文本型,可以為主機(jī)名、IP地址;服務(wù)器端口號(hào)——整數(shù)型,即服務(wù)器控件的端口屬性指定的值。 應(yīng)用實(shí)例:1、客戶1.連接(110.0.0.1, 19730) //與IP地址為110.0.0.1的主機(jī)中的服務(wù)器控件進(jìn)行連接。該服務(wù)器控件的屬性必須是19730,且它所在的程序正在運(yùn)行,否則連接不可能成功。 注意:同一時(shí)刻,一個(gè)客戶控件只能連接一個(gè)服務(wù)器控件;一個(gè)服務(wù)器控件可以同時(shí)跟多個(gè)客戶控件連接。 ◆斷開(kāi)連接 功能:斷開(kāi)與服務(wù)器的連接。 語(yǔ)法:客戶名稱.斷開(kāi)連接() 應(yīng)用實(shí)例:1、客戶1.斷開(kāi)連接() ◆發(fā)送數(shù)據(jù) 功能:向已經(jīng)建立連接的服務(wù)器控件發(fā)送數(shù)據(jù)。 語(yǔ)法:客戶名稱.發(fā)送數(shù)據(jù)(數(shù)據(jù)) 參數(shù)可以是各種類型的數(shù)據(jù)。 應(yīng)用實(shí)例:1、客戶1.發(fā)送數(shù)據(jù)(0) 2、客戶1.發(fā)送數(shù)據(jù)(編輯框1.內(nèi)容) 3、客戶1.發(fā)送數(shù)據(jù)(圖片框1.圖片) //分別向服務(wù)器發(fā)送整數(shù)、文本、字節(jié)集數(shù)據(jù)。 [注:必須先跟服務(wù)器控件正確建立連接之后,才能發(fā)送數(shù)據(jù)。這就像和朋友打電話,您要先播號(hào),待朋友應(yīng)答后再講話——如果沒(méi)播號(hào),或那邊朋友還未拿起話筒,您就開(kāi)始講話,不是白講嗎?] ◆取回?cái)?shù)據(jù) 功能:取回服務(wù)器發(fā)送來(lái)的數(shù)據(jù)。 語(yǔ)法:客戶名稱.取回?cái)?shù)據(jù)() 本方法返回字節(jié)集型的數(shù)據(jù)。使用時(shí)有可能需要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換(用“從字節(jié)集轉(zhuǎn)換()”函數(shù)),這跟數(shù)據(jù)報(bào)控件的“取回?cái)?shù)據(jù)”方法是完全一致的。 三、客戶的重要事件 ◆數(shù)據(jù)到達(dá) 當(dāng)服務(wù)器端將數(shù)據(jù)發(fā)送過(guò)來(lái)后產(chǎn)生本事件。在本事件的處理子程序中調(diào)用“取回?cái)?shù)據(jù)()”方法即可取回本次所收到的數(shù)據(jù)。 ◆連接斷開(kāi) 當(dāng)連接被服務(wù)器端斷開(kāi)后會(huì)產(chǎn)生本事件。連接斷開(kāi)后,不能繼續(xù)發(fā)達(dá)數(shù)據(jù),除非重新建立連接。 〓★〓 客戶與服務(wù)器的交互: 1、首先由客戶控件建立與服務(wù)器控件的連接(通過(guò)調(diào)用“連接()”方法),這時(shí)服務(wù)器控件產(chǎn)生“客戶進(jìn)入”事件,并在該事件中獲得客戶的地址(通過(guò)調(diào)用“取回客戶()”方法)。此后雙方可以互相發(fā)送、接收數(shù)據(jù)。 2、客戶和服務(wù)器控件都可以在連接斷開(kāi)之前 的任何時(shí)間調(diào)用“發(fā)送數(shù)據(jù)()”方法向?qū)Ψ桨l(fā)送數(shù)據(jù),此時(shí)對(duì)方產(chǎn)生“數(shù)據(jù)到達(dá)”事件。在“數(shù)據(jù)到達(dá)”事件中調(diào)用“取回?cái)?shù)據(jù)()”方法即可取得對(duì)方發(fā)送來(lái)的數(shù)據(jù)。 3、客戶控件可調(diào)用“斷開(kāi)連接()”方法斷開(kāi)與服務(wù)器控件的連接,此時(shí)服務(wù)器控件產(chǎn)生“客戶離開(kāi)”事件;服務(wù)器控件可調(diào)用“斷開(kāi)客戶()”方法斷開(kāi)與客戶控件的連接,此時(shí)客戶控件產(chǎn)生“連接斷開(kāi)”事件。 一、服務(wù)器的重要屬性 ◆端口 整數(shù)型,指定監(jiān)聽(tīng)數(shù)據(jù)到達(dá)的端口號(hào),可以是大于 0 小于 32767 的任何自定數(shù)值。(應(yīng)盡量取大于1024的較大值。)其含義與數(shù)據(jù)報(bào)控件的同名屬性類似。 二、服務(wù)器的重要方法 ◆取回客戶 功能:取回與服務(wù)器連接的客戶地址。 語(yǔ)法:服務(wù)器名稱.取回客戶() 本方法返回一個(gè)文本型的值,其中記錄了客戶的地址(IP地址 + 端口)。當(dāng)服務(wù)器控件向客戶發(fā)送數(shù)據(jù)或斷開(kāi)客戶時(shí),都需要指定該地址。 應(yīng)用實(shí)例:1、客戶地址=服務(wù)器1.取回客戶 //取回客戶的地址,并保存到文本型變量“客戶地址”中。“客戶地址”要事先定義為全局變量或程序集變量,以供其它子程序使用。 [注:通常在服務(wù)器控件的“客戶進(jìn)入”或“客戶離開(kāi)”(特別是“客戶進(jìn)入”)事件的處理子程序中調(diào)用本方法。] ◆取回?cái)?shù)據(jù) 功能:取回客戶發(fā)送來(lái)的數(shù)據(jù)。 語(yǔ)法:服務(wù)器名稱.取回?cái)?shù)據(jù)() 返回值為字節(jié)集型。 ◆發(fā)送數(shù)據(jù) 功能:向指定客戶發(fā)送數(shù)據(jù)。 語(yǔ)法:服務(wù)器名稱.發(fā)送數(shù)據(jù)(接收客戶,數(shù)據(jù),[最長(zhǎng)等待時(shí)間]) 參數(shù):客戶地址——文本型,必須是調(diào)用“取回客戶”方法獲得的客戶地址。數(shù)據(jù)——可以是各種類型的數(shù)據(jù)。最長(zhǎng)等待時(shí)間——指定等待發(fā)送成功的最長(zhǎng)時(shí)間,單位為秒。如果省略本參數(shù),默認(rèn)為無(wú)限等待。 應(yīng)用實(shí)例:1、服務(wù)器1.發(fā)送數(shù)據(jù)(客戶地址,123,) //向發(fā)送整數(shù)型數(shù)據(jù)123。這里的“客戶地址”就是前面調(diào)用“取回客戶()”時(shí)的返回值。 ◆斷開(kāi)客戶 功能:與指定客戶斷開(kāi)連接。 語(yǔ)法:服務(wù)器名稱.斷開(kāi)客戶(欲斷開(kāi)客戶) 參數(shù)必須是調(diào)用“取回客戶()”方法所返回的客戶地址文本。 應(yīng)用實(shí)例:1、服務(wù)器1.斷開(kāi)客戶(客戶地址) //與“客戶地址”所指定的客戶斷開(kāi)連接。這里的“客戶地址”就是前面調(diào)用“取回客戶()”時(shí)的返回值。 三、服務(wù)器的重要事件 ◆數(shù)據(jù)到達(dá) 當(dāng)服務(wù)器端將數(shù)據(jù)發(fā)送過(guò)來(lái)后產(chǎn)生本事件。在本事件的處理子程序中調(diào)用“取回?cái)?shù)據(jù)()”方法即可取回本次所收到的數(shù)據(jù)。 ◆客戶進(jìn)入 當(dāng)有新客戶連接入本服務(wù)器控件后產(chǎn)生本事件。本事件的事件處理子程序的一個(gè)重要的任務(wù)就是:調(diào)用“取回客戶()”方法獲得新客戶的地址,并保存到文本型的全局變量或程序集變量中,供以后使用(服務(wù)器控件的方法“發(fā)送數(shù)據(jù)()”“斷開(kāi)客戶()”都需要指定客戶的地址)。 ◆客戶離開(kāi) 當(dāng)有已連接客戶斷開(kāi)與本服務(wù)器組件的連接后,會(huì)產(chǎn)生本事件。在本事件的處理子程序中調(diào)用“取回客戶”方法即可取回此客戶的地址(IP地址 + 端口)。 客戶與服務(wù)器的關(guān)系:一般情況下客戶是主動(dòng)者,是指令的發(fā)布者;服務(wù)器是被動(dòng)者,是指令的執(zhí)行者。仍以“木馬”為例來(lái)解說(shuō):服務(wù)器端潛伏于某機(jī)器中,隨時(shí)等待客戶端與它建立連接。一旦連接成功,則客戶端向服務(wù)器端發(fā)布指令(“發(fā)送數(shù)據(jù)”),服務(wù)器端接收到指令后執(zhí)行相關(guān)程序語(yǔ)句,然后將執(zhí)行結(jié)果發(fā)送到客戶端,這就完成了一個(gè)交互。 我給大家提供三個(gè)例程。第一個(gè)例程是一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)聊天程序(客戶服務(wù)器版),演示了客戶與服務(wù)器最基本的交互;第二個(gè)例程,是一個(gè)“木馬”的雛形,演示怎樣做木馬程序;第三個(gè)例程是“網(wǎng)絡(luò)朋友”——一個(gè)網(wǎng)絡(luò)交流程序,將例程二的客戶端、服務(wù)器端合二為一,程序即可以是客戶端也可以是服務(wù)器端(便于雙向交流),功能上綜合了前兩個(gè)例程的功能且又有所擴(kuò)展,能夠互相聊天、互相發(fā)送文件和圖片、能夠互相截取對(duì)方屏幕圖片,能夠在對(duì)方機(jī)器上彈出信息框(如:嚴(yán)重警告!你的機(jī)子已被我黑掉了!哈哈……),也能夠互相關(guān)閉或重啟對(duì)方機(jī)器。 |
|