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() 的原型如下:

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

参数解释:

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

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot的甘肃旅游服务平台(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的甘肃旅游服务平台(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

学习周报:文献阅读+Fluent案例+有限体积法理论学习

目录 摘要 Abstract 文献阅读:基于物理信息神经网络的稀疏数据油藏模拟 文献摘要 文章讨论|结论 各方程和原理简介 PINN简介 域分解 实验设置 单相油藏问题 油水两相问题 Fluent实例:Y型弯管中的流体混合分析 几何建模部分 网格划分 求解器设…

获取boss直聘城市地区josn数据

获取boss直聘城市地区josn数据 当我需要爬取多个城市的地区的时候,只能手动点击,然后一个一个看 结果: 能看到所有区域所有子地区的地区代码 解析该JSON数据 import pandas as pd import requests code[] area[] 城市代码101210100 res…

VForm3的文件上传后的一种文件回显方式

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

Windows电脑中护眼(夜间)模式的开启异常

我的电脑是联想小新16pro,Windows11版本。之前一直可以正常使用夜间模式,但是经过一次电脑的版本更新之后,我重启电脑发现我的夜间模式不能使用了。明明显示开启状态,但是却不能使用,电脑还是无法显示夜间模式。 询问…

第三节课,后端登录【1】.1--本人

一、后端登录逻辑,检测账户密码是否合法及密码输入是否正确 视频链接: 网址: 第三节:【视频】后端登录逻辑,检测账户密码是否合法及密码输入是否正确视频链接:-CSDN博客 从5.1开始 这是一个Java方法&am…

1438.绝对差不超过限制的最长连续子数组

显然我们是需要同时维护当前的最大值和最小值,这就需要两个单调队列dq_down(递减排列)一个维护最大值,dq_up(递增排列)一个维护最小值,同样这个是使用我们第二个模板 [left, i]. 只有当left等于某一个dq.front()的时候,才把它pop_front().这就使得对应相同的元素,我们只需要保…

LeetCode 热题 100 Day06

矩阵相关题型 Leetcode 48. 旋转图像【中等】 题意理解: 将一个矩阵顺时针旋转90度,返回旋转后的矩阵。 要求: 在原地修改,不借助额外的空间 如果可以使用辅助数组来实现转置,则有 matrix_new[i][j]matrix[j][row-i-1]; 解…

Kubernetes学习-核心概念篇(三) 核心概念和专业术语

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Kubernetes渐进式学习-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 1. 前言 在前面两篇文章我们简单介绍了什么是K8S,以及K8S的…

【保姆级讲解下gateway基本配置】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

STM32与OLED显示屏通信(四针脚和七阵脚)

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 单片机调试 2. OLED简介 3. 接线 4. OLED驱动函数 4.1 四针脚版本 OLED.c OLED.h OLED_Font.h 4.2 七针脚版本 引脚连接 OLED.c OLED.h OLED_Font.h 5. 主函数 工程文件模板 1. 单片机…

JMeter的下载安装与使用(Mac)

1、下载地址​​​​​​https://jmeter.apache.org/download_jmeter.cgi 2、下载Binaries 下的apache-jmeter5.5.tgz 3、解压 4、启动 在bin目录下打开终端,输入sh jmeter 出现jmeter首页界面,即为成功。 5、使用 5.1 语言选择 option选项卡&am…

揭秘!七大副业赚钱秘籍,让你轻松实现财务自由!

以下是七种赚钱的副业推荐: 1,自媒体运营 自媒体运营是当下非常火热的副业之一。通过在微博、微信公众号、抖音、B站等自媒体平台上发布原创内容,吸引粉丝关注,进而实现流量变现。自媒体运营的核心在于内容创作和粉丝互动&#…

系统服务(22年国赛)—— DHCPDHCP Relay(中继)

前言:原文在我的博客网站中,持续更新数通、系统方面的知识,欢迎来访! 系统服务(22年国赛)—— DHCP&&DHCP Relay(中继)https://myweb.myskillstree.cn/94.html 目录 一、题目 DHCP AppSrv 二…

Linux学习之路 -- 进程篇 -- 自定义shell的编写

前面介绍了进程程序替换的相关知识&#xff0c;接下来&#xff0c;我将介绍如何基于前面的知识&#xff0c;编写一个简单的shell&#xff0c;另外本文的所展示的shell可能仅供参考。 目录 <1>获取用户的输入和打印命令行提示符 <2>切割字符串 <3>执行这个…

第 4 篇 : Netty客户端互发图片和音/视频

说明 因为图片和音/视频不能确定其具体大小, 故引入MinIO。客户端之间只发送消息, 通过上传/下载来获取额外信息 1. MinIO搭建(参考前面文章), 并启动 2. 登录MinIO创建3个Bucket: image、voice、video 3. 客户端改造 3.1 修改 pom.xml <?xml version"1.0" …

苍穹外卖绕过微信支付

经过以下改动可实现&#xff1a; 1、不用微信支付端口 2、弹出支付成功的界面 3、数据库修改支付成功后的数据 #在OrderServiceImpl.java里加入Autowiredprivate OrderService orderService; #在OrderServiceImpl.java里的payment函数做以下改动 #图片里有&#xff0c;红色为原…

2024李卜常识王小晨申论类比刷题课

2024年&#xff0c;李卜常识与王小晨申论类比刷题课成为备考公务员考试的热门选择。李卜老师以其深厚的学识&#xff0c;为学员们剖析常识的精髓&#xff1b;而王小晨老师则通过类比刷题的方式&#xff0c;帮助学员们掌握申论的技巧。这两门课程相互补充&#xff0c;让学员们在…

03-JAVA设计模式-观察者模式

观察者模式 什么是观察者模式 Java中的观察者模式是一种常见的设计模式&#xff0c;它允许对象&#xff08;观察者&#xff09;订阅另一个对象&#xff08;被观察者&#xff09;的状态变化&#xff0c;并在状态变化时自动得到通知。 核心&#xff1a; 观察者模式主要用于1&a…

手搓带头双向循环链表(C语言)

目录 List.h List.c ListTest.c 测试示例 带头双向循环链表优劣分析 List.h #pragma once#include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int LTDataType;typedef struct ListNode {struct ListNode* prev;struct ListNode* next…