最近遇到三个人问关于VB写网页服务器的问题,所以今天抽时间写一下,演示其实没有多复杂。

代码里自定义的方法只有四个,没有公共变量绕来绕去,该注释的也都注释了。

想扩展更复杂的功能,就需要自己补脑HTTP协议。

新建一个VB工程,界面及控件如下:

文本框控件名不变,两个按钮的Name分别是 启动服务 和 关闭服务。然后粘贴以下代码进去:

(↓↓↓点+展开代码~.~)

 Option Explicit
Private Const MAX_CLIENT = '最大连接数
'启动初始化和按钮代码
Private Sub Form_Load()
Dim i As Long
For i = To MAX_CLIENT
Load SCK(i) '预加载
Next i
End Sub
Private Sub 关闭服务_Click()
Dim i As Long
For i = To MAX_CLIENT
If SCK(i).State <> sckClosed Then SCK(i).Close
Next i
关闭服务.Enabled = False
End Sub
Private Sub 启动服务_Click()
On Error GoTo errline
SCK().LocalPort = '监听80端口,如果被占用,就改其他的,浏览器访问就需要127.0.0.1:8080的形式
SCK().Listen
启动服务.Enabled = False
关闭服务.Enabled = True
Exit Sub
errline:
Call ErrCatch
End Sub
'连接请求处理
Private Sub SCK_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim i As Long
For i = To MAX_CLIENT
'如果winsock不处于"正在连接"和"已连接状态",就使用
If SCK(i).State <> sckConnected And SCK(i).State <> sckConnecting Then
If SCK(i).State <> sckClosed Then SCK(i).Close
SCK(i).Accept requestID
End If
Next i
End Sub
Private Sub SCK_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Call ErrCatch
SCK(Index).Close
End Sub
Private Sub SCK_SendComplete(Index As Integer)
Showlog "发送完成!"
SCK(Index).Close
End Sub
'接收处理
Private Sub SCK_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim s As String
SCK(Index).GetData s
Dim urls() As String
Dim txt As String
urls = PickUrl(s)
If UBound(urls) = Then
txt = "欢迎访问,这是来自WebServer的内容!"
Else
Select Case urls()
Case "time": txt = "北京时间:" & Now
Case "ip": txt = "您的IP是:" & SCK(Index).RemoteHostIP
Case "test": txt = Replace(s, vbCrLf, "<BR />")
Case Else: txt = "欢迎访问,这是来自WebServer的内容!"
End Select
End If
SCK(Index).SendData Response(txt)
End Sub
'HTTP头响应头和内容的组装
Private Function Response(content As String) As String
Dim html As String
Dim b() As Byte
b = StrConv(content, vbFromUnicode)
html = html & "HTTP/1.1 200 OK" & vbCrLf
html = html & "Content-Type: text/html; charset=gb2312" & vbCrLf
html = html & "Connection: keep-alive" & vbCrLf
html = html & "Server: VB-WebServer" & vbCrLf
html = html & "Content-Length: " & (UBound(b) + ) & vbCrLf & vbCrLf
html = html & content & vbCrLf
Response = html
End Function
'提取请求URL的目录组成
Private Function PickUrl(request As String) As String()
Dim i As Long
Dim j As Long
Dim s As String
i = InStr(request, " ")
j = InStr(i + , request, " ")
s = Mid(request, i + , j - i - )
Showlog "收到:" & s
PickUrl = Split(s, "/")
End Function
'异常输出
Private Sub ErrCatch()
Showlog "异常" & Err.Number & "," & Err.Description
End Sub
'显示日志
Private Sub Showlog(msg As String)
Text1.Text = Text1.Text & msg & vbCrLf
Text1.SelStart = Len(Text1.Text)
End Sub

运行效果:

结束!

