|
|
NetBox 支持一个内建的 TcpServer 对象,可以方便的支持多用户网络应用,下面,我们使用 TcpServer 对象创建一个 Telnet 服务器,在 23 端口接受 telnet 请求,并将前面我们创建的命令行解释器移植到 Telnet 服务器中,以便通过远程访问命令行解释器。关于命令行解释器的建立可以参考创建一个命令行解释程序。
NetBox 提供了 TcpServer 对象用于创建高性能的网络服务器。TcpServer 是 HttpServer 的基础,创建方法也基本相同。不同的是 HttpServer 对象自身实现了连接响应部分,而 TcpServer 则需要自行编程实现连接的接受部分。下面的代码在 23 端口创建一个将连接响应指向 accept.wsc 的 TcpServer 实例,并启动服务器:
Set TcpServer = CreateObject("NetBox.TcpServer")
TcpServer.Create "", 23, "\Accept.wsc"
TcpServer.Start
这段代码创建了 TcpServer 对象,并没有实现连接接受的部分,只是告诉 TcpServer 连接响应由 accept.wsc 实现。下面我们将来实现这部分代码。
TcpServer 的连接响应由一个脚本部件实现,与普通的脚本部件并无不同,只是此脚本部件不需要在系统或者 NetBox 中进行注册,TcpServer 会自行装载。在脚本部件中,需要提供一个方法 OnAccept,其格式如下:
Function OnAccept(Socket, Contents)
...
End Function
当 TcpServer 接受到连接请求时,将自动加载此脚本部件,调用 OnAccept 方法,并传递接受的 Socket 请求及相关信息。下面就是一个完整的 TCP 连接响应脚本部件:
<?xml version="1.0"?>
<component>
<public>
<method name="OnAccept"/>
</public>
<script language="VBScript">
<![CDATA[
Function OnAccept(Socket, Contents)
Socket.Echo = true
Do While Not Socket.Eof
Socket.WriteLine Socket.ReadLine
Loop
End Function
]]>
</script>
</component>
这个脚本部件接受到 Socket 以后,先打开 Socket 对象的 Echo 属性,自动回送接受的字符。然后进入循环,逐行回显输入的信息。
下面,我们需要把前面的脚本部件和我们以前建立的命令行解释器合并在一起,合并的过程并不复杂,只需要将命令行解释器中使用的 Shell.Console 更改为 Socket 便可,具体代码如下:
<?xml version="1.0"?>
<component>
<public>
<method name="OnAccept"/>
</public>
<script language="VBScript">
<![CDATA[
Function OnAccept(Socket, Contents)
Socket.Echo = true
Set Console = Socket
Set SubArgs = CreateObject("NetBox.Arguments")
Do While True
Console.Write "#"
strCommand = Console.ReadLine
If LCase(strCommand) = "exit" Then Exit Do
SubArgs.CommandLine = strCommand
If SubArgs.Count > 0 Then
strExecFile = SubArgs(0)
If LCase(Right(strExecFile, 4)) <> ".box" Then
strExecFile = strExecFile + ".box"
End If
Set Script = CreateObject("NetBox.Script")
e = Script.Load(strExecFile)
If e = 0 Then
Script.AddNameItem "NetBox", NetBox
Script.AddNameItem "Console", Console
Script.AddNameItem "Arguments", SubArgs
e = Script.Run
End If
If e = 404 Then
Console.WriteLine "Bad Command"
ElseIf e <> 0 Then
Set error = Script.GetLastError
Console.WriteLine error.Category
Console.WriteLine "Error Number: " & Hex(error.Number)
Console.WriteLine "File: " & error.File
Console.WriteLine "Line: " & error.Line
Console.WriteLine error.Description & vbCRLF
Set error = Nothing
End If
Set Script = Nothing
End If
Loop
End Function
]]>
</script>
</component>
本文以一个完整的远程访问命令行解释器的实现,演示了 TcpServer,Socket 两个对象的使用。