最基础的Python的socket编程入门教程


Posted in Python onApril 23, 2015

本文介绍使用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 = 0
  while 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 = 0
  while 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。
服务端

服务端程序执行的步骤:
1. 创建服务端socket
1. 将服务端socket绑定到指定的地址和端口
1. 监听连接
1. 接受客户端连接
1. 处理客户端的数据
1. 关闭客户端连接

一个简单的echo server示例:

import socket

HOST = ''
PORT = 10022

s = 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:
    break
  conn.sendall(data)
conn.close()

客户端程序:

import socket

HOST = 'localhost'
PORT = 10022

s = 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 socket

HOST = None
PORT = 10022

try:
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.bind((HOST, PORT))
  s.listen(10)
except: socket.error as msg:
  print(msg)
Python 相关文章推荐
python实现代码行数统计示例分享
Feb 10 Python
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
理解Python中的绝对路径和相对路径
Aug 30 Python
使用TensorFlow实现简单线性回归模型
Jul 19 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
Jul 28 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
python基于plotly实现画饼状图代码实例
Dec 16 Python
Keras搭建自编码器操作
Jul 03 Python
Python编写nmap扫描工具
Jul 21 Python
详解pytorch创建tensor函数
Mar 22 Python
利用Python实现简单的相似图片搜索的教程
Apr 23 #Python
以911新闻为例演示Python实现数据可视化的教程
Apr 23 #Python
Python中优化NumPy包使用性能的教程
Apr 23 #Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 #Python
用Python给文本创立向量空间模型的教程
Apr 23 #Python
用Python进行行为驱动开发的入门教程
Apr 23 #Python
python正常时间和unix时间戳相互转换的方法
Apr 23 #Python
You might like
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
php面象对象数据库操作类实例
2014/12/02 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
JavaScript实现多种排序算法
2016/02/24 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
2020/05/10 Javascript
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
心理学专业毕业生推荐信范文
2013/11/21 职场文书
关于打架的检讨书
2014/01/17 职场文书
2014年党课学习材料
2014/05/11 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
利用python做表格数据处理
2021/04/13 Python
Go Plugins插件的实现方式
2021/08/07 Golang