本文介绍使用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_INETsocket.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 = 0while 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 = 0while 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
  2. 将服务端socket绑定到指定的地址和端口
  3. 监听连接
  4. 接受客户端连接
  5. 处理客户端的数据
  6. 关闭客户端连接

一个简单的echo server示例:

import socketHOST = ''
PORT = 10022s = 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:breakconn.sendall(data)
conn.close()

客户端程序:

import socketHOST = 'localhost'
PORT = 10022s = 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 socketHOST = None
PORT = 10022try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind((HOST, PORT))s.listen(10)
except: socket.error as msg:print(msg)

参考资料

  • Socket Programming HOWTO
  • Porting Python 2 Code to Python 3

转载于:https://www.cnblogs.com/wang286217157/p/4319426.html

Python Socket Programming相关推荐

  1. Python socket – network programming tutorial

    原文: https://www.binarytides.com/python-socket-programming-tutorial/ -------------------------------- ...

  2. Python Socket TypeError: a bytes-like object is required, not 'str' 错误提示

    <python核心编程>第三版,发现示例2-1代码返回错误-..纠结很久  发现这里python3.5和Python2.7在套接字返回值解码上有区别.  先介绍一下 python byte ...

  3. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  4. UDP socket programming in php

    2019独角兽企业重金招聘Python工程师标准>>> http://www.binarytides.com/udp-socket-programming-in-php/ UDP s ...

  5. python network programming tutorial

    关于网络编程以及socket 等一些概念和函数介绍就不再重复了,这里示例性用python 编写客户端和服务器端. 一.最简单的客户端流程: 1. Create a socket 2. Connect ...

  6. [Python_7] Python Socket 编程

    0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*-"&qu ...

  7. Python Socket请求网站获取数据

     Python Socket请求网站获取数据 ---阻塞 I/O     ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...

  8. python udp 直播_[Python] socket发送UDP广播实现聊天室功能

    原博文 2018-11-24 12:33 − 一.说明 本文主要使用socket.socket发送UDP广播来实现聊天室功能. 重点难点:理解UDP通讯流程.多线程.UDP广播收发等. 测试环境:Wi ...

  9. linux c socket programming

    http://54min.com/post/http-client-examples-using-c.html 好文章 PPT http://www.slideshare.net/Arbow/asyn ...

最新文章

  1. pytorch adam 源码 关于优化函数的调整 optimizer 调参 重点
  2. 生物什么时候学公式计算机,高考生物重要规律性关系及公式精华归纳,转走吧!...
  3. [转]C++ 使用Makefile文件
  4. 【NLP】GitHub 上有哪些有趣的关于 NLP 的Python项目?
  5. python csv文件参数化_Python 读取csv文件的某一列数据,并定义两个pattern,确定变化区间...
  6. zookeeper+kafka配置
  7. centos7 修改为任意网卡名_centos7首次启动需要配置的内容
  8. javascript 代码_如何使您JavaScript代码简单易读
  9. Maven : invalid item Maven: xxx in the dependencies
  10. 顺序容器和关联容器添加新元素方法详解
  11. linux看门狗机制
  12. linux sendto函数,sendto - Linux C 函数 使用手册
  13. 英语语法 - the + 形容词 的意义
  14. 添加rviz插件解决gaol3dtool插件缺失问题
  15. 买iPhone担心买到翻新机?教你一招,轻松鉴别各个版本
  16. composer php中如何执行,composer怎么运行
  17. Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件(学习笔记)
  18. 期货什么是涨跌(期货是看涨还是看跌)
  19. 备份 mysql 数据库
  20. 【H5】html5的新增的标签和废除的标签

热门文章

  1. java 文件分隔符_Java文件分隔符
  2. mysql查询后10条数据类型_30多条mysql数据库优化方法,千万级数据库记录查询轻松解决...
  3. C语言程序设计代码树,校门外的树 (C语言代码)
  4. 如何通过HBuilderX运行微信小程序,启动Enable IDE Service,X initialize 解决方案
  5. linux 音频路径,Linux系统中提取DVD音频的方法介绍(转)
  6. 计算机组成原理整数乘法,计算机组成原理 - 定点整数的原码补码运算(待验证)...
  7. android 正则表达式3,含有至少3个字符类型的android正则表达式
  8. python diango 并发_利用gunicorn提高django的并发能力
  9. 怎么将一个十进制数转化为二进制数并打印出来
  10. Bullmind在线读书笔记软件