窗口程序集名 | 保 留 | 保 留 | 备 注 |
WebSocket连接池 | | | |
变量名 | 类 型 | 数组 | 备 注 |
连接池 | 整数型 | 1000" ' 假设最大1000 |
空闲连接 | 整数型 | 0 |
活跃连接 | 整数型 | 0 |
锁 | 整数型 | |
服务器句柄 | 整数型 | |
端口 = 8888
启动服务器 (端口
)返回 (0
) 锁 =
创建进入许可证 () 服务器句柄 =
创建服务器 (端口
)如果 (服务器句柄 = 0
)输出调试文本 ("服务器启动失败!"
)返回 (假)否则
输出调试文本 ("服务器已启动,监听端口:" +
到文本 (端口
))
返回 (真)结束 如果
置服务器回调 (服务器句柄, &处理客户Duan连接
)返回 (真) 启动线程 (&处理WebSocket握手, 客户Duan句柄,
)|
处理WebSocket握手 | | |
|
客户Duan句柄 | 整数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 |
请求头 | 文本型 | | |
请求行 | 文本型 | | 0 |
i | 整数型 | | |
自定义头 | 文本型 | | 0 |
代理IP | 文本型 | | |
响应 | 文本型 | | |
请求头 =
接收数据 (客户Duan句柄, 1024
) 请求行 =
分割文本 (请求头,
#换行符, )
如果真 (取数组成员数 (请求行
) > 0
且 寻找文本 (请求行
[1
], "GET", ,
假) > 0
解析自定义请求头 (请求头, 自定义头
)

代理IP =
获取代理IP (请求头
)


响应 = "HTTP/1.1 101 Switching Protocols" +
#换行符 
响应 = 响应 + "Upgrade: websocket" +
#换行符 
响应 = 响应 + "Connection: Upgrade" +
#换行符 
响应 = 响应 + "Sec-WebSocket-Accept: " +
生成SecWebSocketAccept (请求头
) +
#换行符 +
#换行符 
发送数据 (客户Duan句柄, 响应
)
进入许可区 (锁
)

计次循环首 (取数组成员数 (连接池
), i


如果真 (连接池
[i
] = 0
)


连接池
[i
] = 客户Duan句柄


加入成员 (空闲连接, i
)

跳出循环 ()

计次循环尾 ()
退出许可区 (锁
)
处理WebSocket通信 (客户Duan句柄
)
关闭连接 (客户Duan句柄
)
变量名 | 类 型 | 静态 | 数组 | 备 注 |
行数组 | 文本型 | | 0 |
i | 整数型 | | |
行 | 文本型 | | |
分隔位置 | 整数型 | | |
行数组 =
分割文本 (请求头,
#换行符, )
计次循环首 (取数组成员数 (行数组
), i
)
行 = 行数组
[i
]

如果真 (寻找文本 (行, "Host:", ,
假) = 0
或 寻找文本 (行, "Upgrade:", ,
假) = 0
或 寻找文本 (行, "Connection:", ,
假) = 0
)
到循环尾 ()

如果真 (寻找文本 (行, "X-", ,
假) = 1
或 寻找文本 (行, "Custom-", ,
假) = 1
)
加入成员 (自定义头, 行
)
计次循环尾 ()变量名 | 类 型 | 静态 | 数组 | 备 注 |
行数组 | 文本型 | | 0 |
i | 整数型 | | |
代理IP | 文本型 | | |
行数组 =
分割文本 (请求头,
#换行符, )
计次循环首 (取数组成员数 (行数组
), i
)
如果真 (寻找文本 (行数组
[i
], "X-Forwarded-For:", ,
假) > 0
)

代理IP =
取文本右边 (行数组
[i
],
取文本长度 (行数组
[i
]) - 16
)

代理IP =
删首尾空 (代理IP
)
返回 (代理IP
)

如果真 (寻找文本 (行数组
[i
], "Proxy-IP:", ,
假) > 0
)

代理IP =
取文本右边 (行数组
[i
],
取文本长度 (行数组
[i
]) - 9
)

代理IP =
删首尾空 (代理IP
)
返回 (代理IP
)
计次循环尾 ()返回 (""
) |
处理WebSocket通信 | | |
|
客户Duan句柄 | 整数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 |
数据 | 文本型 | | |
解码数据 | 文本型 | | |
判断循环首 (真)
数据 =
接收数据 (客户Duan句柄, 8192
)

如果真 (数据 = ""
)
输出调试文本 ("客户Duan断开连接"
)
断开连接处理 (客户Duan句柄
)
跳出循环 ()

解码数据 =
WebSocket解码 (数据
)
处理客户Duan消息 (客户Duan句柄, 解码数据
)
判断循环尾 ()进入许可区 (锁
)
计次循环首 (取数组成员数 (连接池
), i
)
如果真 (连接池
[i
] = 客户Duan句柄
)

连接池
[i
] = 0





变量循环首 (1,
取数组成员数 (空闲连接
), 1, i
)


如果真 (空闲连接
[i
] = 客户Duan句柄
)


删除成员 (空闲连接, i, 1
)


跳出循环 ()


变量循环尾 ()



变量循环首 (1,
取数组成员数 (活跃连接
), 1, i
)


如果真 (活跃连接
[i
] = 客户Duan句柄
)


删除成员 (活跃连接, i, 1
)


跳出循环 ()


变量循环尾 ()


跳出循环 ()
计次循环尾 ()退出许可区 (锁
)关闭连接 (客户Duan句柄
)|
处理客户Duan消息 | | |
|
客户Duan句柄 | 整数型 | | | |
消息 | 文本型 | | | |
输出调试文本 ("收到客户Duan消息:" + 消息
) 发送WebSocket消息 (客户Duan句柄, "服务器已收到你的消息:" + 消息
)|
发送WebSocket消息 | 逻辑型 | |
|
客户Duan句柄 | 整数型 | | | |
消息 | 文本型 | | | |
帧数据 =
WebSocket编码 (消息
)返回 (发送数据 (客户Duan句柄, 帧数据
))
返回 (消息
) 返回 (数据
)|
生成SecWebSocketAccept | 文本型 | |
|
请求头 | 文本型 | | | |
返回 "base64编码的密钥"
进入许可区 (锁
)
如果 (取数组成员数 (空闲连接
) > 0
)
连接句柄 = 空闲连接
[1
]
删除成员 (空闲连接, 1, 1
)
加入成员 (活跃连接, 连接句柄
)否则

连接句柄 = 0
退出许可区 (锁
)返回 (连接句柄
)进入许可区 (锁
)
变量循环首 (1,
取数组成员数 (活跃连接
), 1, i
)
如果真 (活跃连接
[i
] = 客户Duan句柄
)
删除成员 (活跃连接, i, 1
)
加入成员 (空闲连接, 客户Duan句柄
)
跳出循环 ()
变量循环尾 ()退出许可区 (锁
)