Python Socket编程:工作流程、示例代码及相关基础知识
目录展示了 Python Socket 编程的工作流程,还有 Python 客户端与服务器的通信示例代码,最后进行了快速总结,即 Python Socket 编程总结。

在今天的教程里,我们会介绍关于 Python 基础知识的 Python 的 socket 编程。Python 的 socket 接口和 C 以及 Java 是类似的。所以,如果您具备 C 或 Java 的编程背景,那么在 Python 中学习 socket 编程就会容易很多。
在 Python 中使用 socket 较为简单,这使得快速的应用程序开发得以鼓励。因此,不应担忧 Python 是否是你的第一门编程语言,而应感到幸运。
Python 提供了两类 API 库,能够用于 socket 编程。在底层方面,Python 借助“socket”library 来为无连接以及面向连接的网络协议构建客户端和服务器模块。在更高的级别上,你可以运用 ftplib 和 httplib 等库去与应用程序级别的网络协议(例如 FTP 和 HTTP)进行交互。
我们将在这篇文章里讨论专门为 Python socket 编程而设计且被广泛使用的“socket”库。我们会介绍这个库所提供的主要功能,这些功能能够帮助您构建客户端和服务器模块。最后,您可以通过示例代码看到客户端与服务器通信的演示。
socket 是学习 Python socket 编程必须要了解的关键且基础的实体。在本节里,我们阐述了 socket 的概念,还介绍了创建 socket 以及与它进行通信的相关办法。
Python Socket 编程简述
什么是socket?
socket 是一种双向通信的链路端点。这个端点由 IP 地址和端口号组合而成。
对于 Client-Server 通信,需要在一端配置 socket 以发起连接,同时在另一端配置 socket 来监听传入的消息。接着,在一端发送响应,而在另一端也发送响应,以此建立双向通信。
socket 甚至能够让跨越不同大陆的进程进行通信。
如何在 Python 中创建 socket 对象?
创建/初始化 socket 时,我们会用到 socket.socket()方法。这个方法在 Python 的 socket 模块里是有定义的。它的语法情况如下。
创建一个 socket 对象,该对象的家族为 socket_family,类型为 socket_type,协议参数 protocol 被设置为 0,即 sock_obj = socket.socket(socket_family, socket_type, protocol=0) 。
在哪里,
socket_type 用于定义两个端点之间的通信类型,它可以具备以下这些值。协议方面,我们通常会保留该字段或者将该字段设置为零。
import socket#for sockets
创建一个 AF_INET 类型的、STREAM 模式的(TCP)套接字。
创建一个名为 sock_obj 的套接字对象,该套接字使用 IPv4 地址族(socket.AF_INET)和 TCP 流协议(socket.SOCK_STREAM)。
print ('Socket Initialized')
这是创建套接字对象的方式。然而,倘若上述例子无法将套接字实例化,那该怎么办呢?您又将怎样去解决这个错误呢?
您需要把上述代码放置在 Python 的 try 块和 except 块之内。利用 Python 的异常处理机制,您能够对错误的缘由进行追踪。
#管理python套接字编程中的错误
import socket#for sockets
import sys #for exit
try:
创建一个套接字,其地址族为 AF_INET,类型为 STREAM(即 TCP 类型)。
创建一个套接字对象 sock_obj,该套接字使用 IPv4 地址族(socket.AF_INET)和 TCP 流协议(socket.SOCK_STREAM)。
如果不是 socket.error 导致的错误,就会执行后续代码;如果是 socket.error 导致的错误,会将错误信息存储在 err_msg 中。
打印(“无法实例化套接字。错误代码:” + 字符串(err_msg[0]) + “,错误消息:” + err_msg[1])
sys.exit();
print ('Socket Initialized')
我们将在接下来的部分解释 Socket 库中那些可用于创建客户端/服务器程序的函数。
Python 的套接字库中有多少种可用的套接字方法?
用于 Python 套接字编程的套接字方法可以被我们分为以下三类。
服务器套接字可用的方法有哪些?
服务器套接字方法
sock_object 进行监听(积压);sock_object 进行接受:客户端套接字具备哪些可用的方法?
客户端套接字方法
Python中可用的通用套接字方法有哪些?
通用套接字方法
sock_object 进行发送操作;sock_object 进行接收并获取发送方地址的操作;sock_object 进行发送到指定地址的操作;sock_object 获取主机名的操作;sock_object 关闭连接的操作。
我们目前已经列出了“socket”库为 Python 套接字编程所提供的所有套接字工具。接着,我们要给您展示实现客户端 - 服务器通信的套接字函数调用的工作流程。请参考以下快照,它阐述了在客户端与服务器之间建立通道所需的每个套接字调用。
Python Socket 编程工作流程
下图描述了客户端和服务器端点的套接字方法的调用顺序。
从上面的流程图中,您可以了解到在 Python 中创建客户端/服务器套接字程序所需要的所有套接字方法。现在,是开始设置真正的 Python 客户端和服务器组件的时候了。
Python 客户端-服务器通信示例代码
客户端-服务器程序将具有以下两个 Python 模块。
检查一下服务器代码。要注意的是,此代码已经在 Python 3 上进行过测试。
Python-Server.py
该服务器模块将向/从客户端发送和接收数据。
Python-Server.py 文件包含一些代码,这些代码用于创建服务器套接字。这个套接字会一直处于等待状态,直到收到来自客户端的请求。
每当客户端连接时,服务器都会接受该连接。
在下面的代码里,我们要求用户去输入他期望传递给客户端的那个响应。
import socket
import time
def Main():
host = "127.0.0.1"
port = 5001
mySocket = socket.socket()
mySocket.bind((host,port))
mySocket.listen(1)
mySocket 接收连接并返回连接对象 conn 和地址 addr 。
打印("来自: " + str(addr))
while True:
使用 conn 接收了 1024 字节的数据,然后对其进行解码操作。
if not data:
break
打印(“来自已连接用户:” + 数据的字符串表示形式)
data = str(data).upper()
打印("从用户接收: " + str(data))
data = input(" ? ")
conn.send(data.encode())
conn.close()
if __name__ == '__main__':
Main()
Python-Client.py
在客户端,我们创建一个套接字。接着,使用提供的主机和端口值来连接到服务器。
import socket
def Main():
host = '127.0.0.1'
port = 5001
mySocket = socket.socket()
mySocket.connect((host,port))
message = input(" ? ")
while message != 'q':
mySocket 发送了 message 进行编码后的内容。
mySocket 接收了 1024 字节的数据并进行解码,解码后的数据赋值给了 data
打印(“从服务器接收:” + 数据)
message = input(" ? ")
mySocket.close()
if __name__ == '__main__':
Main()
如何运行客户端-服务器程序?
您需要通过单独的命令窗口来运行这两个模块。您也可以在两个不同的 IDLE 实例中运行它们。
您将先执行服务器模块,接着执行客户端。我们已经给出了关于客户端 - 服务器程序的完整执行情况概述。
Python 3.5.1 ,其版本号为 v3.5.1 ,于 2015 年 12 月 6 日生成 ,时间是 01:54:25 ,使用的是 MSC v.1900 64 位(AMD64)编译器 ,运行在 win32 系统上
输入“copyright”或者“credits”或者“license()”以获取更多信息。
重新启动:C:\Users\Techbeamers\AppData\Local\Programs\Python\Python35\Python-Server.py
有一个连接来自于 ('127.0.0.1', 50001)
? Hello Dear Reader
非常感谢。这就是激励我们的东西。
Python 3.5.1 版本,其版本号为 v3.5.1,生成时间是 2015 年 12 月 6 日 01 时 54 分 25 秒,由 MSC v.1900 64 位(AMD64)编译,运行在 win32 系统上 Type "copyright", "credits" or "license()" for more information. C:\Users\Techbeamers\AppData\Local\Programs\Python\Python35\Python-Client.py 开始重新启动。 ? Hello TechBeamers ? You posts are awesome :) ? q
检查程序兼容性
请注意,我们对上述客户端 - 服务器代码进行了 Python 3 版本的测试。不过,您能够轻松地把上述代码转变为在 Python 2.7 上运行的代码。您需要对以下代码行进行替换。
data = input(" ? ")
对 Python 2.7使用以下 Python输入函数。
data = raw_input(" ? ")