最基础的Python的socket编程入门教程
本文介绍使用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 "", line 1, in
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的socket编程入门教程的更多相关文章
- 转:Python 的 Socket 编程教程
这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...
- 国内第一本micropython的书出版《机器人Python极客编程入门与实战》
第一本micropython的书<机器人Python极客编程入门与实战>. 购买地址:https://item.taobao.com/item.htm?spm=2013.1.w4018-1 ...
- python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学
首发于:python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=431 本文 ...
- 初识Django —Python API接口编程入门
初识Django —Python API接口编程入门 一.WEB架构的简单介绍 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成.我们的目标是用Python语言, ...
- Python 3 socket 编程
Python 3 socket编程 一 客户端/服务器架构 互联网中处处是C/S架构 1.C/S结构,即Client/Server(客户端/服务器)结构 2.在互联网中处处可见c/s架构 比如说浏览器 ...
- python之socket编程(一)
socket之前我们先来熟悉回忆几个知识点. OSI七层模型 OSI(Open System Interconnection)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标 ...
- Python可视化界面编程入门
Python可视化界面编程入门具体实现代码如所示: (1)普通可视化界面编程代码入门: import sysfrom PyQt5.QtWidgets import QWidget,QApplicati ...
- Python:socket编程教程
ocket是基于C/S架构的,也就是说进行socket网络编程,通常需要编写两个py文件,一个服务端,一个客户端. 首先,导入Python中的socket模块: import socket Pytho ...
- Python 数据处理库 pandas 入门教程
Python 数据处理库 pandas 入门教程2018/04/17 · 工具与框架 · Pandas, Python 原文出处: 强波的技术博客 pandas是一个Python语言的软件包,在我们使 ...
随机推荐
- Mac上django 报错 [Errno 13] Permission denied: '/static'
将setting文件中的 改成:
- [CSS] Create a Card Flip Animation with CSS
Animation can be a powerful way to enhance a user experience. In this lesson, we'll walk through the ...
- 备份docker运行的gitlab
#!/bin/bash data=$(date "+%Y-%m-%d %H:%M:%S") gitBak='/data/gitlab/data/backups' delFile=` ...
- IDEA设置提示生成序列化ID
背景: 实现Serializable接口的类,没有提示生成序列化ID 解决问题: 1.FIle->Settings->Editor->inspections 2.点击java-> ...
- UVA 11468 Substring (记忆化搜索 + AC自动鸡)
传送门 题意: 给你K个模式串, 然后,再给你 n 个字符, 和它们出现的概率 p[ i ], 模式串肯定由给定的字符组成. 且所有字符,要么是数字,要么是大小写字母. 问你生成一个长度为L的串,不包 ...
- luogu P1058 立体图
做了这个题后明确了自己的定位... 恩...普及- 题目大意估计都知道.. 给个传送门: luogu 做了半上午 + 一整个下午的题... 占了我今天到的绝大多数时间. 其实此题不难, 核心代码我 ...
- AtCoder Grand Contest 012题解
传送门 \(A\) 肯定是后面每两个陪最前面一个最优 typedef long long ll; const int N=5e5+5; int a[N],n;ll res; int main(){ s ...
- 在Modelsim中使用dsp 48e进行仿真
在Modelsim中使用DSP 48E仿真时,需要用到glbl模块,它的调用方法如下所示: vlog -incr GND.v VCC.v FDRE.v DSP48E.vvlog -incr glbl. ...
- git图形化统计工具 - windows下gitstats的安装和使用
gitstats 是一款git历史统计工具,可以生成定量的统计数据,并以html图表的形式展示.统计文件包括文件数量.代码量.提交量.作者信息.每天活跃度.每周活跃度.每月活跃度以及提交数排名等等,信 ...
- Prometheus初体验(三)
一.安装部署 Prometheus基于Golang编写,编译后的软件包,不依赖于任何的第三方依赖.用户只需要下载对应平台的二进制包,解压并且添加基本的配置即可正常启动Prometheus Server ...