Perl 语言开发(十三):网络编程
目录
1. 概述
2. 网络编程基础
2.1 网络协议概述
2.2 Perl 网络编程基础模块
3. TCP 网络编程
3.1 创建 TCP 服务器
3.2 创建 TCP 客户端
4. UDP 网络编程
4.1 创建 UDP 服务器
4.2 创建 UDP 客户端
5. 高级网络编程
5.1 非阻塞 I/O
5.2 多线程网络编程
6. 简单的 HTTP 服务器实例
6.1 HTTP 协议概述
6.2 使用 Perl 实现简单的 HTTP 服务器
7. 总结
在现代计算领域,网络编程是一项至关重要的技能。Perl 语言,以其强大的文本处理能力和广泛的模块支持,成为许多开发者进行网络编程的首选工具。
1. 概述
网络编程涉及通过网络进行数据交换的程序设计。Perl 语言提供了丰富的库和模块,使得网络编程变得相对简单和高效。本文将从基础概念、常用模块、典型应用实例等方面进行详细介绍。
2. 网络编程基础
2.1 网络协议概述
网络协议是网络通信的规则和标准。常见的网络协议包括 TCP/IP、UDP、HTTP、FTP 等。理解这些协议是进行网络编程的基础。
2.2 Perl 网络编程基础模块
Perl 提供了多个用于网络编程的模块,其中最常用的是 IO::Socket。IO::Socket 模块是 Perl 的核心模块,支持创建和操作 TCP 和 UDP 套接字。
use IO::Socket;# 创建一个 TCP 客户端
my $socket = IO::Socket::INET->new(PeerAddr => 'localhost',PeerPort => 8080,Proto => 'tcp'
) or die "无法连接到服务器: $!";# 向服务器发送数据
print $socket "Hello, Server!";# 从服务器接收数据
my $response = <$socket>;
print "收到服务器响应: $response";# 关闭套接字
close($socket);
3. TCP 网络编程
3.1 创建 TCP 服务器
TCP 服务器用于监听特定端口并接收客户端的连接请求。以下是一个简单的 TCP 服务器示例。
use IO::Socket;# 创建一个 TCP 服务器
my $server = IO::Socket::INET->new(LocalPort => 8080,Type => SOCK_STREAM,Reuse => 1,Listen => 10
) or die "无法创建服务器: $!";print "服务器已启动,等待客户端连接...\n";while (my $client = $server->accept()) {print "客户端连接已建立\n";print $client "Hello, Client!\n";while (<$client>) {print "收到客户端消息: $_";print $client "收到: $_";}close($client);
}close($server);
3.2 创建 TCP 客户端
TCP 客户端用于连接到指定的服务器并进行数据传输。
use IO::Socket;# 创建一个 TCP 客户端
my $client = IO::Socket::INET->new(PeerAddr => 'localhost',PeerPort => 8080,Proto => 'tcp'
) or die "无法连接到服务器: $!";print $client "Hello, Server!\n";while (<$client>) {print "收到服务器消息: $_";
}close($client);
4. UDP 网络编程
4.1 创建 UDP 服务器
UDP 是一种无连接协议,适用于需要快速传输小数据包的场景。以下是一个 UDP 服务器示例。
use IO::Socket;# 创建一个 UDP 服务器
my $server = IO::Socket::INET->new(LocalPort => 8080,Proto => 'udp'
) or die "无法创建服务器: $!";print "UDP 服务器已启动,等待客户端消息...\n";while (1) {my $message;$server->recv($message, 1024);print "收到客户端消息: $message\n";$server->send("收到: $message");
}close($server);
4.2 创建 UDP 客户端
UDP 客户端用于向指定的服务器发送数据。
use IO::Socket;# 创建一个 UDP 客户端
my $client = IO::Socket::INET->new(PeerAddr => 'localhost',PeerPort => 8080,Proto => 'udp'
) or die "无法连接到服务器: $!";$client->send("Hello, Server!");my $response;
$client->recv($response, 1024);
print "收到服务器响应: $response\n";close($client);
5. 高级网络编程
5.1 非阻塞 I/O
非阻塞 I/O 允许程序在等待网络操作完成时继续执行其他任务。Perl 提供了 IO::Select 模块,用于处理非阻塞 I/O。
use IO::Socket;
use IO::Select;my $server = IO::Socket::INET->new(LocalPort => 8080,Type => SOCK_STREAM,Reuse => 1,Listen => 10
) or die "无法创建服务器: $!";my $select = IO::Select->new($server);print "服务器已启动,等待客户端连接...\n";while (1) {my @ready = $select->can_read();foreach my $fh (@ready) {if ($fh == $server) {my $client = $server->accept();$select->add($client);print "客户端连接已建立\n";} else {my $input = <$fh>;if ($input) {print "收到客户端消息: $input";print $fh "收到: $input";} else {$select->remove($fh);close($fh);print "客户端连接已关闭\n";}}}
}
5.2 多线程网络编程
多线程可以提高网络应用的并发性能。Perl 提供了 threads 模块,用于创建和管理线程。
use IO::Socket;
use IO::Select;my $server = IO::Socket::INET->new(LocalPort => 8080,Type => SOCK_STREAM,Reuse => 1,Listen => 10
) or die "无法创建服务器: $!";my $select = IO::Select->new($server);print "服务器已启动,等待客户端连接...\n";while (1) {my @ready = $select->can_read();foreach my $fh (@ready) {if ($fh == $server) {my $client = $server->accept();$select->add($client);print "客户端连接已建立\n";} else {my $input = <$fh>;if ($input) {print "收到客户端消息: $input";print $fh "收到: $input";} else {$select->remove($fh);close($fh);print "客户端连接已关闭\n";}}}
}
6. 简单的 HTTP 服务器实例
6.1 HTTP 协议概述
HTTP(超文本传输协议)是用于分布式、协作和超媒体信息系统的应用层协议。HTTP 是 Web 的基础。
6.2 使用 Perl 实现简单的 HTTP 服务器
以下代码展示了如何使用 Perl 创建一个简单的 HTTP 服务器。
use IO::Socket;my $server = IO::Socket::INET->new(LocalPort => 8080,Type => SOCK_STREAM,Reuse => 1,Listen => 10
) or die "无法创建服务器: $!";print "HTTP 服务器已启动,监听端口 8080...\n";while (my $client = $server->accept()) {my $request = <$client>;print "收到请求: $request";my $response = "HTTP/1.1 200 OK\r\n" ."Content-Type: text/html\r\n" ."Content-Length: 19\r\n" ."\r\n" ."<h1>Hello, World!</h1>";print $client $response;close($client);
}close($server);
7. 总结
网络编程是 Perl 语言的一项重要应用领域。通过对基础概念的掌握和常用模块的使用,开发者可以高效地进行网络应用的开发。无论是简单的客户端/服务器模型,还是复杂的多线程和非阻塞 I/O 应用,Perl 都提供了强大的支持。希望本文的内容能够帮助读者更好地理解和掌握 Perl 网络编程的技巧和方法。
相关文章:
Perl 语言开发(十三):网络编程
目录 1. 概述 2. 网络编程基础 2.1 网络协议概述 2.2 Perl 网络编程基础模块 3. TCP 网络编程 3.1 创建 TCP 服务器 3.2 创建 TCP 客户端 4. UDP 网络编程 4.1 创建 UDP 服务器 4.2 创建 UDP 客户端 5. 高级网络编程 5.1 非阻塞 I/O 5.2 多线程网络编程 6. 简单的…...
Leetcode算法题(移除链表中的元素)
题目如下: 思路1:创建一个新的带头链表 (newhead),遍历头结点对应的值分别于x进行比较,将不等于x的节点尾插到新的带头链表中,返回新的带头链表的下一个节点。 代码如下: typedef …...
浅谈网络安全防守:从被动应对到主动管理的转变
浅谈网络安全防守:从被动应对到主动管理的转变 背景: 在当今的数字时代,网络安全已成为企业生存和发展的重要基石。然而,当企业的网络安全体系面临着诸如资产不清、互联网应用管理混乱、边界防火墙策略失效、长期未修复的漏洞、…...
CentOS7仅安装部署MySQL80客户端
文章目录 CentOS7仅安装部署MySQL80客户端一、前言1.场景2.环境 二、正文1.安装MySQL客户端2. 数据库备份脚本 CentOS7仅安装部署MySQL80客户端 一、前言 1.场景 仅安装部署MySQL80客户端,用于备份数据库时使用 mysqldump 工具 2.环境 Linux 发行版:…...
力扣经典题目之->移除值为val元素的讲解,的实现与讲解
一:题目 博主本文将用指向来形象的表示下标位的移动。 二:思路 1:两个整形,一个start,一个end,在一开始都 0,即这里都指向第一个元素。 2:在查到val之前,查一个&…...
pico+unity3d项目配置
重点:unity编辑器版本要和pico的sdk要求一致、比如: 对于 Unity 2022.1.14 及以上版本,若同时在项目中使用 URP、Linear 色彩空间、四倍抗锯齿和OpenGL,会出现崩溃。该问题待 Unity 引擎解决。对于 Unity 2022,若同时…...
python条件
条件语句 if语句 if...else语句 if...elif...else语句 嵌套 is is 是一个身份运算符,用于比较两个对象的身份,即它们在内存中的地址是否相同。这与比较两个对象是否相等的 运算符不同。 运算符比较的是两个对象的值是否相等。 比较对象 比较基本数据…...
华为USG6000V防火墙v1
目录 一、实验拓扑图 二、要求 三、IP地址规划 四、实验配置 1🤣防火墙FW1web服务配置 2.网络配置 要求1:DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问 要求2:生产区不…...
Apache访问机制配置
Apache访问机制配置 Apache HTTP Server(简称Apache)是世界上使用最广泛的Web服务器之一。它的配置文件通常位于/etc/httpd/conf/httpd.conf或/etc/apache2/apache2.conf,根据操作系统的不同而有所不同。以下是配置Apache访问机制的详细说明…...
在word中删除endnote参考文献之间的空行
如图,在References中,每个文献之间都有空行。不建议手动删除。打开Endnote。 打开style manager 删除layout中的换行符。保存,在word中更新参考文献即可。...
【详解】Spring Cloud概述
🎥 个人主页:Dikz12🔥个人专栏:Spring学习之路📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1. 认识微服务 1.1 单体架构 1.2 集群和分布式架构 1.3 集群和分布式…...
板级调试小助手(3)基于PYNQ的OLED视频显示
一、前言 在之前的文章中介绍了《板级调试小助手》的系统结构和DDS自定义外设的搭建。这篇文章主要介绍一下如何在PYNQ中驱动平时长剑的OLED12864显示屏,并显示BadApple(毕竟有屏幕的地方就要有BadApple)。效果如下: BadApple 本项…...
git批量删除本地包含某字符串的特定分支
git批量删除本地包含某字符串的特定分支 git branch -a | grep 分支中包含的字符串 | xargs git branch -D git删除本地分支_git查看删除本地分支-CSDN博客文章浏览阅读989次。git branch -d <分支名>可以通过: git branch 查看所有本地分支及其名字,然后删…...
Android中RecyclerView使用详解(一)
目录 概述优点列表布局RecyclerView一、创建RecyclerView并且在布局中绑定二、实现RecyclerView单个item的布局三、给RecyclerView写一个对应的适配器Adapter1.创建自定义的ViewHolder2.继承Adapter,泛型使用我们自定义的ViewHolder3.重写Adapter的三个方法onCreate…...
坑3.上传图片(阿里云空间,oss验证)(未验证)
笔记 20240710 未验证,现在还没有阿里云空间,等买个sit环境就可以验证一下。 前端 页面 <!--页面--> <el-form-item label"优惠券图片" prop"couponImg"><single-upload v-model"dataForm.couponImg"&g…...
注册登录后上传文件到本地数据库项目
在上一篇的基础上我有添加了登录注册功能文件上传 更新一下代码添加登录注册功能 app.js // app.js const express require(express); const bodyParser require(body-parser); const cors require(cors); const db require(./models/db); const User require(./models…...
【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十三)-更换无人机控制器
引言 本文是3GPP TR 22.829 V17.1.0技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…...
react 组件通信 —— 父子传值 【 函数式/类式 】
1、函数式组件通信 父子间通信 —— 父传子 父组件 export default function father() {return (<div style{{width:400px,height:200px,background:pink,marginLeft:500px}}>我是父组件<hr /><Son name{"韩小刀"}/></div>) } 子组件 ex…...
【SpringBoot】95、SpringBoot中使用MyBatis-Plus实现自动加密存储和查询自动解密
有的业务需要将敏感数据加密存储到 DB,如果我们每个都手动去加密,再设值,再保存 DB,不仅麻烦,还对开发者不友好,在 MyBatis-Plus 中我们可以使用 BaseTypeHandler 来解决这个问题 1、新增 TypeHandler import com.baomidou.mybatisplus.core.toolkit.AES; import com.b…...
[数仓]十二、离线数仓(Atlas元数据管理)
第1章 Atlas入门 1.1 Atlas概述 Apache Atlas为组织提供开放式元数据管理和治理功能,用以构建其数据资产目录,对这些资产进行分类和管理,并为数据分析师和数据治理团队,提供围绕这些数据资产的协作功能。 Atlas的具体功能如下: 元数据分类 支持对元数据进行分类管理,例…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
