2024.6.18

2024-06-18 21:04
文章标签 2024.6 18

本文主要是介绍2024.6.18,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python的网络编程

网络四层
在开始前,我们需要先了解一下我们在网络通信过程中的四个层次
在这里插入图片描述
我们上网产生的数据都是经过协议栈一层一层的封装然后经网卡发送到网络,经网络发送到服务端,然后服务端又是一层一层的解封装拿到自己想要的数据。

我们学习的tcp和udp都是基于IP(网际互连协议)实现的

IP
计算机在互联网时必须要有一个唯一的标识,这样才能确定数据能够唯一发送
这个标识就是ip
目前有两种格式,一种是ipv4,一种是ipv6
127.0.0.1
回环地址,通俗的讲,就是我们在主机上发送给127开头的IP地址的数据包会被发送的主机自己接收,根本传不出去,外部设备也无法通过回环地址访问到本机。本机内联络时,我们一般就用它表示自己的ip地址

端口
是用来区分计算机应用程序的一个整数
范围是0到66535,我们使用时一般用大一些的端口号以免和别的程序冲突.像8080,9999等

两种通讯方式的不同
TCP

在链接时会进行"三次握手"来确保通信的安全
它负责将两台计算机建立可靠链接,能够保证将信息安全送达.
是一种可靠的,一对一的,面向链接的通信协议

UDP
它是无连接的,就像发短信一样,只要知道对方的IP地址和端口好就可以发送
但是因此它不保证信息的安全,也不一定能数据到达接收方

套接字socket

在我们编程时,我们关心的是我们的应用程序的数据能不能正常的发送出去和接收服务端发回来的数据。
这就需要一个桥梁,一端连接操作系统的协议栈,一端连接用户的应用数据。socket就是这个桥梁。

套接指的是套接管,就是将两根水管套接起来的管子,然后“字”是此连接的数据标识,即一个WORD,所以套接字就是一个标识连接的数据体。

这里它套接的又是什么东西呢?
它包含着通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。

Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

Python中的socket模块

常用的方法

bind((ip,port)) 绑定IP地址和端口
listen(N) 开始TCP监听,N表示操作系统挂起的最大连接数量,取值范围1-5之间,一般设置为5
accept() 被动接收TCP客户端连接,阻塞式
connect((ip,port)) 主动初始化TCP服务器连接
recv(size) 接收TCP数据,返回值为字符串类型,size表示要接收的最大数据量
send(str) 发送TCP数据,返回值是要发送的字节数量
recvfrom() 接收UDP数据,返回值为一个元组(data,address),data表示接收的数据,address表示发送数据的套接字地址
sendto(data,(ip,port)) 发送UDP数据,返回值是发送的字节数
close() 关闭套接字

我们发现,tcp和udp的使用方法不一样,所有要区分开使用

tcp版
我们先写服务器端

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8080))
s.listen(1)while True:conn, addr = s.accept()print('Connected by', addr)data = conn.recv(1024)conn.sendall(b'Hello, world')conn.close()

我们注意到,服务器端要先绑定一个端口和ip地址,这个绑定的意义在于,告诉计算机去哪个IP地址找哪个应用端口来连接
之后就是监听,监听这个动作就是等待一个来连接的客户端
accept就是开始被动接受过来的链接,只有服务器这边通过了(accept)之后,客户端才能连接到服务器
recv就是接受传来的信息

然后我们再写客户端

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8080))
s.sendall(b'Hello, world')
data = s.recv(1024)
s.close()
print('Received', repr(data))

这里和服务器很不一样,因为是客户端,毕竟客户是这样的,只需要负责connect到服务器就行了,服务器要做的就多了
然后连接好了我们就可以发送数据了,想接收数据也正常用recv就可以

udp版

import socket
server_address = ('192.168.31.54', 12345)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:message = "祖国必定统一!"client_socket.sendto(message.encode(), server_address)#发送数据data,server = client_socket.recvfrom(1024)#接收数据

很显然,udp这边不需要连接,只需要确定好ip和端口,然后朝着这个地址用sendto发送消息就好了
想接受也只需要用recvfrom,然后解包赋值获取data和地址就好

区别
主要就创捷套接字时
一个是socket.SOCK_STREAM流式的双向连接
一个是socket.SOCK_DGRAM这里的dgram就是数据报的意思,说明是无连接的电报式的发送

这篇关于2024.6.18的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073052

相关文章

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

