易语言网络编程基础:构建网络版应用 💻
1.9.1 学习目标 🎯
作为本地应用到网络应用的关键升级章节,本节将解决前序系统“仅能本地使用、无法远程协作”的痛点,你将达成以下目标:
- 用**「快递收发系统」生活化类比**彻底理解网络通信核心概念(TCP/UDP协议、服务器/客户端、端口/IP);
- 熟练掌握易语言内置网络支持库的配置与使用,无需额外依赖;
- 精通TCP服务器/客户端的全流程开发:服务端启动→监听端口→接收连接→收发数据;客户端连接→发送请求→接收响应;
- 将1.8的「精美版班级成绩管理系统」升级为**「网络版班级成绩管理系统」**——支持多客户端远程查询成绩、服务器统一管理数据库、实时数据同步;
- 排查「端口被占用」「防火墙拦截」「数据收发不完整」「连接超时」等入门阶段网络编程高频错误。
1.9.2 核心概念:用「快递收发」类比网络通信 💡
网络通信的本质是两台计算机之间的“数据快递”传输,用大家熟悉的「快递收发」类比:
| 网络通信概念 | 生活化类比 | 易语言落地形式 |
|---|---|---|
| IP地址 | 收件人/寄件人地址 | 计算机在网络中的唯一标识(如192.168.1.100) |
| 端口号 | 快递柜编号 | 计算机上用于区分不同服务的唯一编号(1-65535,推荐用1024以上) |
| TCP协议 | 顺丰快递(可靠、有确认、丢件重发) | 易语言网络支持库的TCP类,适合需要数据完整性的场景 |
| UDP协议 | 平邮(不可靠、无确认、速度快) | 易语言网络支持库的UDP类,适合实时性要求高的场景 |
| 服务器(Server) | 快递站(固定地址、长期在线、接收请求) | 易语言网络服务组件,监听端口、处理客户端请求 |
| 客户端(Client) | 寄件人/收件人(动态连接、发起请求) | 易语言网络客户端组件,连接服务器、发送/接收数据 |
| 数据帧 | 快递包裹(包含收件人、寄件人、货物) | 易语言中用「字节集」表示的传输数据 |
💡 易语言入门福利:内置**internet网络支持库**,无需学习复杂的Socket编程,仅需配置组件和事件即可实现网络通信!
1.9.3 环境准备:网络支持库配置 🔧
打开易语言IDE→「工具」→「支持库配置」→勾选**「网络支持库 (internet)」和「扩展界面支持库一 (iext)」**(用于数据展示),点击「确定」。
核心网络组件介绍
| 组件名称 | 组件功能 | 应用场景 |
|---|---|---|
网络服务 | 作为TCP服务器,监听端口、接收连接 | 成绩管理系统的服务器端 |
网络客户端 | 作为TCP客户端,连接服务器、收发数据 | 成绩管理系统的客户端 |
TCP客户 | 轻量TCP客户端组件(兼容旧版本) | 简单客户端场景 |
1.9.4 核心语法:TCP服务器/客户端开发详解 📋
易语言网络编程采用事件驱动模式——当发生特定网络事件(如客户端连接、数据到达)时,自动触发对应子程序,无需轮询等待。
(1)TCP服务器端开发步骤
① 创建网络服务组件:从组件箱拖入「网络服务」组件到窗口;
② 设置监听端口:属性面板中设置「端口」为8888(可自定义,避免1024以下系统端口);
③ 启动监听:调用网络服务1.启动 ()启动服务器;
④ 处理网络事件:
_网络服务_客户进入:客户端连接时触发,获取客户端编号;_网络服务_客户离开:客户端断开时触发,清理资源;_网络服务_数据到达:客户端发送数据时触发,接收并处理数据;
⑤ 发送响应数据:调用网络服务1.发送数据 (客户编号, 数据字节集)发送响应。
代码示例:
.版本 2
.支持库 internet
.程序集 窗口程序集_服务器
.局部变量 数据库路径, 文本型 = 取运行目录 () + “\班级成绩.mdb”
.局部变量 数据库句柄, 整数型
' ---------------------- 启动服务器 ----------------------
.子程序 _btn_启动服务_被单击
.如果真 (网络服务1.启动 () = 真)
lbl_服务状态.标题 = “服务已启动,监听端口:8888”
btn_启动服务.禁止 = 真
btn_停止服务.禁止 = 假
.如果真结束
' ---------------------- 停止服务器 ----------------------
.子程序 _btn_停止服务_被单击
网络服务1.停止 ()
lbl_服务状态.标题 = “服务已停止”
btn_启动服务.禁止 = 假
btn_停止服务.禁止 = 真
' ---------------------- 处理客户端连接 ----------------------
.子程序 _网络服务1_客户进入, , , 客户编号:自动分配的唯一客户端标识
.参数 客户编号, 整数型
信息框 (“客户端” + 到文本 (客户编号) + “已连接!”, 0, “客户端通知”)
' ---------------------- 处理客户端数据 ----------------------
.子程序 _网络服务1_数据到达, , , 客户编号:发送数据的客户端标识;数据:客户端发送的字节集
.参数 客户编号, 整数型
.参数 数据, 字节集
.局部变量 请求文本, 文本型
.局部变量 响应文本, 文本型
.局部变量 SQL语句, 文本型
请求文本 = 到文本 (数据) ; 将字节集转换为可阅读的文本
' 解析请求:请求格式为“查询|科目|条件”(如“查询|数学|>=90”)
.如果真 (取文本左边 (请求文本, 2) = “查询”)
' 拆分请求参数
局部变量 拆分数组, 文本型, , “0”
分割文本 (请求文本, “|”, 拆分数组)
.如果真 (取数组成员数 (拆分数组) ≠ 3)
响应文本 = “请求格式错误!”
网络服务1.发送数据 (客户编号, 到字节集 (响应文本))
返回 ()
.如果真结束
' 查询数据库
SQL语句 = “SELECT 学生编号,语文,数学,英语,物理,化学, (语文+数学+英语+物理+化学) AS 总分 FROM 成绩表 WHERE ” + 拆分数组[2] + 拆分数组[3] + “ ORDER BY 总分 DESC”
数据库句柄 = 打开数据库 (数据库路径, “”, “”, “Access”, )
执行SQL语句 (SQL语句)
' 构建响应文本
响应文本 = “学生编号|语文|数学|英语|物理|化学|总分” + #换行符
.循环判断首 ()
响应文本 = 响应文本 + 取记录集字段值 (“学生编号”) + “|” + 取记录集字段值 (“语文”) + “|” + 取记录集字段值 (“数学”) + “|” + 取记录集字段值 (“英语”) + “|” + 取记录集字段值 (“物理”) + “|” + 取记录集字段值 (“化学”) + “|” + 取记录集字段值 (“总分”) + #换行符
.循环判断尾 (转到下一条记录 () ≠ 真)
关闭数据库 ()
' 发送响应数据到客户端
网络服务1.发送数据 (客户编号, 到字节集 (响应文本))
.如果真结束
⌨️
(2)TCP客户端开发步骤
① 创建网络客户端组件:从组件箱拖入「网络客户端」组件到窗口;
② 连接服务器:调用网络客户端1.连接 (“服务器IP”, 端口)连接服务器(本地测试用127.0.0.1);
③ 处理网络事件:
_网络客户端_连接成功:与服务器连接成功时触发;_网络客户端_连接失败:连接服务器失败时触发,返回错误码;_网络客户端_数据到达:接收到服务器响应时触发,处理数据;
④ 发送请求数据:调用网络客户端1.发送数据 (请求字节集)发送请求。
代码示例:
.版本 2
.支持库 internet
.支持库 iext
.程序集 窗口程序集_客户端
' ---------------------- 连接服务器 ----------------------
.子程序 _btn_连接服务器_被单击
.局部变量 服务器IP, 文本型 = edt_服务器IP.内容
.局部变量 端口, 整数型 = 到数值 (edt_端口.内容)
.如果真 (网络客户端1.连接 (服务器IP, 端口) = 真)
lbl_连接状态.标题 = “已连接到服务器”
btn_连接服务器.禁止 = 真
btn_断开连接.禁止 = 假
btn_查询成绩.禁止 = 假
.如果真结束
' ---------------------- 断开服务器连接 ----------------------
.子程序 _btn_断开连接_被单击
网络客户端1.断开 ()
lbl_连接状态.标题 = “未连接到服务器”
btn_连接服务器.禁止 = 假
btn_断开连接.禁止 = 真
btn_查询成绩.禁止 = 真
' ---------------------- 发送查询请求 ----------------------
.子程序 _btn_查询成绩_被单击
.局部变量 请求文本, 文本型
.局部变量 科目, 文本型 = cb_科目.内容
.局部变量 条件, 文本型 = edt_条件.内容
' 构建请求格式:“查询|科目|条件”
请求文本 = “查询|” + 科目 + “|” + 条件
网络客户端1.发送数据 (到字节集 (请求文本)) ; 发送请求到服务器
' ---------------------- 处理服务器响应数据 ----------------------
.子程序 _网络客户端1_数据到达, , , 数据:服务器返回的字节集
.参数 数据, 字节集
.局部变量 响应文本, 文本型
.局部变量 拆分数组, 文本型, , “0”
.局部变量 一行数据, 文本型, , “0”
.局部变量 i, 整数型
.局部变量 行索引, 整数型
响应文本 = 到文本 (数据)
' 清空超级列表框
超级列表框1.全部删除 ()
' 按行拆分响应文本
分割文本 (响应文本, #换行符, 一行数据)
.计次循环首 (取数组成员数 (一行数据), i)
.如果真 (一行数据[i] = “” 或 取文本左边 (一行数据[i], 4) = “学生编号”) ; 跳过空行和表头
继续循环 ()
.如果真结束
' 按|拆分字段
分割文本 (一行数据[i], “|”, 拆分数组)
.如果真 (取数组成员数 (拆分数组) ≠ 7) ; 验证数据格式
继续循环 ()
.如果真结束
' 插入到超级列表框
行索引 = 超级列表框1.插入行 ()
超级列表框1.置标题 (行索引, 0, 拆分数组[1])
超级列表框1.置标题 (行索引, 1, 拆分数组[2])
超级列表框1.置标题 (行索引, 2, 拆分数组[3])
超级列表框1.置标题 (行索引, 3, 拆分数组[4])
超级列表框1.置标题 (行索引, 4, 拆分数组[5])
超级列表框1.置标题 (行索引, 5, 拆分数组[6])
超级列表框1.置标题 (行索引, 6, 拆分数组[7])
.计次循环尾
⌨️
1.9.5 实操:升级「网络版班级成绩管理系统」 ⏱️
(1)需求与界面设计 🎨
系统分为两部分:
- 服务器端:管理Access数据库,提供成绩查询服务;
- 界面组件:网络服务组件、启动/停止服务按钮、服务状态标签;
- 客户端:连接服务器,发送查询请求,接收并显示结果;
- 界面组件:网络客户端组件、服务器IP/端口输入框、连接/断开按钮、科目/条件选择框、查询按钮、超级列表框(显示成绩)。
(2)核心功能实现
① 服务器端:
- 启动时自动加载数据库,监听8888端口;
- 接收客户端“查询|科目|条件”格式的请求;
- 查询数据库后返回“学生编号|语文|数学|英语|物理|化学|总分”格式的响应;
② 客户端: - 连接服务器后可发送查询请求;
- 接收服务器响应后自动解析并显示到超级列表框;
- 支持断开连接、重新连接。
(3)测试流程 🚀
① 服务器端操作:
🔹 编译服务器端程序,运行后点击「启动服务」→服务状态显示“已启动”;
🔹 确保班级成绩.mdb数据库文件与服务器程序在同一目录;
② 客户端操作:
🔹 编译客户端程序,运行后输入服务器IP(本地测试用127.0.0.1)和端口8888;
🔹 点击「连接服务器」→连接状态显示“已连接”;
🔹 选择科目「数学」、条件「>=90」,点击「查询成绩」→超级列表框显示服务器返回的查询结果;
🔹 断开连接后可重新连接,测试多客户端连接(同时运行多个客户端)。
1.9.6 常见问题与解决方案 ⚠️
(1)端口被占用
现象:服务器启动失败,提示“端口已被占用”;
原因:该端口已被其他程序(如QQ、浏览器)占用;
解决方案:
- 用Windows命令行
netstat -ano | findstr "8888"查看占用端口的进程ID; - 在任务管理器中结束对应进程,或更换其他端口(如8889)。
(2)防火墙拦截
现象:客户端连接服务器失败,提示“连接超时”或“无法连接到远程服务器”;
原因:Windows防火墙拦截了程序的网络访问;
解决方案:
- 打开「Windows Defender防火墙」→「允许应用或功能通过Windows Defender防火墙」→添加服务器/客户端程序;
- 临时关闭防火墙(测试用,不建议长期关闭)。
(3)数据收发不完整
现象:接收的数据缺少部分内容或格式错误;
原因:TCP协议是“流式传输”,大文件可能被拆分为多个数据帧发送;
解决方案:
- 为数据添加“长度前缀”(如
到文本 (取字节集长度 (数据)) + “|” + 到文本 (数据)),接收时先解析长度再拼接完整数据; - 小文件可一次性发送,大文件需分段发送并在客户端拼接。
(4)连接失败(本地测试)
现象:客户端连接127.0.0.1失败;
原因:服务器未启动或端口错误;
解决方案:
- 确保服务器已启动并监听正确端口;
- 检查客户端输入的端口是否与服务器一致。
1.9.7 本章小结 📌
通过本节学习,你已经掌握了易语言网络编程的基础核心技术,实现了系统从“本地使用”到“网络协作”的跨越:
✅ 概念理解:用「快递收发」类比彻底掌握TCP/UDP、服务器/客户端、IP/端口等网络核心概念;
✅ 支持库使用:熟练配置与使用易语言内置网络支持库,无需外部依赖;
✅ 开发能力:独立完成TCP服务器/客户端的全流程开发,理解事件驱动的网络编程模式;
✅ 实操成果:构建「网络版班级成绩管理系统」,支持多客户端远程查询成绩;
✅ 问题排查:能够解决端口被占用、防火墙拦截、数据收发不完整等高频网络错误;
✅ 思维升级:从“单机应用开发”升级为“网络分布式应用开发”,为后续开发远程控制、即时通讯等系统打下基础。

1654

被折叠的 条评论
为什么被折叠?



