最基础的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遍历文件夹并删除特定格式文件的示例
Mar 05 Python
Python中使用装饰器时需要注意的一些问题
May 11 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
python连接数据库的方法
Oct 19 Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
linux查找当前python解释器的位置方法
Feb 20 Python
用python爬取历史天气数据的方法示例
Dec 30 Python
python shell命令行中import多层目录下的模块操作
Mar 09 Python
Python直接赋值及深浅拷贝原理详解
Sep 05 Python
使用Python绘制台风轨迹图的示例代码
Sep 21 Python
基于Python的接口自动化读写excel文件的方法
Jan 15 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采集类Snoopy抓取图片实例
2014/06/19 PHP
joomla数据库操作示例代码
2016/01/06 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
axios学习教程全攻略
2017/03/26 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
Electron vue的使用教程图文详解
2019/07/05 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
python3图片转换二进制存入mysql
2013/12/06 Python
Python自动生产表情包
2017/03/17 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
django 多数据库配置教程
2018/05/30 Python
Flask之flask-script模块使用
2018/07/26 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
Python数据结构与算法(几种排序)小结
2019/06/22 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
毕业生自荐书
2013/12/18 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
教师个人事迹材料
2014/12/17 职场文书
个人学习总结范文
2015/02/15 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
销售合作意向书范本
2015/05/08 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
一文搞懂MySQL索引页结构
2022/02/28 MySQL