前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python Socket 编程详细介绍(转)

Python Socket 编程详细介绍(转)

作者头像
超蛋lhy
发布于 2018-08-31 06:16:48
发布于 2018-08-31 06:16:48
3.9K00
代码可运行
举报
文章被收录于专栏:PythonistaPythonista
运行总次数:0
代码可运行

Python 提供了两个基本的 socket 模块:

  • Socket 它提供了标准的BSD Socket API
  • SocketServer 它提供了服务器重心,可以简化网络服务器的开发。

下面讲解下 Socket模块功能。

Socket 类型

套接字格式:socket(family, type[,protocal]) 使用给定的套接族,套接字类型,协议编号(默认为0)来创建套接字

socket 类型

描述

socket.AF_UNIX

用于同一台机器上的进程通信(既本机通信)

socket.AF_INET

用于服务器与服务器之间的网络通信

socket.AF_INET6

基于IPV6方式的服务器与服务器之间的网络通信

socket.SOCK_STREAM

基于TCP的流式socket通信

socket.SOCK_DGRAM

基于UDP的数据报式socket通信

socket.SOCK_RAW

原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次SOCK_RAW也可以处理特殊的IPV4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头

socket.SOCK_SEQPACKET

可靠的连续数据包服务

创建TCP Socket:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

创建UDP Socket:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

Socket 函数

  • TCP发送数据时,已建立好TCP链接,所以不需要指定地址,而UDP是面向无连接的,每次发送都需要指定发送给谁。
  • 服务器与客户端不能直接发送列表,元素,字典等带有数据类型的格式,发送的内容必须是字符串数据。

服务器端 Socket 函数

Socket 函数

描述

s.bind(address)

将套接字绑定到地址,在AF_INET下,以tuple(host, port)的方式传入,如s.bind((host, port))

s.listen(backlog)

开始监听TCP传入连接,backlog指定在拒绝链接前,操作系统可以挂起的最大连接数,该值最少为1,大部分应用程序设为5就够用了

s.accept()

接受TCP链接并返回(conn, address),其中conn是新的套接字对象,可以用来接收和发送数据,address是链接客户端的地址。

客户端 Socket 函数

Socket 函数

描述

s.connect(address)

链接到address处的套接字,一般address的格式为tuple(host, port),如果链接出错,则返回socket.error错误

s.connect_ex(address)

功能与s.connect(address)相同,但成功返回0,失败返回errno的值

公共 Socket 函数

Socket 函数

描述

s.recv(bufsize[, flag])

接受TCP套接字的数据,数据以字符串形式返回,buffsize指定要接受的最大数据量,flag提供有关消息的其他信息,通常可以忽略

s.send(string[, flag])

发送TCP数据,将字符串中的数据发送到链接的套接字,返回值是要发送的字节数量,该数量可能小于string的字节大小

s.sendall(string[, flag])

完整发送TCP数据,将字符串中的数据发送到链接的套接字,但在返回之前尝试发送所有数据。成功返回None,失败则抛出异常

s.recvfrom(bufsize[, flag])

接受UDP套接字的数据u,与recv()类似,但返回值是tuple(data, address)。其中data是包含接受数据的字符串,address是发送数据的套接字地址

s.sendto(string[, flag], address)

发送UDP数据,将数据发送到套接字,address形式为tuple(ipaddr, port),指定远程地址发送,返回值是发送的字节数

s.close()

关闭套接字

s.getpeername()

返回套接字的远程地址,返回值通常是一个tuple(ipaddr, port)

s.getsockname()

返回套接字自己的地址,返回值通常是一个tuple(ipaddr, port)

s.setsockopt(level, optname, value)

设置给定套接字选项的值

s.getsockopt(level, optname[, buflen])

返回套接字选项的值

s.settimeout(timeout)

设置套接字操作的超时时间,timeout是一个浮点数,单位是秒,值为None则表示永远不会超时。一般超时期应在刚创建套接字时设置,因为他们可能用于连接的操作,如s.connect()

s.gettimeout()

返回当前超时值,单位是秒,如果没有设置超时则返回None

s.fileno()

返回套接字的文件描述

s.setblocking(flag)

如果flag为0,则将套接字设置为非阻塞模式,否则将套接字设置为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。

s.makefile()

创建一个与该套接字相关的文件

Socket 编程思想

TCP 服务器 1、创建套接字,绑定套接字到本地IP与端口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind()

2、开始监听链接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s.listen()

3、进入循环,不断接受客户端的链接请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
While True:
    s.accept()

4、接收客户端传来的数据,并且发送给对方发送数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s.recv()
s.sendall()

