最基础的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.3使用tkinter开发猜数字游戏示例
Mar 14 Python
提升Python程序运行效率的6个方法
Mar 31 Python
python实现带错误处理功能的远程文件读取方法
Apr 29 Python
python实现自动更换ip的方法
May 05 Python
举例讲解Python编程中对线程锁的使用
Jul 12 Python
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 Python
python实现媒体播放器功能
Feb 11 Python
python3+PyQt5实现柱状图
Apr 24 Python
Python3+Appium安装使用教程
Jul 05 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
Pytorch实现LSTM和GRU示例
Jan 14 Python
Python文件读写w+和r+区别解析
Mar 26 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
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
Javascript开发包大全整理
2006/12/22 Javascript
js中 关于undefined和null的区别介绍
2013/04/16 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
2016/05/16 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
python中执行shell命令的几个方法小结
2014/09/18 Python
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
python生成大写32位uuid代码
2020/03/03 Python
实习生体会的自我评价范文
2013/11/28 职场文书
社团活动策划书范文
2014/01/09 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
农村党员一句话承诺
2014/05/30 职场文书
邀请函范文
2015/02/02 职场文书
预备党员党支部意见
2015/06/02 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
python办公自动化之excel的操作
2021/05/23 Python
如何有效防止sql注入的方法
2021/05/25 SQL Server