python应用-socket网络编程(1)

目录

1 先简单回顾下客户端和服务端通信的知识

2 服务端常用函数

3 客户端常用函数

4 服务端和客户端都用的函数

5 示例介绍客户端和服务端通信过程

6 建立服务端套接制

7 创建服务端函数socket.create_server()

8 创建客户端套接字

9 客户端连接函数socket.create_connection()

10 socket使用with ... as 上下文管理器 

socket 是 Python 标准库中的一个模块,它提供了低级别的网络通信接口。使用 socket 模块,你可以创建客户端和服务器应用程序,以便在网络上进行数据交换。

先简单回顾下客户端和服务端通信的知识

以前我记得面试的时候经常会被问到一个问题:当在浏览器上输入百度域名并回车后,我们能看到浏览器返回了首页的内容,那中间的通信过程是什么?

当然中间经历的过程涉及到了很多通信知识,比如ip地址/tcp协议/http协议/DNS协议等(OSI的七层模型),浏览器的html/js/css等等方方面面,大家可以自行学习。

那要想完成客户端到服务端的tcp连接,首先服务器端要监听ip和port,等待很多个客户端主动发起连接,从而发送数据进行通信。而socket模块的函数就可以支持完成通信过程,我们先介绍下socket的一些常用函数。

服务端常用函数:

bind(address)方法用于将套接字绑定到指定的地址。地址通常是一个包含IP地址和端口号的元组,例如 ('localhost', 80)。

listen(backlog) 方法用于在服务器端套接字上启用监听,等待客户端的连接。backlog 参数指定了最多可以挂起的连接数。

accept() 方法用于接受一个客户端的连接请求,并返回一个新的套接字对象和客户端的地址。这个方法通常用在服务器端,用于处理多个客户端的连接。

客户端常用函数

connect(address) 方法用于客户端连接到指定的服务器地址。地址是一个包含服务器IP地址和端口号的元组。

服务端和客户端都用的函数

send() 和 sendall()

send(bytes) 方法用于发送数据到连接的套接字。sendall(bytes) 方法也是用于发送数据,但它会尝试发送所有数据,直到没有数据需要发送或发生错误。

recv(bufsize, flags=0) 方法用于接收套接字的数据。bufsize 参数指定了要接收的最大字节数。

close()方法用于关闭套接字连接。一旦套接字被关闭,就不能再发送或接收数据。

示例介绍客户端和服务端通信过程

建立服务端套接字

import socket
# 创建一个 socket 对象 基于ipv4和tcp
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定到本地地址和端口
server_address = ('localhost', 8080)
server_socket.bind(server_address)

# 开始监听连接
server_socket.listen(1)
print('Waiting for a connection...')

#接收客户端的连接
connection, client_address = server_socket.accept()
print(f'Connection from {client_address}')

#接收客户端发送的数据
data = connection.recv(1024)
print(f'Received {len(data)} bytes from {client_address}')

#解码2进制内容
if data:
   print(data.decode())
   senddata = data.decode() + ',已收到该消息。'
else:
   senddata = '没有收到消息,等待中'

# 往客户端发送数据
connection.sendall(senddata)

#关闭连接
connection.close()

执行该python程序后:服务端会等待客户端连接:

Waiting for a connection...

创建服务端函数socket.create_server()

python3.9及以上版本提供了socket.create_server() 函数允许快速创建一个套接字并绑定到指定的地址和端口,同时它还可以选择性地监听套接字。这个函数的原型如下:

socket.create_server(address, family=socket.AF_INET, backlog=None, dualstack_ipv6=False)

参数解释:

  • address:一个元组,包含主机地址和端口号,例如 ('localhost', 8000)。
  • family:地址族,默认为 socket.AF_INET(IPv4),也可以使用 socket.AF_INET6(IPv6)。
  • backlog:指定最多连接数,待处理队列的长度。如果未指定或为 None,则使用默认值。
  • dualstack_ipv6:一个布尔值,如果为 True,并且地址族是 socket.AF_INET6,则创建一个双栈套接字,该套接字可以在 IPv4 和 IPv6 之间透明地工作。

以上创建的服务端可以简化:

import socket

server_address = ('localhost', 8080)

#创建服务端socket连接 返回套接字对象
server_socket = socket.create_server(server_address)
print('Waiting for a connection...')

#接收客户端的连接
connection, client_address = server_socket.accept()
print(f'Connection from {client_address}')

#接收客户端发送的数据
data = connection.recv(1024)
print(f'Received {len(data)} bytes from {client_address}')

#解码2进制内容
if data:
   print(data.decode())
   senddata = data.decode() + ',已收到该消息。'
