最基础的Python的socket编程入门教程

作者:愚安 时间:2022-10-13 03:38:46 

本文介绍使用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
0
投稿

猜你喜欢

  • 利用python清除移动硬盘中的临时文件

    2022-12-07 21:43:11
  • python使用pgzero进行游戏开发

    2022-10-28 11:32:35
  • python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例

    2021-01-04 21:56:00
  • MySQL中使用MD5加密的实现

    2024-01-15 14:11:38
  • 基于PHP实现用户登录注册功能的详细教程

    2024-04-30 08:50:27
  • Python matplotlib读取excel数据并用for循环画多个子图subplot操作

    2021-03-28 19:17:31
  • 在ASP.NET 2.0中操作数据之六十八:为DataTable添加额外的列

    2024-05-09 09:03:27
  • Python用list或dict字段模式读取文件的方法

    2022-07-16 18:29:07
  • oracle 常见等待事件及处理方法

    2009-04-24 12:01:00
  • php上传大文件设置方法

    2023-11-21 19:11:22
  • 详解python编程slice与indices函数用法示例

    2021-03-23 05:13:22
  • 像聪明女孩穿衣服那样设计网页文字

    2007-11-06 16:45:00
  • python基于watchdog库全自动化监控目录文件

    2022-04-21 19:17:47
  • 详解Python中如何写控制台进度条的整理

    2023-12-31 03:32:51
  • 简单的Python解密rsa案例

    2022-05-28 07:30:18
  • python自动zip压缩目录的方法

    2021-01-15 12:39:41
  • 科讯商业版中用到的ajax空间与分页函数

    2024-04-17 10:05:45
  • opencv实现矿石图片检测矿石数量

    2021-08-26 02:17:39
  • php之app消息推送案例教程

    2023-06-15 00:42:02
  • Flask框架工厂函数用法实例分析

    2023-03-08 08:14:30
  • asp之家 网络编程 m.aspxhome.com