机器学习周记(第四十四周:Robformer)2024.6.17~2024.6.23

目录 摘要ABSTRACT1 论文信息1.1 论文标题1.2 论文摘要1.3 论文引言1.4 论文贡献 2 论文模型2.1 问题描述2.2 Robformer2.2.1 Encoder2.2.2 Decoder 2.3 鲁棒序列分解模块2.4 季节性成分调整模块 摘要 本周阅读了一篇利用改进 Transformer 进行长时间序列预测的论文。论文模型为 Robformer ,其

(2024.6.23)最新版MAVEN的安装和配置教程(超详细)

1.什么是MAVEN         Maven是一个自动化构建工具,主要用于Java项目,它由Apache软件基金会维护。Maven能够自动化完成编译、测试、打包、发布等构建过程,可以大大提高开发效率,保证项目的质量。                                下面我们从几个方面来介绍一下MAVEN的功能与特性: 1.项目管理工具         Maven不仅仅是一

2024.6.21总结1117(大爱西安)

今天距离领毕业证还剩下10天,这几天事情都处理的差不多了,在宿舍待得有些无聊,晚上在学校周围逛了一下。 大学生活即将结束,但我还是有些许不舍。我怎么也高兴不起来。我即将要离开这个宿舍,这个班级,这所学校,我即将要离开这所美丽的城市。 我很喜欢西安这所城市,这座古老的城市,但我与它注定是有缘无分。 回想起初到西安,我对这座十三朝古都很是好奇,无论是它的历史文化还是它的自然景观。大一刚来到学校,

【2024.6.23】今日 IT 速递 | 亚布力创新年会热点新闻盘点

人不走空                                                                              🌈个人主页:人不走空       💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录       🌈个人主页:人不走空       💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋

source配置文件不生效 原创 2016年03月14日 18:43:55 3558 问题背景: 升级jdk 1.8之后,启动时报版本编译问题,查看$JAVA_HOME,$JRE_HOME

source配置文件不生效 原创  2016年03月14日 18:43:55 3558 问题背景:       升级jdk 1.8之后,启动时报版本编译问题,查看$JAVA_HOME,$JRE_HOME,没有问题。      初步推断是没有source,sourec .bashrc 之后查看$JAVA_HOME,$JRE_HOME变成1.8版本,但启动时还是报错,这就

Linux下Tomcat开机自动启动 原创 2014年07月18日 12:32:49 标签:Linux /tomcat /shell /启动 22095 Linux下tomcat开机自动启动有两种方法

Linux下Tomcat开机自动启动 原创  2014年07月18日 12:32:49 标签:Linux /tomcat /shell /启动 22095 Linux下tomcat开机自动启动有两种方法,一种是简单,一种是复杂而又专业的,使用shell脚本要实现,我们一般推荐shell脚本启动方式。下面我们分别介绍这两种方法。 1.shell脚本启动 众所周知,在L

软件需求开发的18般武艺

在《软件工程最佳实践》一书中,罗列了18种软件需求方法论,这里逐一介绍如下: 1、引入用户代表的敏捷开发需求 “用户代表”代表的是用户,决定的是需求。有了用户代表,需求的确认和变更,以及需求优先顺序的确定,都会便捷很多。这种方法完美契合敏捷的“交流胜于文档”的思想。唯一的问题是,这种方法论只能适用于小型软件的开发,对于大型软件来说,它就无能为力;甚至某些特定的嵌入式系统软件,如燃油喷射控制系统

【Rust日报】 2019-07-18:美国国会关于Libra的听证会

美国国会关于Libra的听证会 有议员提到,为什么为选择Rust来开发Libra,它够成熟吗?如何担负起其对安全的要求。内有彩蛋:D Read More 是否真的需要构造器 这篇文章 中,讨论了构造器是什么,Rust选择了没有构造器,这背后的权衡是什么?会有什么问题。并且对比了一下Swift的选择。等等,很细致。值得一看。 heim - 获取系统信息的工具项目 这个项目用于,跨平台,获取系统基本

【Rust 日报】2021-07-18 -- Quickwit 高性能对象存储搜索引擎

Quickwit:亚秒级延迟的对象存储搜索引擎 如果用过 ES,会感到非常熟悉,具体包括以下步骤: 第一步:编写索引配置文件 wiki_index_config.json(以 wiki 为例),保存到当前目录: {"default_search_fields": ["body", "title"], // If you do not specify fields in your query, t