5、传输完毕后,关闭套接字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s.close()

TCP 客户端 1、创建套接字并链接至远端地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect()

2、链接后发送数据和接收数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s.sendall()
s.recv()

3、传输完毕后,关闭套接字

Server端socket:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import socket
ip_port = ('127.0.0.1',8081)
BUFSIZE = 1024
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建套接字
s.bind(ip_port)#绑定地址
s.listen(5)#监听链接
print('server listening...')
while True: #无限等待连接
    conn,addr = s.accept() #接受客户端连接
    print(conn)
    print(addr)
    print('接到来自%s的链接'%addr[0])
    while True: #通信循环,无限接受客户端信息
        msg = conn.recv(BUFSIZE) #接受消息的内容
        if len(msg)==0:break  #如果 不加,已连接的客户端突然断开,recv不再阻塞,发生死循环
        print(msg.decode('utf8'),type(msg))
        conn.send(msg.upper())#服务端发送消息
    conn.close()#关闭链接
s.close()#关闭套接字

Client端:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import socket
ip_port=('127.0.0.1',8081)
BUFSIZE=1024
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect_ex(ip_port)#成功返回0,失败返回error的值
while True:#通讯循环,客户端可以无限发消息
    msg = input('>>:').strip()
    if len(msg)==0:continue
    s.send(msg.encode('utf8'))#发送消息,utf8格式
    feedback = s.recv(BUFSIZE)#接受服务端消息
    print(feedback.decode('utf8'))
s.close()

参考:林海峰博客:http://www.cnblogs.com/linhaifeng/articles/6129246.html#_label12 

