易语言网络编程基础:构建网络版应用


在这里插入图片描述

易语言网络编程基础:构建网络版应用 💻

1.9.1 学习目标 🎯

作为本地应用到网络应用的关键升级章节,本节将解决前序系统“仅能本地使用、无法远程协作”的痛点,你将达成以下目标:

  1. 用**「快递收发系统」生活化类比**彻底理解网络通信核心概念(TCP/UDP协议、服务器/客户端、端口/IP);
  2. 熟练掌握易语言内置网络支持库的配置与使用,无需额外依赖;
  3. 精通TCP服务器/客户端的全流程开发:服务端启动→监听端口→接收连接→收发数据;客户端连接→发送请求→接收响应;
  4. 将1.8的「精美版班级成绩管理系统」升级为**「网络版班级成绩管理系统」**——支持多客户端远程查询成绩、服务器统一管理数据库、实时数据同步;
  5. 排查「端口被占用」「防火墙拦截」「数据收发不完整」「连接超时」等入门阶段网络编程高频错误。

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)需求与界面设计 🎨

系统分为两部分

  1. 服务器端:管理Access数据库,提供成绩查询服务;
    • 界面组件:网络服务组件、启动/停止服务按钮、服务状态标签;
  2. 客户端:连接服务器,发送查询请求,接收并显示结果;
    • 界面组件:网络客户端组件、服务器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服务器/客户端的全流程开发,理解事件驱动的网络编程模式;
实操成果:构建「网络版班级成绩管理系统」,支持多客户端远程查询成绩;
问题排查:能够解决端口被占用、防火墙拦截、数据收发不完整等高频网络错误;
思维升级:从“单机应用开发”升级为“网络分布式应用开发”,为后续开发远程控制、即时通讯等系统打下基础。

下一节将学习易语言的高级编程技巧,包括多线程、DLL调用、API函数使用等,进一步提升系统的性能与扩展性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值