仓颉编程语言入门 -- 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 中,字符串字面量会自动放入字符串常量池中,这是一个…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
