Python爬虫--网络编程

Python 网络编程

Python提供两个基本的Socket模块:

  • Socket,提供了标准的BSD Sockets API
  • SocketServer, 提供了服务器中心类,可以简化网络服务器的开发

1、Socket类型
套接字格式为: socket(family, type[,protocall]),使用给定的地址族、套接字类型、协议类型(默认为0)创建套接字。

2、Socket函数

TCP编程

服务端
  1. 创建Socket,绑定Socket到本地IP和端口
  2. 开始监听连接
  3. 进入循环,不断接收客户端的连接请求
  4. 接收传来的数据,并发送给对方数据、
  5. 传输完毕后,关闭Socket
# coding=utf8
"""
1. 创建Socket,绑定Socket到本地IP和端口
2. 开始监听连接
3. 进入循环,不断接收客户端的连接请求
4. 接收传来的数据,并发送给对方数据
5. 传输完毕后,关闭Socket
"""
import socket
import threading
import time


def dealClient(sock, addr):
    # 4. 接收传来的数据,并发送给对方数据
    print 'Accept new connection from %s:%s...' % addr
    sock.send(b'Hello, I am server!')
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
            break
        print '-->>%s!' % data.decode('utf-8')
        sock.send('Loop_Msg: %s!' % data.decode('utf-8').encode('utf-8'))
    # 5. 传输完毕后,关闭Socket
    sock.close()
    print 'Connection from %s:%s closed.' % addr

if __name__ == '__main__':
    # 1. 创建Socket,绑定Socket到本地IP和端口
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('127.0.0.1',9999))
    # 2. 开始监听连接
    s.listen(5) # listen(n)传入的值, n表示的是服务器拒绝(超过限制数量的)连接之前,操作系统可以挂起的最大连接数量。n也可以看作是"排队的数量"
    print 'Waiting for connection...'
    # 3. 进入循环,不断接收客户端的连接请求
    while True:
        sock, addr = s.accept()
        t = threading.Thread(target=dealClient, args=(sock, addr))
        t.start()
客户端
  1. 创建Socket,连接远端地址
  2. 连接后发送数据和接收数据
  3. 传输完毕后,关闭Socket
# coding=utf8
"""
1. 创建Socket,连接远端地址
2. 连接后发送数据和接收数据
3. 传输完毕后,关闭Socket
"""
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 9999))
print '-->>'+s.recv(1024).decode('utf-8')
s.send(b'Hello I am a client')
print '-->>'+s.recv(1024).decode('utf-8')
s.send(b'exit')
s.close()

UDP 编程

服务端
  1. 创建Socket,绑定指定的IP和端口
  2. 直接发送数据和接收数据
  3. 关闭Socket
# coding=utf8
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1',9999))
print 'Bind UDP on 9999...'
while True:
    data, addr = s.recvfrom(1024)
    print 'Received from %s:%s' % addr
    s.sendto(b'Hello, %s!' % data, addr)
客户端

与TCP不同,UDP客户端不需要建立连接,创建Socket后可以直接后服务端进行数据交换

# coding=utf8
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Hello',b'World']:
    s.sendto(data,('127.0.0.1',9999))
    print s.recv(1024).decode('utf-8')
s.close()
posted @ 2019-12-05 22:44  来一块小饼干  阅读(286)  评论(0编辑  收藏  举报