仓颉编程语言入门 -- Socket 编程与HTTP 编程概述
仓颉的 Socket 编程概述
在网络通信的广阔天地中,仓颉的Socket编程如同一座桥梁,连接着不同的计算设备,实现了基于传输层协议的数据传输。无论是追求稳定可靠的TCP,还是偏好轻量级、无连接的UDP,Socket都扮演着不可或缺的角色。
可靠传输:TCP
在TCP的舞台上,客户端与服务端精心编排着一场连接与通信的舞蹈。服务端首先优雅地登台,创建并绑定一个监听特定端口的Socket,然后静待有缘人的连接请求。客户端则怀揣着明确的目标地址与端口,创建Socket并发起连接请求。一旦双方牵手成功,这场舞蹈便正式拉开序幕,数据报文的收发变得如丝般顺滑。
TCP服务端示例:
// 假设我们有一个伪代码环境
let serverPort = 8080 function startTcpServer() { // 创建并绑定服务端Socket let serverSocket = createTcpServerSocket(serverPort) serverSocket.bind() // 等待并接受客户端连接 let clientSocket = serverSocket.accept() // 读取并处理数据 let buffer = allocateBuffer(10) let bytesRead = clientSocket.read(buffer) print("Server received: ", buffer.slice(0, bytesRead)) // 后续可以继续与客户端通信或关闭连接
} // 调用函数启动服务器
startTcpServer()
TCP客户端示例:
let serverIp = "127.0.0.1"
let serverPort = 8080 function connectToTcpServer() { // 创建客户端Socket并连接到服务器 let clientSocket = createTcpSocket(serverIp, serverPort) clientSocket.connect() // 发送数据 let dataToSend = [1, 2, 3] clientSocket.write(dataToSend) // 关闭连接(在实际应用中,根据需求决定是否立即关闭) // clientSocket.close()
} // 调用函数连接到服务器
connectToTcpServer()
不可靠传输:UDP
相比之下,UDP的通信方式则显得更为随性不羁。无需建立连接,数据报文的发送与接收都更加直接且高效,但代价是牺牲了可靠性。在UDP的世界里,服务端与客户端的角色不再那么泾渭分明,每个套接字都是独立的舞者,自由地发送与接收来自四面八方的数据。
UDP服务端示例:
let serverPort = 8080 function startUdpServer() { // 创建并绑定UDP Socket let serverSocket = createUdpSocket(serverPort) serverSocket.bind() // 接收数据 let buffer = allocateBuffer(3) let (senderAddress, bytesRead) = serverSocket.receiveFrom(buffer) print("Received from ", senderAddress, ": ", buffer.slice(0, bytesRead))
} // 异步启动UDP服务器
asyncStart(startUdpServer)
UDP客户端示例:
let serverIp = "127.0.0.1"
let serverPort = 8080 function sendUdpData() { // 创建UDP Socket并绑定(有时可以省略绑定步骤) let clientSocket = createUdpSocket() // 客户端通常不需要显式绑定,除非有特定需求 // clientSocket.bind(anyLocalPort) // 发送数据到服务器 let dataToSend = [1, 2, 3] clientSocket.sendTo(serverIp, serverPort, dataToSend) // 无需关闭连接,UDP是无连接的
} // 调用函数发送数据
sendUdpData()
HTTP 编程
HTTP 协议,作为互联网上的通用语言,通过请求与响应的交互模式,在客户端与服务端之间架起了一座数据传输的桥梁。每当用户通过浏览器或其他客户端软件访问网络资源时,都会发送一个HTTP请求给服务器,而服务器则根据请求的内容返回相应的HTTP响应。这些请求和响应都遵循着固定的格式,包括报文头和报文体,确保了数据传输的准确性和完整性。
在HTTP的请求类型中,GET和POST是最为常用的两种。GET请求主要用于从服务器请求数据,其特点是在请求行中直接包含要访问的资源路径,且请求体中不包含数据(尽管实际上GET请求也可能带有查询字符串,但这通常不被视为请求体的一部分)。而POST请求则用于向服务器提交数据,这些数据被放置在请求体中,并通过一个空行与请求头分隔开。
仓颉框架,作为一款强大的网络开发工具,支持HTTP 1.0、1.1及2.0等多个协议版本,让开发者能够轻松构建高性能的客户端和服务端应用。通过利用仓颉提供的HttpRequestBuilder和HttpResponseBuilder类,开发者可以灵活地构造符合RFC 9110、9112、9113、9218、7541等标准规范的HTTP请求和响应报文。
下面是一个使用仓颉框架进行客户端和服务端编程的示例。在这个示例中,服务端将监听本地8080端口,并注册了一个处理"/hello"路径的请求处理器。当客户端发送GET请求到"/hello"时,服务端将返回"Hello Cangjie!"作为响应体。
服务端代码:
import 'net.http.dart';
import 'std.time.dart';
import 'std.sync.dart'; void startServer() { // 1. 初始化并配置Server实例 var server = ServerBuilder() .address("127.0.0.1") .port(8080) .build(); // 2. 注册路由处理函数 server.router.addRoute("/hello", (HttpContext httpContext) { httpContext.response.body = "Hello Cangjie!"; }); // 3. 启动服务器监听 server.listen();
} void main() { spawn(startServer); sleep(Duration.seconds(1)); startClient(); // 假设startClient在后续调用,实际中可能需要其他方式触发
} // 注意:这里假设了startClient函数已经定义,并且会在服务端启动后适当时间被调用
// 实际情况下,你可能需要在另一个脚本或程序中启动客户端,或者使用某种形式的同步/异步机制
相关文章:
仓颉编程语言入门 -- Socket 编程与HTTP 编程概述
仓颉的 Socket 编程概述 在网络通信的广阔天地中,仓颉的Socket编程如同一座桥梁,连接着不同的计算设备,实现了基于传输层协议的数据传输。无论是追求稳定可靠的TCP,还是偏好轻量级、无连接的UDP,Socket都扮演着不可或…...
Oracle基本SQL操作-用户角色权限管理
一、用户权限管理 -- 创建锁定用户,此时用户不可用 create USER zhucl IDENTIFIED BY 123456 account lock; 会提示用户被锁定: -- 删除用户 drop user zhucl;-- 重新创建用户,不锁定 create user zhucl IDENTIFIED BY 123456 account unlo…...
Qt-信号和槽(8)
目录 信号的概念 Qt中的信号三要素 connect函数 connect的原型 connect的使用 信号函数和槽函数 参数匹配 close关闭槽函数 运行结果 第一个问题:怎么知道 手册使用 第二个问题,为什么可以直接传递函数指针 自定义槽函数 第一种自定义槽函…...
80.游戏的分辨率修改思路与分析
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 上一个内容:79.游戏分析工具闪屏问题优化与数据被修改高亮 GAMEHACKER2.exe 工具下载地址ÿ…...
MaxKB(二):Ubuntu24.04搭建maxkb开发环境
接上文:windows10搭建maxkb开发环境(劝退指南) 上文在windows10环境搭建maxkb开发环境遇到各种坑,后面就转战ubuntu平台,果然比较顺利的完成开发环境搭建。当然遇到相关的问题还是可以参考上文《windows10搭建maxkb开发…...
c#实现数据导出为PDF的方式
PdfSharp vs iTextSharp: C#中PDF导出功能比较 PdfSharp 优点 轻量级:适合简单的PDF生成任务易于学习:API相对简单,学习曲线较缓开源:提供开源版本,可自由使用和修改纯C#实现:不依赖外部库或COM组件支持…...
【联想电脑】:使用拓展坞后转接HDMI,无法识别显示屏
项目场景: 作为一个嵌入式软件开发者,有两个外接屏幕,不足为奇。 但是在今天的使用电脑过程中,出现了接了一个拓展坞上面有HDMI接口,但是HDMI接口接上外接显示屏的时候电脑无法识别到,导致只有电脑直连的HD…...
Verilog刷题笔记53
题目: Fsm serialdata See also: Serial receiver Now that you have a finite state machine that can identify when bytes are correctly received in a serial bitstream, add a datapath that will output the correctly-received data byte. out_byte needs …...
GoFly快速开发后台框架-后端接口请求返回403提示码就跨域问题/请求端域名拦截问题
问题: 大家在本地开发或者部署后请求后端时返回403,只有一个问题就是存在请求端跨域问题。 解决办法: 解决这个问题很简单,跨域的就解决跨域就好了。 我们官方给大家统一解决办法是: 到后端配置文件resource/conf…...
设备实时数据采集:开启制造业智能化、自动化的新篇章
传统制造业在进行生产过程中,会涉及到设备实时数据采集需求,这些数据对于监控生产流程、优化生产效率、保证产品质量以及降低成本等方面至关重要。以下是一些常见的数据采集需求: 1.生产数据:包括生产数量、生产批次、生产速度等&…...
【python与java的区别-03(集合、字典)】
一、Set python: 集合(set)是一个无序的不重复元素序列。 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数…...
Java继承
目录 一、继承概念 二、语法格式 三、类型及特性 四、关键字 4.1. super 4.2. super与this指针 4.3 final 关键字 一、继承概念 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进…...
Kafka集群搭建的两种方式
目录 1. 依赖Zookeeper搭建集群 1. 下载Kafka二进制文件 2. 更改kafka配置 3. 启动Zookeeper集群和Kafka集群 4. 验证集群 1.创建主题 2. 检查主题是否存在 3. 创建生产者生产数据 4. 创建消费者消费数据 5. 检查Zookeeper中Kafka集群的元数据 2. 不依赖Zookeeper搭…...
两种变量初始化方法的区别
1. CarriageEntity carriageEntity new CarriageEntity()和 null的区别 1.1 CarriageEntity carriageEntity new CarriageEntity(); 初始化:这行代码创建了一个新的 CarriageEntity 对象,并将其引用赋值给 carriageEntity 变量。对象状态ÿ…...
群晖把硬盘共享给win10(虚拟机或物理机)的两种办法
1. 通过SMB共享 NAS地址:192.168.3.100 打开“此电脑”,在win10地址栏输入 \192.168.3.100\video,提示输入用户名、密码。在video文件夹右击,点击“映射网络驱动器” 在win10电脑上,复制文件到T盘上,在T盘…...
Java-Web面试题汇总
一、TCP 和 UDP 的区别 在网络通信中,TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)是两种常见的协议,它们在多个方面存在显著差…...
数字化技术分别有哪些,数字化技术特点和优势是什么?
随着企业数字化进程的加速,人工智能、工业互联网、低代码等底层技术正全面重塑企业运营生产体系,推动新的生产要素、研发范式和商业模式的建立。 这个变革过程不仅是对原有制造体系的颠覆,而且会影响各行各业的所有细分行业和产业链价值链…...
微服务CI/CD实践(一)环境准备及虚拟机创建
微服务CI/CD实践系列: 微服务CI/CD实践(一)环境准备及虚拟机创建 微服务CI/CD实践(二)gitlabs部署 微服务CI/CD实践(三)nexus3部署 微服务CI/CD实践(四)数据库,redis,n…...
【SpringBoot】优化慢启动应用的用户体验
通过深入分析SpringBoot中WebServer的启动流程,插入自定义的Loading页面展示逻辑,优化软件使用时的用户体验。 背景 Java本身的特点,再加上开发人员能力差,软件开发工程化程度低等等问题,经过一段时间的迭代之后&…...
String str=“i“ 与 String str=new String (“i“) 一样吗?
String str"i" 与 String strnew String ("i") String str"i" 这种形式声明了一个 String 对象,其中 "i" 字符串字面量直接赋值给 str。在 Java 中,字符串字面量会自动放入字符串常量池中,这是一个…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