else:
   senddata = '没有收到消息,等待中'

# 往客户端发送数据
connection.sendall(senddata)

#关闭连接
connection.close()

创建客户端套接字

import socket

# 创建一个 socket 对象 基于ipv4和tcp
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到刚才的服务端的地址和端口
server_address = ('localhost', 8080)
client_socket.connect(server_address)

# 发送数据 往服务端发送数据
message = 'hello world!'
client_socket.sendall(message.encode())

#等待接收服务端发送的数据
data = client_socket.recv(1024)
print(f'Received {len(data)} bytes {data.decode()}')

# 关闭连接
client_socket.close()

执行客户端python程序后,日志打印如下,接收到了服务端发送的内容:

Received 38 bytes hello world!,已收到该消息。

而服务端也收到了客户端发送的内容:

Received 14 bytes from ('127.0.0.1', 51223)

hello world!

客户端连接函数socket.create_connection()

用于简化创建套接字并与服务器建立 TCP 连接的过程。这个函数会创建套接字,尝试连接到指定的地址,并返回连接好的套接字对象。如果连接失败,它会引发一个异常。

socket.create_connection() 的原型如下:

create_connection(address, timeout=None, source_address=None)

参数解释:

  • address:一个包含服务器地址和端口号的元组,例如 ('localhost', 8080)。
  • timeout:可选参数,指定连接超时时间(秒)。如果连接在超时时间内未完成,则抛出异常。默认为 None,表示不设置超时。
  • source_address:可选参数,一个包含源地址和端口号的元组,用于绑定套接字到特定的本地地址和端口。
import socket

# 创建一个 socket 对象 基于ipv4和tcp 连接到刚才的服务端的地址和端口
server_address = ('localhost', 8080)
client_socket=socket.create_connection(server_address)

# 发送数据 往服务端发送数据
message = 'hello world!'
client_socket.sendall(message.encode())

#等待接收服务端发送的数据
data = client_socket.recv(1024)
print(f'Received {len(data)} bytes {data.decode()}')

# 关闭连接
client_socket.close()

socket使用with ... as 上下文管理器

socket这个class支持__enter__() 和__exit__()魔法方法,所以也支持使用with ..as 语句。当程序退出时自动关闭socket连接

import socket
with socket.create_connection(('localhost', 8000)) as sock:
  # 使用 sock 发送和接收数据
  pass # 在这里编写你的代码

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,谢谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/582018.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用socat验证multicase(组播)和broadcast(广播) with k8s容器环境

安装socat 网络允许的话,可以使用yum install -y socat进行安装。 如果是在容器里面运行,建议使用静态链接的socat: 可以从此处下载: Release socat-v1.7.4.4 ernw/static-toolbox GitHub 确定网络接口地址和组播地址 #kubectl exec -i…

请编写函数fun,该函数的功能是:实现B=A+A‘,即把矩阵A加上A的转置,存放在矩阵B中。计算结果在main函数中输出。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

ASP.NET汽车销售管理系统的设计与开发

摘 要 随着人们生活水平的不断提高,人们对汽车的消费和需求也越来越旺盛。很多汽车销售公司的业务环节仍然运用人工记账的传统方法,既容易出错又会导致账目混乱,查询和统计起来也非常不方便,费时又费力,严重时会给公…

Python | Leetcode Python题解之第58题最后一个单词的长度

题目: 题解: class Solution:def lengthOfLastWord(self, s: str) -> int:ls[]for i in s.split():ls.append(i)return len(ls[-1])

CLI举例:基于用户接入方式和终端设备类型的安全策略

组网需求 如图1所示,某企业在网络边界处部署了FW作为安全网关,连接内部网络与Internet。具体情况如下: 内部网络中已经部署了Agile Controller身份验证机制,Agile Controller服务器上存储了用户信息。内部网络中的用户可以使用不…

畅信达呼叫中心通过麒麟软件适配认证,引领行业新标准

在数字化浪潮汹涌的时代,软件兼容性已成为衡量一个企业技术实力和市场竞争力的重要标准。近日,畅信达呼叫中心产品成功通过麒麟软件适配认证,标志着产品在通用兼容性、性能及可靠性方面均达到了行业领先水平,将为用户的关键性应用…

Spring Boot整合Camunda实现工作流

文章目录 1. 环境准备2. 添加Camunda配置3. 创建并部署工作流程4. 启动Spring Boot应用程序5. 部署工作流程6. 访问Camunda Tasklist7. 执行工作流程8. 总结 🎉欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页&#xff1a…

deepflow grafana plugin 编译问题解决

