Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了。
本文主要介绍使用 Python 进行 TCP Socket 网络编程,假设你已经具有初步的网络知识及 Python 基本语法知识。
TCP 是一种面向连接的传输层协议,TCP Socket 是基于一种 Client-Server 的编程模型,服务端监听客户端的连接请求,一旦建立连接即可以进行传输数据。那么对 TCP Socket 编程的介绍也分为客户端和服务端:
客户端编程
创建 socket
首先要创建 socket,用 Python 中 socket 模块的函数 socket
就可以完成:
12345678 | #Socket client example in python import socket #for sockets #create an AF_INET, STREAM socket (TCP)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print \’Socket Created\’ |
函数 socket.socket
创建一个 socket,返回该 socket 的描述符,将在后面相关函数中使用。该函数带有两个参数:
- Address Family:可以选择
AF_INET
(用于 Internet 进程间通信) 或者AF_UNIX
(用于同一台机器进程间通信) - Type:套接字类型,可以是
SOCKET_STREAM
(流式套接字,主要用于 TCP 协议)或者SOCKET_DGRAM
(数据报套接字,主要用于 UDP 协议)
注:由于本文主要概述一下 Python Socket 编程的过程,因此不会对相关函数参数、返回值进行详细介绍,需要了解的可以查看相关手册
错误处理
如果创建 socket 函数失败,会抛出一个 socket.error
的异常,需要捕获:
12345678910111213 | #handling errors in python socket programs import socket #for socketsimport sys #for exit try: #create an AF_INET, STREAM socket (TCP) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)except socket.error, msg: print \’Failed to create socket. Error code: \’ + str(msg[0]) + \’ , Error message : \’ + msg[1] sys.exit(); print \’Socket Created\’ |
那么到目前为止已成功创建了 socket,接下来我们将用这个 socket 来连接某个服务器,就连 www.google.com 吧。
连接服务器
本文开始也提到了,socket 使用 (IP地址,协议,端口号) 来标识一个进程,那么我们要想和服务器进行通信,就需要知道它的 IP地址以及端口号。
获得远程主机的 IP 地址
Python 提供了一个简单的函数 socket.gethostbyname
来获得远程主机的 IP 地址:
123456789101112 | host = \’www.google.com\’port = 80 try: remote_ip = socket.gethostbyname( host ) except socket.gaierror: #could not resolve print \’Hostname could not be resolved. Exiting\’ sys.exit() print \’Ip address of \’ + host + \’ is \’ + remote_ip |
现在我们知道了服务器的 IP 地址,就可以使用连接函数 connect
连接到该 IP 的某个特定的端口上了,下面例子连接到 80 端口上(是 HTTP 服务的默认端口):
1234 | #Connect to remote servers.connect((remote_ip , port)) print \’Socket Connected to \’ + host + \’ on ip \’ + remote_ip |
运行该程序:
1234 | $ python client.pySocket createdIp of remote host www.google.com is 173.194.38.145Socket Connected to www.google.com on ip 173.194.38.145 |
发送数据
上面说明连接到 www.google.com 已经成功了,接下面我们可以向服务器发送一些数据,例如发送字符串 GET / HTTP/1.1rnrn
,这是一个 HTTP 请求网页内容的命令。
123456789101112 | rayon-5812a67e17bc5858348795-8\”>89101112 |
|