最基础的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 相关文章推荐
一则python3的简单爬虫代码
May 26 Python
Python基础之getpass模块详细介绍
Aug 10 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
python3 判断列表是一个空列表的方法
May 04 Python
Python Django 前后端分离 API的方法
Aug 28 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
Mar 07 Python
Matplotlib使用Cursor实现UI定位的示例代码
Mar 12 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
Mar 27 Python
Python3-异步进程回调函数(callback())介绍
May 02 Python
Python定时任务框架APScheduler原理及常用代码
Oct 05 Python
Python列表的索引与切片
Apr 07 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
消息持续发送的完整例子
2006/10/09 PHP
利用PHP实现与ASP Banner组件相似的类
2006/10/09 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
JS Loading功能的简单实现
2013/11/29 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
2014/03/19 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
浅谈js中的bind
2019/03/18 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
对Python3之方法的覆盖与super函数详解
2019/06/26 Python
python实现函数极小值
2019/07/10 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
借款担保书范文
2014/05/13 职场文书
客运企业隐患排查工作方案
2014/06/06 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
MYSQL 运算符总结
2021/11/11 MySQL