Python socket模块
Socket(套接字) = IP地址:端口号,在网络层通过IP地址找到主机,在传输层通过端口号找到应用进程。每一个传输层连接唯一的被通信两端的两个套接字所确定。
python中,通过socket()函数创建套接字,socket()函数语法格式:
socket.socket([family[, type[, proto]]])
其中的参数:
family:套接字家族,可以使用 AF_UNIX 或者 AF_INET(IPv6用AF_INET6)等。
type:套接字类型,主要有(TCP) SOCK_STREAM、 (UDP)SOCK_DGRAM,还有一些其他类型。
proto:一般不填默认为 0。
例如,创建TCP套接字可写成:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
对象 | 描述 |
服务器端套接字 | |
s.bind() | 绑定address即(ip,port)到套接字,在AF_INET下,以元组(ip,port)形式表示地址。 |
s.listen() | 开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。 |
s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来。 |
客户端套接字 | |
s.connect() | 主动初始化TCP服务器连接,一般address的格式为(host,port),若连接出错,返回socket.error错误。 |
s.connect_ex() |
connect()的扩展版本,出错时返回错误码,而不是抛异常。 |
公共用途的套接字 | |
s.recv() |
接收TCP数据 |
s.send() | 发送TCP数据 |
s.sendall() | 完整发送TCP数据 |
s.recvfrom() |
接收UCP数据,与recv()类似,但返回值是(data,adderss)。 data包含接收数据的字符串, address是发送数据的套接字地址。 |
s.sendto() |
发送UCP数据,将数据发送到套接字,address是元组(host,port),指定远端地址。返回值是发送的字节数。 |
s.close() | 关闭套接字 |
s.getpeername() | 返回套接字的远程地址,返回值通常是一个元组(hostaddr,port)。 |
s.getsockname() | 返回套接字自己的地址,返回值通常是一个元组(hostaddr,port)。 |
s.setsockopt() | 设置给定套接字选项的值。 |
s.getsockopt() | 返回套接字选项的值。 |
s.settimeout() | 设置套接字操作的超时时间,timeout是一个浮点数,单位是秒。值为None则表示永远不会超时。一般超时期应在刚创建套接字时设置。 |
s.gettimeout() | 返回当前超时值,单位是秒,如果没有设置超时值则返回None。 |
s.fileno() | 返回套接字的文件描述。 |
s.setblocking(flag) | 如果flag为0,则将套接字设置为非阻塞模式,否则将套接字设置为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引发socket.error异常。 |
s.makefile() | 创建一个与该套接字相关的文件。 |
实现socket通信的流程:
服务器端tcp_server.py:
import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'
port = 8089
# 注意!bind()函数里参数是一个元组
s.bind((host, port))
s.listen(1)# 有客户端连接上来,返回一个新的socket和地址
c, addr = s.accept()
print('连接地址是:{}'.format(addr))
# 给连接上来的客户端发消息~
c.send(bytes('欢迎你啊~叶天才~~撒花✿✿ヽ(°▽°)ノ✿', 'utf-8'))# 打印收到客户端发来的消息
print(c.recv(1024).decode('utf-8'))
s.close()
服务器端先初始化socket,然后bind绑定指定端口来提供服务,以便客户端向指定端口发送请求,紧接着就是监听端口,等待客户端连接。
客户端tcp_client.py:
import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'
port = 8089
# 注意!这里connect()方法里参数也是个元组
s.connect((host, port))
b = s.recv(1024)# 打印收到服务器发来的消息
print(b.decode('utf-8'))# 给服务器发送消息,要发送的是字节序列
s.send(bytes('我连上来啦,哈哈哈哈哈哈哈嗝~', 'utf-8'))s.close()
客户端初始化socket,无需调用bind,一般由操作系统直接完成。发送请求前,操作系统为套接字随机分配一个可用的端口,同时将该套接字和本地地址信息绑定。
客户端发起connect连接,和服务器端的accept,共同完成tcp三次握手。
随后就可以进行数据通信,通信完毕后,close进行tcp四次挥手,结束通信。
先执行服务器端tcp_server.py,然后执行客户端tcp_client.py,最终执行结果
tcp_server.py打印:
连接地址是:('127.0.0.1', 49672)
我连上来啦,哈哈哈哈哈哈哈嗝~
tcp_client.py打印:
欢迎你啊~叶天才~~撒花✿✿ヽ(°▽°)ノ✿
创建socket和关闭socket这两步可以简化为:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
with语句会自动帮我们调用close方法关闭socket。
参考:
Socket通信原理_ziyonghong的博客-CSDN博客_socket通信原理
Python socket模块相关推荐
- python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例
Python基于socket模块实现UDP通信功能示例 本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import sock ...
- python socket模块作用_python之socket模块详解--小白博客
主要是创建一个服务端,在创建服务端的时候,主要步骤如下: 创建socket对象socket-->绑定IP地址和端口bind-->监听listen-->得到请求accept--> ...
- python socket模块[errno 113_error:
一 问题出现背景supervisorctl update error: , [Errno 113] No route to host: file: /usr/lib64/python2.7/socke ...
- python - socket模块1
1.使用生活中的接打电话,解释socket通信流程 2.根据上图,写出socket通信的伪代码 2.1.server端伪代码 #买手机 #买手机卡 #开机 #等待电话 #收消息 #发消息 #挂电话 2 ...
- python socket模块 和pyqt_使用PyQt和Socket进行聊天编程[标准库]
我编写了一个程序,在客户端部分经常出现错误,我认为错误来自于client.py中的socket函数.我该怎么办? 服务器.py:# This is my server code , this code ...
- python socket模块recv函数_python socket 函数 模块
欢迎指正和留言讨论哦 import socket socket()函数 1,语法格式 socket.socket([family[, type[, proto]]]) family: 套接字家族可以使 ...
- python的socket模块_Python socket模块方法实现详解
这篇文章主要介绍了python socket模块方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 socket ssh (不带防止粘包的方 ...
- python转换函数使用_Python Socket模块中的IP转换函数
Python Socket模块中包含一些有用IP转换函数,说明如下: socket.ntohl(x) // 类似于C语言的ntohl(x) 把32位正整数从网络序转换成主机字节序. socket.nt ...
- python共享内存通信mapofview_python map eval strPython socket模块实现的udp通信功能示例...
本文实例讲述了Python socket模块实现的udp通信功能.分享给大家供大家参考,具体如下: socket介绍 socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要 ...
最新文章
- 【Visual C++】一些开发心得与调试技巧
- C++ priority_queue用法
- 利用脚本批量添加域用户账户
- mysql 存储过程 查询结果 循环_在存储过程中从查询结果集中怎么循环
- 在中断程序里修改全局变量的童鞋注意啦~(C中的volatile作用 转载~)
- 我们可以用SharePoint做什么
- .htaccess更改目录下的默认主页
- stm32f10x系列.s汇编启动文件
- 小程序的开发框架MINA及小程序的启动机制
- Softmax 回归 + 损失函数 + 图片分类数据集 动手学深度学习v2 pytorch
- mysql修改数据sql语句_sql语句修改数据
- 遗传算法工具箱_含约束条件的遗传算法在连续催化重整优化操作中的应用
- 用TreeWalk提高网速及其在vista中的安装方法
- LabVIEW编程LabVIEW控制研华PCI-1739U例程与相关资料
- 【从零搭建后端基础设施系列(九)】-- VM容器化
- shallot夏洛特
- python变成exe1023无标题_GitHub - Qing1023/Python-100-Days: Python - 100天从新手到大师
- linux内存管理笔记(三十九)----kswapd内存回收
- .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法
- 小程序使用post请求遇到的问题
热门文章
- 【论文阅读】Dimensionality Reduction by Learning an Invariant Mapping
- mysql iops 测试_MySQL数据库入门:FIO测试磁盘IOPS
- 服务器系统可以使用软件吗,云服务器可以运行软件吗
- 使用 Echarts 插件实现柱状图功能
- 分布交互式CosiMate 8.1 2016.04多学科协同仿真计算平台
- openwrt修改lan口地址失败_openwrt里怎么wan口改成lan口来用?
- 《道德经》第五十二章
- 好消息【EPLAN知识星球】学习平台正式上线投入使用啦
- STM32F1定时器(TIM1~TIM8)
- 单片机无线模块编码和解码c语言,单片机编码 无线模块发送与接收 程序