在中篇,我将演示比上篇稍微复杂点的功能.如HTTP监听和局域网广播.
有时,我们会有这样的需求:用户通过浏览器来访问获取数据,我们的程序需要监听指定端口,根据不同的请求返回不同数据给用户,当然,用户可能使用的是浏览器,我们先来看下面的代码:
Private WithEvents 监听 As New DSAPI.网络相关.HTTP监听
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
CheckForIllegalCrossThreadCalls = False
With 监听
.绑定端口 = 2000
.编码 = System.Text.Encoding.Default
.参数前导符 = ""
.传输使用Bas64加密 = False
.允许外网连接 = True
.启动监听()
End With
End Sub
使用WithEvents方式,将更方便使用其事件.
释义:
编码:指示返回给客户端时使用哪种字符编码
参数前导符:是否需要使用指定字串开头,比如
.参数前导符="cmd:"
当用户输入http://127.0.0.1:2000/cmd:help,时,程序将获取的"客户端.传入的Url"从前导符后面开始提取,即"help",如果指定了前导符,那么当用户的URL请求不是以前导符请求传入时,将触发服务端的"收到被阻止的客户端请求"事件.
传输使用Base64加密:指示输出到客户端页面的内容是否使用Base64加密,将启用此加密时,读取客户端输入流的也应使用Base64加密.
允许外网连接:指示本监听服务是否允许外网访问,如果为False,则外网所有请求都不进行处理,并触发"收到被阻止的客户端请求"事件.
编写一个监听服务端
Private Sub 监听_收到客户端请求(客户端 As DSAPI.网络相关.HTTP监听.监听客户端) Handles 监听.收到客户端请求
TextBox1.Text &= 客户端.传入的URL & vbCrLf
If 客户端.传入的URL = "help" Then
监听.写入信息到指定客户端输出流(客户端, "This is help")
End If
End Sub
运行以上代码时的效果图,左图为监听服务端,右侧为客户端浏览器.
![](https://i-blog.csdnimg.cn/blog_migrate/c307c8cf08eca234f12001d77b9c9eca.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2dd9479f50e106839faf8d405466cf85.png)
DSAPI.网络相关.HTTP监听支持以下事件:
监听已启动
监听已停止
收到被阻止的客户端请求(客户端 As DSAPI.网络相关.HTTP监听.监听客户端)
收到客户端请求(客户端 As DSAPI.网络相关.HTTP监听.监听客户端)
遇到错误(错误 As Exception)
传入的客户端
以上述http监听服务端中,当接收到客户请求时,会形成一个客户端信息,该信息会包含在“收到客户端请求事件里,客户端信息为简单的封装,包含如下内容:
传入的URL
当前会话上下文
端口
会话时间
浏览器信息
请求类型
输出流
输入流
当前会话上下文
端口
会话时间
浏览器信息
请求类型
输出流
输入流
局域网广播
直到写这个,我才看到里面的函数我没有改成中文,不过不影响使用。
发送局域网广播消息
DSAPI.网络相关.局域网广播.局域网广播_服务端.SendMessage(System.Text.Encoding.Default.GetBytes("Hello Everyone"))
发送不需要定义或声明发送者,但是接收广播消息需要有一个对象来实时接收,所以接收广播消息时:
Private WithEvents 客户端 As New DSAPI.网络相关.局域网广播.局域网广播_客户端
Private Sub 客户端_ReceivedMessage(Msg() As Byte) Handles 客户端.ReceivedMessage
Console.WriteLine(System.Text.Encoding.Default.GetString(Msg))
End Sub
当广播客户端接收到消息时,将触发”ReceivedMessage“事件。