最基础的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实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 Python
用Python实现协同过滤的教程
Apr 08 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
python应用文件读取与登录注册功能
Sep 23 Python
Python使用selenium + headless chrome获取网页内容的方法示例
Oct 16 Python
Tensorflow不支持AVX2指令集的解决方法
Feb 03 Python
django2.2 和 PyMySQL版本兼容问题
Feb 17 Python
jupyter notebook 增加kernel教程
Apr 10 Python
JAVA SWT事件四种写法实例解析
Jun 05 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
Python文件操作及内置函数flush原理解析
Oct 13 Python
python如何发送带有附件、正文为HTML的邮件
Feb 27 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编写的导航条程序
2006/10/09 PHP
PHP中使用curl入门教程
2015/07/02 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
JTrackBar水平拖动效果
2007/07/15 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
Python文档生成工具pydoc使用介绍
2015/06/02 Python
Python使用matplotlib填充图形指定区域代码示例
2018/01/16 Python
python实现简易版计算器
2020/06/22 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
selenium 安装与chromedriver安装的方法步骤
2019/06/12 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
浅析Python 条件控制语句
2020/07/15 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
高二物理教学反思
2014/02/08 职场文书
升职演讲稿范文
2014/05/23 职场文书
班级心理活动总结
2014/07/04 职场文书
关键在于落实心得体会
2014/09/03 职场文书
法定授权委托证明书
2014/09/27 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
anaconda python3.8安装后降级
2021/06/11 Python
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