修改tsconfig.js 增加"noImplicitAny": false,解决代码类型没有指定,显示Any 错误 To solve the error, explicitly set the parameters type to any, use a more specific type or set noImplicitAny to false in tsconfig.json. https://b…

vue处理查询框清除后无法查询问题,举例为日期选择

例如 在对应的查询方法添加 //我这里获取的是date,如果是其他参数改为其他的即可 if (query.date && query.date.length > 2) {conditions.noedate query.date[0] || conditions.noedate;//获取开始时间conditions.twodate query.date[1] || conditi…

CVE-2023-48795修复方法

CVE-2023-48795修复方法 1、修复原理2、检测漏洞3、修复漏洞4、成功修复 近期nessus扫描经常出现一个中危漏洞CVE-2023-48795,但网上的修复方法清一色的将openSSH升级到9.6p1版本 而我在升级当中处处碰壁,甚至于差点给服务器都干崩溃,特意研究…

基于python-flask技术的社区信息交流平台【数据库+15000文档】

预览 介绍 系统只需使用者通过电脑浏览器即可实现系统的访问和操作的WEB模式的信息化系统。为了保证系统数据的准确性、安全性的数据存储,系统应用MySQL数据库进行系统数据存储服务。根据对社区工作的深入调研和对社区居民的走访调查,详细分析整体系统的…

智慧公厕:高速服务区公厕智慧技术改造

近年来,随着科技的迅速发展,高速服务区的公共卫生设施也在不断创新。深圳光明源智能科技在这一领域做出了积极的探索和实践,通过引入智能科技,提升了高速服务区公厕的管理水平和服务质量。以下是其中一些具体的创新技术和功能&…

Power BI:如何将文件夹批量Excel(多sheet页)文件导入?

故事背景: 业务同事想用Power BI分析近两年市场费用。 数据源全部是Excel文件,并且以每月一个Excel文件的方式,统一存放到同一文件夹下面。 重点,每张Excel文件会有多张sheet页,用区分每家分公司的费用信息。 目前…

Web前端开发之CSS_2

关系选择器CSS盒子模型弹性盒子模型文档流浮动清除浮动定位 1. 关系选择器 1.1 后代选择器 E F{} 选择所有被 E 元素包含的 F 元素&#xff0c;中间用空格隔开 <ul> <li>后代列表1</li> <div> <ol> <li>后代列表2</li> </ol>…

VULHUB复现fastjson1.2.24反序列化漏洞

蚌埠住了&#xff0c;遇到了很多奇奇怪怪的问题。 如果你问我为啥不用kali&#xff0c;我会告诉你&#xff0c;我电脑上的kali装不成docker-compose!我急用了ubuntu如果你问我为啥用ubuntu克隆&#xff0c;我会告诉你&#xff0c;我电脑上的kali不能安装成功java8这个版本如果你…

秋招后端开发面试题 - Java语言基础(下)

目录 Java基础下前言面试题toString() 、String.valueof()、(String)&#xff1f;hashCode() 方法&#xff1f;hashCode 和 equals 方法判断两个对象是否相等&#xff1f;为什么重写 equals 时必须重写 hashCode 方法&#xff1f;String、StringBuffer、StringBuilder?String …

《ESP8266通信指南》9-TCP通信(Arudino开发)

往期 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发&#xff09;&#xff08;非常简单&#xff09;-CSDN博客 《ESP8266通信指南》7-Arduino 开发8266的环境配置与示例代码烧录-CSDN博客 《ESP8266通信指南》6-创建TCP服务器&#xff08;AT指令&#xff09;-CSDN博…

asp.net结课作业中遇到的问题解决1

作业要求 实现增删改查导出基本功能。 1、如何设置使得某个背景就是一整个而不是无限填充或者是这个图片的某一部分。 这就要求在设置这一块的时候&#xff0c;长和宽按照背景图片的大小进行设置&#xff0c;比如&#xff1a; 如果&#xff0c;图片的大小不符合你的要求&am…

如何让用户听话?

​福格教授&#xff08;斯坦福大学行为设计实验室创始人&#xff09;通过深入研究人类行为20年&#xff0c;2007年用自己的名子命名&#xff0c;提出了一个行为模型&#xff1a;福格行为模型。 模型表明&#xff1a;人的行为发生&#xff0c;要有做出行为的动机和完成行为的能…

操作系统——优先权算法c++实现

变量描述 测试数据 5 A 0 4 4 B 1 3 2 C 2 5 3 D 3 2 5 E 4 4 1 先来先服务算法 简述 该算法实现非常简单就是对到达时间排个序&#xff0c;然后依次进行即可&#xff0c;对结构体的sort进行了重载 代码 void FCFS() {//先来先服务算法std::cout<<"\n\t\t\t\t\…