NetBox 2.7 使用手册 |
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 两个对象的使用。