Python Socket Programming
本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在Python 3.4下。
Python的socket功能封装在socket库中,要使用socket,记得先import socket
,socket库的详细介绍参见官方文档。
创建Socket
首先创建一个socket,使用socket库中得socket函数创建。
import socket# create an INET, STREAM socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
例子中创建了一个TCP socket,socket.socket
函数的前两个参数的默认值是socket.AF_INET
和socket.SOCK_STREAM
,创建TCP socket时可以直接写成socket.socket()
。
连接服务器
使用socket的connect
函数连接到服务器,以下几种参数都是合法的。
s.connect(('localhost', 8000))
s.connect(('127.0.0.1', 8000))
s.connect(('www.baidu.com', 80))
发送数据
发送数据有两个方法send和sendall,send
不能保证所有的数据都发送完了,它会返回已发送数据的长度,程序要循环发送数据直到所有数据都已发送完毕。
def mysend(s, msg):total_len = len(msg)total_sent = 0while total_sent < total_len:sent = s.send(msg[total_sent:])if sent == 0:raise RuntimeError("socket connection broken")total_sent += sent
sendall
能够保证所有的数据都已发送完毕,除非发送过程中出现了错误,它实际上也是循环发送数据直到所有数据发送完成。
这里还要讲一个需要特别注意的地方,从一个例子开始吧:
import socket
s = socket.socket()
s.connect(('www.baidu.com', 80))
s.sendall('test')
都是上面讲过的东西,没什么特别的,分别在Python 2和Python 3中执行以上的代码,结果是:
# Python 2.7
>>> import socket
>>> s = socket.socket()
>>> s.connect(('www.baidu.com', 80))
>>> s.sendall('test')
Python 2中执行成功。
# Python 3.4
>>> import socket
>>> s = socket.socket()
>>> s.connect(('www.baidu.com', 80))
>>> s.sendall('test')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface
Python 3中却发生了异常。
同样的代码换个环境却不能执行了,我没有写错呀,怒砸电脑。好吧,你确实没写错,是环境变了,导致这个结果的变化请移步官方的说明。
接收数据
使用recv
函数接收数据:
data = s.recv(4096)
在Python 3中返回的是bytes对象,在Python 2中返回的是string。注意函数返回的数据长度是小于或者等于参数指定的长度的,要接收到指定长度的数据,需要循环接收数据。
def myreceive(s, msglen):chunks = []bytes_recd = 0while bytes_recd < msglen:chunk = s.recv(min(msglen - bytes_recd, 2048))if chunk == b'':raise RuntimeError("socket connection broken")chunks.append(chunk)bytes_recd = bytes_recd + len(chunk)return b''.join(chunks)
关闭连接
当连接不再需要时可以使用close
关闭socket连接,关闭后的连接不能再进行任何操作。当一个socket被回收时会自动关闭,但是不要依赖这种机制,不需要socket时就主动的close。
服务端
服务端程序执行的步骤:
- 创建服务端socket
- 将服务端socket绑定到指定的地址和端口
- 监听连接
- 接受客户端连接
- 处理客户端的数据
- 关闭客户端连接
一个简单的echo server示例:
import socketHOST = ''
PORT = 10022s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
conn, addr = s.accept()
while True:data = conn.recv(1024)if not data:breakconn.sendall(data)
conn.close()
客户端程序:
import socketHOST = 'localhost'
PORT = 10022s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'hello socket')
data = s.recv(1024)
print('Received', repr(data))
s.close()
错误处理
socket处理过程中发生错误会抛出异常,socket相关的异常有:
- socket.error
- socket.herror
- socket.gaierror
- socket.timeout
import socketHOST = None
PORT = 10022try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind((HOST, PORT))s.listen(10)
except: socket.error as msg:print(msg)
参考资料
- Socket Programming HOWTO
- Porting Python 2 Code to Python 3
转载于:https://www.cnblogs.com/wang286217157/p/4319426.html
Python Socket Programming相关推荐
- Python socket – network programming tutorial
原文: https://www.binarytides.com/python-socket-programming-tutorial/ -------------------------------- ...
- Python Socket TypeError: a bytes-like object is required, not 'str' 错误提示
<python核心编程>第三版,发现示例2-1代码返回错误-..纠结很久 发现这里python3.5和Python2.7在套接字返回值解码上有区别. 先介绍一下 python byte ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- UDP socket programming in php
2019独角兽企业重金招聘Python工程师标准>>> http://www.binarytides.com/udp-socket-programming-in-php/ UDP s ...
- python network programming tutorial
关于网络编程以及socket 等一些概念和函数介绍就不再重复了,这里示例性用python 编写客户端和服务器端. 一.最简单的客户端流程: 1. Create a socket 2. Connect ...
- [Python_7] Python Socket 编程
0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*-"&qu ...
- Python Socket请求网站获取数据
Python Socket请求网站获取数据 ---阻塞 I/O ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...
- python udp 直播_[Python] socket发送UDP广播实现聊天室功能
原博文 2018-11-24 12:33 − 一.说明 本文主要使用socket.socket发送UDP广播来实现聊天室功能. 重点难点:理解UDP通讯流程.多线程.UDP广播收发等. 测试环境:Wi ...
- linux c socket programming
http://54min.com/post/http-client-examples-using-c.html 好文章 PPT http://www.slideshare.net/Arbow/asyn ...
最新文章
- pytorch adam 源码 关于优化函数的调整 optimizer 调参 重点
- 生物什么时候学公式计算机,高考生物重要规律性关系及公式精华归纳,转走吧!...
- [转]C++ 使用Makefile文件
- 【NLP】GitHub 上有哪些有趣的关于 NLP 的Python项目?
- python csv文件参数化_Python 读取csv文件的某一列数据,并定义两个pattern,确定变化区间...
- zookeeper+kafka配置
- centos7 修改为任意网卡名_centos7首次启动需要配置的内容
- javascript 代码_如何使您JavaScript代码简单易读
- Maven : invalid item Maven: xxx in the dependencies
- 顺序容器和关联容器添加新元素方法详解
- linux看门狗机制
- linux sendto函数,sendto - Linux C 函数 使用手册
- 英语语法 - the + 形容词 的意义
- 添加rviz插件解决gaol3dtool插件缺失问题
- 买iPhone担心买到翻新机?教你一招,轻松鉴别各个版本
- composer php中如何执行,composer怎么运行
- Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件(学习笔记)
- 期货什么是涨跌(期货是看涨还是看跌)
- 备份 mysql 数据库
- 【H5】html5的新增的标签和废除的标签
热门文章
- java 文件分隔符_Java文件分隔符
- mysql查询后10条数据类型_30多条mysql数据库优化方法,千万级数据库记录查询轻松解决...
- C语言程序设计代码树,校门外的树 (C语言代码)
- 如何通过HBuilderX运行微信小程序,启动Enable IDE Service,X initialize 解决方案
- linux 音频路径,Linux系统中提取DVD音频的方法介绍(转)
- 计算机组成原理整数乘法,计算机组成原理 - 定点整数的原码补码运算(待验证)...
- android 正则表达式3,含有至少3个字符类型的android正则表达式
- python diango 并发_利用gunicorn提高django的并发能力
- 怎么将一个十进制数转化为二进制数并打印出来
- Bullmind在线读书笔记软件