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


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

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.发送数据 (客户编号, 数据字节集)发送响应。

代码示例

e 复制代码
.版本 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.发送数据 (请求字节集)发送请求。

代码示例

e 复制代码
.版本 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函数使用等,进一步提升系统的性能与扩展性。

相关推荐
布茹 ei ai2 小时前
QtWeatherApp - 简单天气预报软件(C++ Qt6)(附源码)
开发语言·c++·qt·开源·开源项目·天气预报
Wpa.wk2 小时前
自动化测试 - 文件上传 和 弹窗处理
开发语言·javascript·自动化测试·经验分享·爬虫·python·selenium
LinHenrY12272 小时前
初识C语言(编译和链接)
c语言·开发语言·蓝桥杯
_OP_CHEN2 小时前
【Python基础】(二)从 0 到 1 入门 Python 语法基础:从表达式到运算符的全面指南
开发语言·python
l1t2 小时前
利用小米mimo为精确覆盖矩形问题C程序添加打乱函数求出更大的解
c语言·开发语言·javascript·人工智能·算法
我命由我123452 小时前
Python Flask 开发:在 Flask 中返回字符串时,浏览器将其作为 HTML 解析
服务器·开发语言·后端·python·flask·html·学习方法
csbysj20202 小时前
Scala 类和对象
开发语言
拾忆,想起2 小时前
设计模式:软件开发的可复用武功秘籍
开发语言·python·算法·微服务·设计模式·性能优化·服务发现
沐知全栈开发2 小时前
HTTP/HTTPS 简介
开发语言