Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了。
本文主要介绍使用 Python 进行 TCP Socket 网络编程,假设你已经具有初步的网络知识及 Python 基本语法知识。
TCP 是一种面向连接的传输层协议,TCP Socket 是基于一种 Client-Server 的编程模型,服务端监听客户端的连接请求,一旦建立连接即可以进行传输数据。那么对 TCP Socket 编程的介绍也分为客户端和服务端:
客户端编程
创建 socket
首先要创建 socket,用 Python 中 socket 模块的函数 socket
就可以完成:
1 2 3 4 5 6 7 8 |
#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
的异常,需要捕获:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#handling errors in python socket programs import socket #for sockets import 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 地址:
1 2 3 4 5 6 7 8 9 10 11 12 |
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 服务的默认端口):
1 2 3 4 |
#Connect to remote server s.connect((remote_ip , port)) print 'Socket Connected to ' + host + ' on ip ' + remote_ip |
运行该程序:
1 2 3 4 |
$ python client.py Socket created Ip of remote host www.google.com is 173.194.38.145 Socket Connected to www.google.com on ip 173.194.38.145 |
发送数据
上面说明连接到 www.google.com 已经成功了,接下面我们可以向服务器发送一些数据,例如发送字符串 GET / HTTP/1.1rnrn
,这是一个 HTTP 请求网页内容的命令。
1 2 3 4 5 6 7 8 9 10 11 12 |
rayon-5812a67e17bc5858348795-8">8 9 10 11 12
|