VB开发类似IIS简易的WebServer,代码不到100行的更多相关文章

  1. 100 行代码实现的 JavaScript MVC 样式框架

    介绍 使用过 JavaScript框架(如 AngularJS, Backbone 或者Ember)的人都很熟悉在UI(用户界面,前端)中mvc的工作机理.这些框架实现了MVC,使得在一个单页面中实现 ...

  2. GuiLite 1.2 发布(希望通过这100+行代码来揭示:GuiLite的初始化,界面元素Layout,及消息映射的过程)

    经过开发群的长期验证,我们发现:即使代码只有5千多行,也不意味着能够轻松弄懂代码意图.痛定思痛,我们发现:虽然每个函数都很简单(平均长度约为30行),可以逐个击破:但各个函数之间如何协作,却很难说明清 ...

  3. ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  4. JAVA开发类似冒险岛的游戏Part1

    JAVA开发类似冒险岛的游戏Part1 一.总结 二.JAVA开发类似冒险岛的游戏Part1 初学嘛) ,不过总的来说这个程序还是很有意思的.这里我重新再整理了一下,希望能帮助到其他想要开发类似程序的 ...

  5. iOS开发系列--Objective-C之协议、代码块、分类

    概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性.当然这些内容虽然和其他高级语言命名不一样,但 ...

  6. 做了一个简易的git 代码自动部署脚本

    做了一个简易的git 代码自动部署脚本 http://my.oschina.net/caomenglong/blog/472665 发表于2个月前(2015-06-30 21:08)   阅读(200 ...

  7. KoaHub平台基于Node.js开发的Koa 连接支付宝插件代码信息详情

    KoaHub平台基于Node.js开发的Koa 链接支付宝插件代码信息详情 easy-alipay alipay payment & notification APIs easy-alipay ...

  8. 用Java为Hyperledger Fabric(超级账本)开发区块链智能合约链代码之部署与运行示例代码

    部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...

  9. 游戏开发中IIS常见支持MIME类型文件解析

    游戏开发中IIS常见支持MIME类型文件解析 .apkapplication/vnd.android .ipaapplication/vnd.iphone .csbapplication/octet- ...

随机推荐

  1. 安装mysql和xampp遇到问题

    1.mysql的期望地址和配置的地址不一致: 解决方法:修改注册表 在附件命令提示符输入regedit 找[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Se ...

  2. Angular记录(1)

    文档资料 箭头函数--MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_fun ...

  3. expprt与环境变量

    一.Windows 环境变量 1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似 ...

  4. 第二节:比较DateTime和DateTimeOffset两种时间类型并介绍Quartz.Net中用到的几类时间形式(定点、四舍五入、倍数、递增)

    一. 时间的类型 1. 背景 这里为什么要介绍时间类型呢,明明是定时调度篇,原因是在定时任务中,任务什么时间开始执行,什么时间结束执行,要用到各种各样的时间模式,虽然这不能算是一个复杂的问题,但在正式 ...

  5. Python包中__init__.py作用

    在创建python包的过程中,IDE都会在包根目录下创建一个__init__.py文件,该Python文件默认是空的.目录结构如下: Pycharm下的package树结构: 在Finder中的目录结 ...

  6. python学习03

    字符串的基本使用 1.字符编码集 ASCII编码:外国人常用的大小写英文字母.数字和一些符号,一共127个字符,用1个字节(byte)可以涵盖完,也就是8个位,它将序列中的每个字节理解为一个字符. U ...

  7. JavaScript事件的属性列表

    HTML 4.0 的新特性之一是能够使 HTML 事件触发浏览器中的行为,比如当用户点击某个 HTML 元素时启动一段 JavaScript.下面是一个属性列表,可将之插入 HTML 标签以定义事件的 ...

  8. UE4渲染笔记

    Lightmass 实时渲染光影效果对性能有很大影响,可利用lightmass预先生成光影贴图,然后在游戏中使用. 将场景光照结果完全烘焙到模型贴图上,从而完完全全的假冒现实光照效果. 文档上是 li ...

  9. Leetcode#70. Climbing Stairs(爬楼梯)

    题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解 ...

  10. EasyUI datagrid 的多条件查询

    <script type="text/javascript">         $(function () {            $("#dg" ...