如何做好一名下属:易语言“数据报、客户、服务器 ”

来源:百度文库 编辑:中财网 时间:2024/04/27 01:08:46
易语言“数据报、客户、服务器 ”
━━━━━━━━━━━━━━━━━━━━━━━━━━

这是三个典型的网络控件,写网络程序少不了它们。

通过网络交互数据,首先要明白“连接”和“无连接”的概念。最简单的例子莫过于打电话和写信。两个人如果要通电话,得首先建立连接——即拨号,等待对方应答后才能相互传递信息,最后还要释放连接——即挂电话。写信就没有那么复杂了,地址姓名填好以后直接往邮筒一扔,收信人就能收到。用数据报控件进行数据交互,类似于写信,是基于“无连接”的;用客户、服务器进行数据交互,类似于打电话,是基于“连接”的。

根据提供服务类型的不同,端口分为两种,一种是TCP端口,一种是UDP端口。计算机之间相互通信的时候,分为两种方式:一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议(我们熟悉的OICQ就是采用这种协议);一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议。(这两种交互方式分别类似于生活中的写信和打电话。)在易语言中,用数据报控件封装了UDP协议,用客户控件和服务器控件封装了TCP协议。

Ⅰ- 数据报
------------------------

数据报是一种不可靠、小数据量的网络数据交互方式。如果传递的数据量过大,有可能会失败,最好不要超过 127 字节。如需要大数据量或者可靠数据传送方式,请使用基于连接的其它网络组件(如客户、服务器)。

虽然数据报控件传递的数据量小,又不够可靠,但它简单易用,在对数据量、可靠性没有特别要求的情况下,还是有它充分发挥作用的领域。最后我将用该控件做一个网络聊天程序(数据报版),作为例程。

数据报的重要属性有:端口。

数据报的重要方法有:发送数据()、取回数据()。

数据报的重要事件有:数据到达。

一、数据报的重要属性

◆端口

端口属性是一个整数型的值,默认值是19730。如果要改动,尽量取大于1024的较大值。

端口是很重要的概念。首先需要明白的一点是,我们这里所说的端口,不是计算机硬件的I/O端口,而是软件概念上的端口。

服务器可以向外提供多种服务,比如,一台服务器可以同时是WEB服务器,也可以是FTP服务器,同时,它也可以是邮件服务器。为什么一台服务器可以同时提供那么多的服务呢?其中一个很主要的方面,就是各种服务采用不同的“端口”来分别提供不同的服务,比如:HTTP(超文本传送)采用80端口,FTP(文件传输)采用21端口,Telnet(远程登陆)采用23端口,POP3(邮件接收)采用110端口,SMTP(简单邮件传送)采用25端口,DNS(域名解析服务)采用53端口等。这样,通过不同端口,计算机与外界进行互不干扰的通信。可以这样说:端口是计算机与外部通信的途径,没有它,计算机便又聋又哑。

如果把计算机比成一个餐厅的话,那端口就是一个个卖饭的窗口。我们都知道餐厅里的窗口大都有详细的分工,要买馒头跑到卖鸡蛋汤的窗口前肯定是买不到的。如果要想和在餐厅工作的MM见见面,说说话,要通过哪个窗口呢?卖汤、卖菜、卖馍的窗口显然是不现实的。好在计算机这个“大”的餐厅有非常多的窗口,并且绝大多数都不常用,只要随便找一个(当然要避免卖汤、卖菜、卖馍的窗口)就可以和MM交流了。

计算机中总共有256×256即65536个端口(编号从0到65535),其中前1024个端口都有确切的定义,它们对应着因特网上常见的一些服务。1024号以后的端口是为应用程序保留的,可以随意选用(易语言中限32767以下)。这也提醒我们,在为数据报控件(包括以后的客户、服务器控件)指定端口属性时,尽量取较大的数值,以免冲突。[注:其实端口也不是特别的重要,只要能保证发送数据一方和接收数据一方都知道对方的端口即可。这就象餐厅外的GG和餐厅内的MM见面,通过哪一个窗口见面并不重要,重要的是他们去了同一个窗口。]

