Python网络爬虫技术与实战
上QQ阅读APP看书,第一时间看更新

2.7.3 Socket编程

Socket又称“套接字”,应用程序通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通信。

Python中,我们用Socket()函数来创建套接字,语法格式如下:


socket.socket([family[, type[, proto]]])

参数说明:

·Family:套接字家族可以是AF_UNIX或者AF_INET。

·Type:套接字类型,根据是面向连接的还是非连接的,可分为SOCK_STREAM和SOCK_DGRAM。

·Protocol:一般不填,默认为0。

常见的Socket对象方法如表2-3所示。

表2-3 常见的Socket对象方法

1.服务端的Socket编程

我们使用socket模块的socket函数来创建一个socket对象。socket对象可以通过调用其他函数来设置一个socket服务。

现在我们可以通过调用bind(hostname,port)函数来指定服务的port(端口)。

接着,我们调用socket对象的accept方法。该方法等待客户端的连接,并返回connection对象,表示已连接到客户端。


# 文件名:server.py
import socket
# 建立一个服务端
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('localhost',6999))    # 绑定要监听的端口
server.listen(5)                   # 开始监听,表示可以使用五个链接排队
while True:                        # conn就是客户端链接过来而在服务端生成的一个链接实例
    conn,addr = server.accept()    # 等待多个链接
    print(conn,addr)
    while True:
        try:
            data = conn.recv(1024)           # 接收数据
            print('recive:',data.decode())   # 打印接收到的数据
            conn.send(data.upper())          # 然后再发送数据
        except ConnectionResetError as e:
            print('关闭了正在占线的链接!')
            break
    conn.close()

2.客户端的Socket编程

接下来我们写一个简单的客户端实例连接到以上创建的服务。端口号为12345。

socket.connect(hosname,port)方法打开一个TCP连接到主机为hostname、端口为port的服务商。连接后我们就可以从服务端获取数据,记住,操作完成后需要关闭连接。


# 文件名:client.py
# 客户端发送一个数据,再接收一个数据

import socket                         # 声明socket类型,同时生成链接对象
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('localhost',6999))                     # 建立一个链接,连接到本地的6969端口
while True:
    # addr = client.accept()
    # print '连接地址:', addr
    msg = '欢迎访问菜鸟教程!'           # strip默认取出字符串的头尾空格
    client.send(msg.encode('utf-8'))  # 发送一条信息,Python3只接收btye流
    data = client.recv(1024)          # 接收一个信息,并指定接收的大小为1024字节
    print('recv:',data.decode())      # 输出所接收的信息
client.close()                        # 关闭这个链接

现在我们打开两个终端,第一个终端执行server.py文件:


$ python server.py

第二个终端执行client.py文件:


$ python client.py 
欢迎访问菜鸟教程!

这时我们再打开第一个终端,就会看到有以下信息输出:


连接地址: ('192.168.0.118', 62461)