随着internet的发展,越来越多的人加入到这个充满无限生机的网络世界中来,作为一个网络信息时代的专业电脑玩家,掌握网络编程就显得格外重要。本文通过一个mud客户端服务程序向您介绍了internet网络编程及mud的一些知识。
mud,全称multiple user dungeon,意为多用户"地牢"游戏,现在网虫们一般都把它叫做泥巴。如果你已经上了网的话,当你得知了一个mud的地址和端口后你便可以加入此mud了,在windows95操作系统下,你可以用 "telnet地址 端口" 这条命令来登录到mud,但是windows95的telnet程序由于不是专门用来玩mud的,因此使用起来非常不方便,这主要是由于telnet不能处理文字的回绕,并且因为输入输出在同一窗口,造成输入输出信息混杂在一起,使用户辨认困难。历史输入的不能重用,大大增加了用户的输入量。而且在mud中服务器传给你的信息中有很多控制信息用来使输出文字改变颜色或突出显示,这些信息被telnet简单的忽略掉了,鉴于这些不便,有一些程序员开发了mud客户端服务程序,这些程序一般都具有这些功能:
* 连接到mud --- 这是基本功能
* 命令行历史 --- 可重用以前的命令
* 宏命令 --- 以宏代替较长的命令
* 输入输出窗口分开--- 避免输入输出信息混乱
* 输出信息回卷 --- 允许查看以前的输出信息
* 强调显示 --- 能处理mud系统传来的控制序列
有一些还有更高级的功能:
* 自动登录 --- 根据用户历史记录,自动登录到mud
* 多重连接 --- 允许同时连接到多个mud上,或同时在一个mud上登录多人
* 触发装置 --- 在某种情况下,自动发出某命令
* 自动导航系统 --- 通过记录east,west,south,north,up,down等命令,生成逻辑地图,并可自动导航用户去某地
* 提供编程接口 --- 用户可编程,制作机器人,代替用户辛辛苦苦的在mud上练功
dos/windows下的mud客户端服务程序主要有mudcaller,bsxmud等,其中以zugg software公司的zmud较普及,也好用,下面我们用vb来做一个我们自己的mud client。
首先介绍一下winsock控件。在vb中,利用 winsock 控件可以与远程计算机建立连接,并通过用户tcp或udp协议进行数据交换。这两种协议都可以用来创建客户与服务器应用程序。在创建mud客户端时,我们使用tcp协议。在给该控件的remotehost及remoteport赋值后,调用其connect方法就可以连接到mud主机上。然后用getdata和senddata就可以与mud主机对话了。而从mud主机传来的数据是夹有escape控制字符串的ascii文本,说到escape控制字符串,需要解释一下, 所谓escape控制字符串是ansi中用于键盘控制和显示控制的以escape(ascii 27/0x1b)和'['开头的一串字符,在mud中一般只涉及到设置输出属性,在escape和'['后跟a1;a2;...'m',该串以字符m结束,a1,a2等是数字,意义如下:
0:恢复黑白显示;
1:高亮度显示
2:正常显示
30...37:黑,红,绿,黄,蓝,洋红,青,白
如:chr(27)[1;31m表示从这里起用亮红显示,而chr(27)[2;37;0m表示恢复黑白显示方式并用普通白色显示。
现在我们打开vb,新建一个标准工程,选工程|部件菜单,加入microsoft winsock control 5.0及microsoft rich textbox control 5.0这两个控件到工具栏中。
将form1改名为fmud,从工具栏拖一个commandbutton到fmud上,改名叫cmdsend,设置其default属性为true。拖一个rich textbox到fmud上,改名叫mudout,设置其text属性为空,scrollbars为rtfboth。再拖一个combobox到fmud上,改名叫mudin,设置text属性为空。最后拖一个winsock控件到fmud上,改名叫mudsock。.下一步是用菜单编辑器给fmud做一个菜单,其中有一个子菜单起名叫connect,主窗口就做好了。
下面向工程里添加一个新form,改名叫fconnect,用于接收用户要联往的mud主机地址及端口。首先在上面放两个label,分别把caption设为"mud地址:" 和 "端口:",再放两个textbox分别起名叫taddress和tport,摆好位置,使两个label分别指向两个textbox,最后放一个commandbutton,使其name=cmdconnect,caption="&connect",default=true,enabled=false。好了,下面开始编程:
fmud窗口:
fmud的定义部分:
dim bconnected as boolean
connect菜单:
if not bconnected then
fconnect.show 1
mudsock.connect '连接到mud主机上
bconnected = true
mudin.setfocus
end if
fmud的load事件:
bconnected = false
fmud的resize事件:
mudout.top = 0 '调整控件的位置就大小
mudout.left = 0
mudout.width = fmud.width - 120
mudout.height = fmud.height - 700
mudin.top = mudout.height+20
mudin.left = 0
mudout.width = fmud.width - 120
mudsock的dataarrival事件:
dim strdata as string
if connected then
mudsock.getdata strdata '从mudsock的缓冲区中取数据
mudout.text = mudout.text+strdata
mudout.selstart = len (mudout.text)
if len(mudout.text) > 2000 then '缓冲2000字的文本
mudout.text = right (mudout.text,2000)
end if
ene if
cmdsend的click事件:
dim s as string
dim i as integer
s = mudin.text + chr(13) & chr(10) '给命令行加上回车换行
fmud.mudsock.senddata s
for i = 1 to mudin.listcount
if mudin.list(i) = mudin.text then
mudin.removeitem (i) '删去重复的历史命令
end if
next i
if mudin.listcount > 30 then '缓冲30条历史命令
mudin.removeitem 0
end if
mudin.additem mudin.text '将本条命令加到历史记录最后
mudin.selstart = 0
mudin.sellength = len(mudin.text) '本条命令文本被选择,以便下
'输入一条命令时,不用擦除便可直接键入
fconnect窗口:
taddress和fport的change事件:
if (taddress.text <> "") and (tport.text <> "") then
cmdconnect.enabled = true
else
cmdconnect.enabled = false
end if
connect按钮的click事件:
fmud.mudsock.remotehost = taddress.text
fmud.mudsock.remoteport = cint(tport.text)
fconnect.hide