二、数据报的重要方法

◆发送数据

功能:发送数据到指定主机上的指定端口。

语法:数据报名称.发送数据([接收主机地址],接收主机端口号,欲发送数据)

参数:接收主机地址——文本型,可以为主机名、IP地址等。如果省略本参数或者提供空文本,则在指定端口广播欲发送数据。接收主机端口号——整数型,必须是对方(接收主机)数据报控件的端口属性指定的数值。欲发送数据——欲发送的数据,可以是文本型、整数型、小数型、逻辑型、日期时间型等(数据类型不限)。

返回值:逻辑型。如果数据发送成功,返回真;如果发送失败,返回假。

应用实例:1、数据报1.发送数据( 127.0.0.1,19730,123)

2、数据报1.发送数据(“liigo”,19730,“易语言”)

//实例1:向IP地址为127.0.0.1的主机19730端口发送整数型数据123;

//实例2:向主机名为“liigo”的主机19730端口发送文本数据“易语言”;

//通过语法介绍和应用实例,我们看到,要向对方发送数据,需要指定对方的主机地址和端口号。这有点类似写信要指定收信人地址和收信人姓名(如果不写或写错是邮不到的)。也许您仍然要问,数据究竟发送给谁了呢?答:发送给了另一个程序中的另一个数据报控件,这个程序必须是运行在指定主机上(IP地址为127.0.0.1,或主机名为“liigo”),这个数据报控件的端口属性必须是指定值(19730)。如果没有满足条件的接收对象,自然就不会有谁收到数据——这跟写信也很类似。

[注意:本方法的逻辑型返回值只是标志“发送”数据的成功与否,与数据能不能成功“到达”没有任何关系。事实上,数据报控件只管发送数据,而对数据是否到达毫不过问。这就是前面说的它的“不可靠性”。]

◆取回数据

功能:取回数据报控件所接收到的数据。

语法:数据报名称.取回数据()

返回值:字节集型。注意是字节集型,使用时经常需要进行数据类型转换。

应用实例:1、x=数据报1.取回数据() //取回数据并存入字节集型变量x中