网友博客:https://gist.github.com/kevinkindom/108ffd675cb9253f8f71

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
GitHub Actions 自动部署 Hexo 脚本
网上虽然有很多通过 GitHub Actions 自动部署 Hexo 的教程,但都有各种各样的问题。 主要问题还是 Workflow 脚本没有写正确,比如插件部分。
eallion
2022/12/20
5790
GitHub Actions 自动部署 Hexo 脚本
Github Actions 自动部署 Hexo - wuuconix's blog
昨天尝试了Cloudflare的pages功能,它可以识别一个vue工程文件,然后自动build,最后自动部署给你一个域名来访问,智能地令人害怕。
wuuconix
2023/01/30
3630
Github Actions 自动部署 Hexo - wuuconix's blog
使用 GitHub Actions 实现博客自动化部署
如果大家以前是用过静态博客,比如 Hugo、Hexo,可能配置过自动部署,也就是提交代码到源文件分支,自动生成静态文件提交到静态分支。静态博客的部署都是基于文件,目标只是一个 Git 仓库,一切都比较自然。那么如果是喜欢折腾,使用了动态博客呢?这里就涉及到服务器远程登录了。下面介绍一下我使用的方法。
岂不美哉Frost
2023/10/19
4000
使用 GitHub Actions 实现博客自动化部署
Github Actions自动化部署 hexo博客
利用 GitHub Actions 实现博客自动发布,将静态博客页面部署到多个服务器上,比如 GitHub Pages、Gitee pages 、云服务器上。本文介绍使用 GitHub Actions 实现将 Hexo 博客自动编译并发布到 GitHub Pages 上。
leader755
2022/03/09
9590
Github Actions自动化部署 hexo博客
利用GitHub+Actions自动部署Hexo博客
早就听闻GitHub+Actions真相,于是今天便试了下,作为小康博客的第二个平台。至于为什么要自动部署,我在另一篇文章介绍过了。
Dreamy.TZK
2020/04/09
2K2
使用github Action自动化部署next项目
之前用过Github的Webhooks做过自动部署,原理就是自己服务器上启动一个服务,对外暴露一个接口,每次代码push到github时,github服务器会调用你的接口,收到请求后再执行代码部署。
biaoblog.cn 个人博客
2022/08/11
7830
使用github Action自动化部署next项目
使用 rsync-deploy-action 同步 Hexo 博客到个人服务器
前几天写了个基于 rsync 进行文件同步的 Action -> rsync-deploy-action。目的有三个:
Cloud-Cloudys
2021/01/21
9750
Github Actions Hexo 自动部署
最近重装了电脑,近几年内每次重装也好,装备新电脑也好,越来越觉得维护博客是令我比较头疼的事
imba久期
2022/12/16
4720
Github Actions Hexo 自动部署
GitHub 代码实时同步 gitee 和 coding
GitHub 作为全世界最大的代码集中地,在上面,我们可以随意地下载或者参与各种著名开源项目和开源开发框架。
章鱼猫先生
2021/12/13
2.5K0
GitHub 代码实时同步 gitee 和 coding
使用 GitHub Actions 实现博客自动化部署
如果大家以前是用过静态博客,比如 Hugo、Hexo,可能配置过自动部署,也就是提交代码到源文件分支,自动生成静态文件提交到静态分支。静态博客的部署都是基于文件,目标只是一个 Git 仓库,一切都比较自然。那么如果是喜欢折腾,使用了动态博客呢?这里就涉及到服务器远程登录了。下面介绍一下我使用的方法。
用户4792657
2022/07/06
7080
使用 GitHub Actions 实现博客自动化部署
提交即部署 - Github Action 自动化部署
文章目录 实现效果 环境 步骤 生成公私钥 Github 配置 服务器配置 代码配置 查看日志 参考资料 实现效果 每次在本地开发测试完成后,push 到 Github 后即自动完成部署。 提高效率,自动化节省手动部署的重复性工作。 环境 本地环境:Mac OS 服务器环境:Ubuntu Server 步骤 生成公私钥。 Github 配置。 服务器配置。 代码配置。 查看日志。 畅快享受提交即部署。 生成公私钥 本地环境执行生成公私钥的指令。 ssh-keygen -m PEM -t rsa -b 4
星辉
2021/12/06
8100
提交即部署 - Github Action 自动化部署
利用GitHub 的Actions自动同步gitee仓库,并Gitee Pages 自动部署项目
GitHub 的Actions会处理.github下的工作流文件夹workflows。 只要在g项目根目录下创建 .github/workflows/ ,在这个文件夹里再创建Sync.yml文件,填入以下代码。 当产生push操作就会自动同步gitee
鳄鱼儿
2024/05/21
1300
5 分钟搭建一个简洁优雅的静态博客
一开始我遇到这个问题,总觉得自己弄个博客,太麻烦了,也不一定坚持写下去,直接在平台上写得了。于是 CSDN、简书、知乎上开始写。
somenzz
2021/02/08
1.3K0
使用Github Action自动同步仓库到Gitee
作为程序员出生的你,肯定知道备份的重要性。再说现在大环境背景下,美国的政治关系还是比较混乱的,而对于存放在Github上面的项目,也不再是技术自由的国度啦。所以说我们的代码还是有必要进行“双”备份的,接下来就是介绍下,如何使用Github上面的Action功能,将Github上面的代码同步备份到国内的Gitee仓库站点。
凡梦星尘
2024/11/20
1970
使用Github Action自动同步仓库到Gitee
GitHub Actions 真香系列之自动同步镜像仓库
但也有一个问题,自动同步是个问题,Gitee 有提供一个同步按钮,但是需要人工去手动单击一次才能同步,很不方便。
沈唁
2020/12/25
2.9K0
使用Github Action自动化部署
如果有写过项目的经历,就免不了将代码上传到服务器上,安装依赖,然后输入启动命令的步骤。但是有的项目往往需要经常性的改动,如果还是照着上面的方式进行部署的话。先不说这样操作的效率,操作个几次就想罢工了。并且上面这样操作的往往容易误操作。而 Github Actions 正是该问题的良药。
愧怍
2022/12/27
1.8K0
使用Github Action自动化部署
Hexo博客利用GitHub Action自动化部署
CI\CD 即:持续集成(Continuous Integration)、持续交付(Continuous Delivery)、持续部署(Continuous Deployment)。GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道,换句话说就是通过 Actions 帮助我们去执行 hexo s & hexo g & hexo d 的操作并推到 xxx.github.io 仓库中
777nx
2023/05/02
9420
Hexo博客利用GitHub Action自动化部署
博客自动化部署
是啊,为什么要写 Blog?毕竟这里没有人支付稿酬,也看不出有任何明显的物质性收益。 不管你选择那种博客,这本身也是一个学习过程。 ——​ 阮一峰
leader755
2022/03/09
5230
博客自动化部署
一篇教你代码同步 Github 和 Gitee
用 VuePress 搭建了博客并部署到 Github Pages,但由于 Github 的访问问题,我们可以选择把仓库部署到 Gitee 一份,利用 Gitee 的 Pages 服务再生成一份静态网站用于备用。
程序狗
2021/12/27
1.4K0
【玩转腾讯云】Github Actions+CVM实践(CICD如此简单)
简言之:它是github推出的持续集成部署的工具,目前优秀的cicd工具包括:travis ci,jenkins
醉酒鞭名马
2020/04/15
2.6K3
【玩转腾讯云】Github Actions+CVM实践(CICD如此简单)
推荐阅读
相关推荐
GitHub Actions 自动部署 Hexo 脚本
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档