明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

自己手工制作MUD客戶端服務程序

[摘要]隨著Internet的發(fā)展,越來越多的人加入到這個充滿無限生機的網絡世界中來,作為一個網絡信息時代的專業(yè)電腦玩家,掌握網絡編程就顯得格外重要。本文通過一個MUD客戶端服務程序向您介紹了Interne...
     隨著Internet的發(fā)展,越來越多的人加入到這個充滿無限生機的網絡世界中來,作為一個網絡信息時代的專業(yè)電腦玩家,掌握網絡編程就顯得格外重要。本文通過一個MUD客戶端服務程序向您介紹了Internet網絡編程及MUD的一些知識。
MUD,全稱Multiple User Dungeon,意為多用戶"地牢"游戲,現(xiàn)在網蟲們一般都把它叫做泥巴。如果你已經上了網的話,當你得知了一個MUD的地址和端口后你便可以加入此MUD了,在Windows95操作系統(tǒng)下,你可以用 "telnet地址 端口" 這條命令來登錄到MUD,但是Windows95的telnet程序由于不是專門用來玩MUD的,因此使用起來非常不方便,這主要是由于telnet不能處理文字的回繞,并且因為輸入輸出在同一窗口,造成輸入輸出信息混雜在一起,使用戶辨認困難。歷史輸入的不能重用,大大增加了用戶的輸入量。而且在MUD中服務器傳給你的信息中有很多控制信息用來使輸出文字改變顏色或突出顯示,這些信息被telnet簡單的忽略掉了,鑒于這些不便,有一些程序員開發(fā)了MUD客戶端服務程序,這些程序一般都具有這些功能:
* 連接到MUD --- 這是基本功能
* 命令行歷史 --- 可重用以前的命令
* 宏命令        --- 以宏代替較長的命令
* 輸入輸出窗口分開--- 避免輸入輸出信息混亂
* 輸出信息回卷 --- 允許查看以前的輸出信息
* 強調顯示 --- 能處理MUD系統(tǒng)傳來的控制序列
有一些還有更高級的功能:
* 自動登錄        --- 根據用戶歷史記錄,自動登錄到MUD
* 多重連接 --- 允許同時連接到多個MUD上,或同時在一個MUD上登錄多人
* 觸發(fā)裝置        --- 在某種情況下,自動發(fā)出某命令
* 自動導航系統(tǒng)    --- 通過記錄east,west,south,north,up,down等命令,生成邏輯地圖,并可自動導航用戶去某地
* 提供編程接口    --- 用戶可編程,制作機器人,代替用戶辛辛苦苦的在MUD上練功
Dos/Windows下的MUD客戶端服務程序主要有MUDCaller,BSXMUD等,其中以Zugg Software公司的ZMud較普及,也好用,下面我們用VB來做一個我們自己的MUD Client。
首先介紹一下Winsock控件。在VB中,利用 WinSock 控件可以與遠程計算機建立連接,并通過用戶TCP或UDP協(xié)議進行數(shù)據交換。這兩種協(xié)議都可以用來創(chuàng)建客戶與服務器應用程序。在創(chuàng)建MUD客戶端時,我們使用TCP協(xié)議。在給該控件的RemoteHost及RemotePort賦值后,調用其connect方法就可以連接到MUD主機上。然后用GetData和SendData就可以與MUD主機對話了。而從MUD主機傳來的數(shù)據是夾有escape控制字符串的ASCII文本,說到escape控制字符串,需要解釋一下, 所謂escape控制字符串是ANSI中用于鍵盤控制和顯示控制的以escape(ASCII 27/0x1B)和'['開頭的一串字符,在MUD中一般只涉及到設置輸出屬性,在escape和'['后跟a1;a2;...'m',該串以字符m結束,a1,a2等是數(shù)字,意義如下:
0:恢復黑白顯示;
1:高亮度顯示
2:正常顯示
30...37:黑,紅,綠,黃,藍,洋紅,青,白
如:chr(27)[1;31m表示從這里起用亮紅顯示,而chr(27)[2;37;0m表示恢復黑白顯示方式并用普通白色顯示。
現(xiàn)在我們打開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,用于接收用戶要聯(lián)往的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的緩沖區(qū)中取數(shù)據
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
好了,一個MUD客戶端服務程序就做好了,你現(xiàn)在已經可以用它連接到MUD了。不過限于篇幅,現(xiàn)在本程序的功能只有輸出信息回卷,分開輸入輸出和重用歷史命令,它已比telnet玩MUD好用了。另外,要支持強調顯示功能,只需從MUD主機傳來的信息串中識別出escape'['控制串,并用RichTextBox的SelColor方法就可以設置文本顏色,這也是我們一開始為什么用RichTextBox而不用一般的TextBox的原因。最后指出,WinSock的Connect連接是否正確應在MudSock的onError事件中編程,本程序略去。