编辑框1.内容=从字节集转换(x,#文本型) //显示到编辑框1中

//“从字节集转换(x,#文本型)”表示将字节集型变量x转换成文本型(第二个参数“#文本型”指定目标数据类型,“#文本型”是易语言系统定义的常量)。

//[注:您可能非常熟悉“到文本()”函数了,但它只能将整数型、逻辑型、日期时间型转换成文本型,并不能转换字节集型。字节集是比较特殊的数据类型,易语言专门提供了针对它的类型转换函数“从字节集转换()”和“转换为字节集()”。]

//上述实例也可合写到一行中:“编辑框1.内容=从字节集转换(数据报1.取回数据(),#文本型)”。

//注意“取回数据”方法只能在数据报控件的“数据到达”事件的处理子程序中调用。在其它地方即使调用了也取不到正确的数据。

[补充:您可能正在感到奇怪,为什么非要返回字节集型的值呢,使用时还要多一步转换,直接返回文本型多好!答:因为在所有数据类型中,只有字节集型最具有通用性。比如要传递的是一张图片数据,除字节集外,其它数据类型都不合适。]

三、数据报的重要事件

◆数据到达

事件的产生时机:当有数据到达时自动产生此事件。

在本事件的处理子程序中,一个最重要的任务就是取回“到达的数据”——通过“取回数据()”方法。还得再提醒您一次,“取回数据()”返回的是字节集型的数据,通常需要用数据类型转换函数“从字节集转换()”将字节集数据转换为其它数据类型(最常用的数据类型无疑是文本型)。

我写了一个使用数据报控件进行网络聊天的程序。在已经连网的任意两台机器上分别运行该程序,指定对方机器的IP地址或主机名之后,就能互相对话了。(如果在单机上测试,则自己发的信息自己收到。)

Ⅱ- 客户、服务器
--------------------------------------

客户控件和服务器控件是一对好搭挡。它们总是成对使用,分处于两个独立的应用程序中,一个充当客户端,一个充当服务器端。客户端的应用程序总是向服务器提出服务请求,而服务器端的应用程则根据客户端的请求提供服务。可以说客户端是主动方,服务器端是被动方。(当然也可以在一个应用程序中既使用客户控件,又使用服务器控件,这样它即充当客户端又充当服务器端。)

您可能听说过(甚至用过)国内著名的木马——冰河,它就是一个典型的客户服务器软件。该软件其实是两个程序(一个客户端,一个服务器端),通过各种途径让服务器端在欲监示的机器上运行后,就可以在客户端向服务器端程序发送指令,以达到操纵对方机器的目的。我最后将提供一个用易语言编写的简单的类似例程。

千万不要把客户服务器软件跟黑客、木马直接联系起来,它还有很多“正道”上的用途。您在电视上见过某老总在办公室里操纵家里的电脑吗?他用的那个软件就是客户服务器软件,这能叫木马吗?他的行动是黑客行动吗?显然不是的。(他用的软件还说不定就是某个著名的木马,但这至少说明木马不一定完全是骇客们搞破坏的工具,也可以为民造福,关键看怎么用它——同样是刀,凶手可以用来杀人,橱师却可以用来做菜,刀本身并没有过错。)

一、客户的重要属性

客户控件没有重要属性。

二、客户的重要方法

◆连接

功能:连接到指定主机上的指定端口。

语法:客户名称.连接(服务器地址,服务器端口号)

参数:服务器地址——文本型,可以为主机名、IP地址;服务器端口号——整数型,即服务器控件的端口属性指定的值。

应用实例:1、客户1.连接(110.0.0.1, 19730) //与IP地址为110.0.0.1的主机中的服务器控件进行连接。该服务器控件的属性必须是19730,且它所在的程序正在运行,否则连接不可能成功。

注意:同一时刻,一个客户控件只能连接一个服务器控件;一个服务器控件可以同时跟多个客户控件连接。

◆断开连接

功能:断开与服务器的连接。

语法:客户名称.断开连接()

应用实例:1、客户1.断开连接()

◆发送数据

功能:向已经建立连接的服务器控件发送数据。

语法:客户名称.发送数据(数据)

参数可以是各种类型的数据。

应用实例:1、客户1.发送数据(0) 2、客户1.发送数据(编辑框1.内容) 3、客户1.发送数据(图片框1.图片) //分别向服务器发送整数、文本、字节集数据。

[注:必须先跟服务器控件正确建立连接之后,才能发送数据。这就像和朋友打电话,您要先播号,待朋友应答后再讲话——如果没播号,或那边朋友还未拿起话筒,您就开始讲话,不是白讲吗?]

◆取回数据

功能:取回服务器发送来的数据。

语法:客户名称.取回数据()

本方法返回字节集型的数据。使用时有可能需要进行数据类型转换(用“从字节集转换()”函数),这跟数据报控件的“取回数据”方法是完全一致的。

三、客户的重要事件

◆数据到达

当服务器端将数据发送过来后产生本事件。在本事件的处理子程序中调用“取回数据()”方法即可取回本次所收到的数据。

◆连接断开

当连接被服务器端断开后会产生本事件。连接断开后,不能继续发达数据,除非重新建立连接。

〓★〓 客户与服务器的交互:

1、首先由客户控件建立与服务器控件的连接(通过调用“连接()”方法),这时服务器控件产生“客户进入”事件,并在该事件中获得客户的地址(通过调用“取回客户()”方法)。此后双方可以互相发送、接收数据。

2、客户和服务器控件都可以在连接断开之前 的任何时间调用“发送数据()”方法向对方发送数据,此时对方产生“数据到达”事件。在“数据到达”事件中调用“取回数据()”方法即可取得对方发送来的数据。

3、客户控件可调用“断开连接()”方法断开与服务器控件的连接,此时服务器控件产生“客户离开”事件;服务器控件可调用“断开客户()”方法断开与客户控件的连接,此时客户控件产生“连接断开”事件。

一、服务器的重要属性

◆端口

整数型,指定监听数据到达的端口号,可以是大于 0 小于 32767 的任何自定数值。(应尽量取大于1024的较大值。)其含义与数据报控件的同名属性类似。

二、服务器的重要方法

◆取回客户

功能:取回与服务器连接的客户地址。

语法:服务器名称.取回客户()

本方法返回一个文本型的值,其中记录了客户的地址(IP地址 + 端口)。当服务器控件向客户发送数据或断开客户时,都需要指定该地址。

应用实例:1、客户地址=服务器1.取回客户 //取回客户的地址,并保存到文本型变量“客户地址”中。“客户地址”要事先定义为全局变量或程序集变量,以供其它子程序使用。

[注:通常在服务器控件的“客户进入”或“客户离开”(特别是“客户进入”)事件的处理子程序中调用本方法。]

◆取回数据

功能:取回客户发送来的数据。

语法:服务器名称.取回数据()

返回值为字节集型。

◆发送数据

功能:向指定客户发送数据。

语法:服务器名称.发送数据(接收客户,数据,[最长等待时间])

参数:客户地址——文本型,必须是调用“取回客户”方法获得的客户地址。数据——可以是各种类型的数据。最长等待时间——指定等待发送成功的最长时间,单位为秒。如果省略本参数,默认为无限等待。

应用实例:1、服务器1.发送数据(客户地址,123,) //向发送整数型数据123。这里的“客户地址”就是前面调用“取回客户()”时的返回值。

◆断开客户

功能:与指定客户断开连接。

语法:服务器名称.断开客户(欲断开客户)

参数必须是调用“取回客户()”方法所返回的客户地址文本。

应用实例:1、服务器1.断开客户(客户地址) //与“客户地址”所指定的客户断开连接。这里的“客户地址”就是前面调用“取回客户()”时的返回值。

三、服务器的重要事件

◆数据到达

当服务器端将数据发送过来后产生本事件。在本事件的处理子程序中调用“取回数据()”方法即可取回本次所收到的数据。

◆客户进入

当有新客户连接入本服务器控件后产生本事件。本事件的事件处理子程序的一个重要的任务就是:调用“取回客户()”方法获得新客户的地址,并保存到文本型的全局变量或程序集变量中,供以后使用(服务器控件的方法“发送数据()”“断开客户()”都需要指定客户的地址)。

◆客户离开

当有已连接客户断开与本服务器组件的连接后,会产生本事件。在本事件的处理子程序中调用“取回客户”方法即可取回此客户的地址(IP地址 + 端口)。

客户与服务器的关系:一般情况下客户是主动者,是指令的发布者;服务器是被动者,是指令的执行者。仍以“木马”为例来解说:服务器端潜伏于某机器中,随时等待客户端与它建立连接。一旦连接成功,则客户端向服务器端发布指令(“发送数据”),服务器端接收到指令后执行相关程序语句,然后将执行结果发送到客户端,这就完成了一个交互。

我给大家提供三个例程。第一个例程是一个简单的网络聊天程序(客户服务器版),演示了客户与服务器最基本的交互;第二个例程,是一个“木马”的雏形,演示怎样做木马程序;第三个例程是“网络朋友”——一个网络交流程序,将例程二的客户端、服务器端合二为一,程序即可以是客户端也可以是服务器端(便于双向交流),功能上综合了前两个例程的功能且又有所扩展,能够互相聊天、互相发送文件和图片、能够互相截取对方屏幕图片,能够在对方机器上弹出信息框(如:严重警告!你的机子已被我黑掉了!哈哈……),也能够互相关闭或重启对方机器。