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