Python学习笔记

来源:互联网 发布:思科show mac 编辑:程序博客网 时间:2024/05/17 23:27

socket

socket包提供了底层的socket操作,可以用来构建TCP、UDP服务器和客户端。需要注意的是,python3 中 socket 发送和接收的数据都是 utf-8 编码。

TCP

服务器

#coding=utf-8import socketimport timeHOST = '' # 空表示bind绑定任何可用的地址,比如多网卡时,可以接收到发送给任何一个网卡的数据PORT = 21567 BUFSIZ = 1024# 1. 创建socketwith socket.socket(socket.AF_INET, socket.SOCK_STREAM) as tcpSerSock:    # 2. 绑定地址    tcpSerSock.bind((HOST, PORT))    # 3. 监听    tcpSerSock.listen(5)    while True:        print('waiting for connection...')        # 4. accept socket        tcpCliSock, addr = tcpSerSock.accept()        print('...connected from:', addr)        # 5. 用第4步返回的 socekt 与客户端进行接收、发送数据        with tcpCliSock:            while True:                data = tcpCliSock.recv(BUFSIZ)                if not data:                    break                tcpCliSock.send(bytes('[%s] %s' %                     (time.ctime(), str(data, encoding="utf8")), encoding="utf8"))

客户端

#coding=utf-8import socketHOST = '127.0.0.1' # or 'localhost'PORT = 21567BUFSIZ = 1024# 1. 创建 sockettcpCliSock = socket(AF_INET, SOCK_STREAM)with tcpCliSock:    # 2. 连接    tcpCliSock.connect((HOST, PORT))    # 3. 发送、接收数据    while True:        data = input('> ')        if not data:            break        tcpCliSock.send(data.encode('utf8'))        data = tcpCliSock.recv(BUFSIZ)        if not data:            break        print(data.decode('utf8'))

UDP

服务器

#coding=utf-8import socketimport timeHOST = ''PORT = 21567BUFSIZ = 1024# 1. 创建 socketwith socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udpSerSock:    # 2. 绑定地址    udpSerSock.bind((HOST, PORT))    # 3. 接收、发送数据    while True:        print('waiting for message...')        data, addr = udpSerSock.recvfrom(BUFSIZ)        udpSerSock.sendto(bytes('[%s] %s' %                 (time.ctime(), str(data, encoding='utf8')), encoding='utf8'), addr)        print('...received from and returned to: ', addr)

客户端

#coding=utf-8import socketHOST = 'localhost'PORT = 21567BUFSIZ = 1024# 1. 创建 socketwith socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udpCliSock:    # 2. 发送、接收数据    while True:        data = input('> ')        if not data:            break        udpCliSock.sendto(data.encode('utf8'), (HOST, PORT))        data, ADDR = udpCliSock.recvfrom(BUFSIZ)        if not data:            break        print(data)

socketserver

TCP

服务器

#coding=utf-8import socketserverimport timeHOST = ''PORT = 21567# 1. 创建 RequestHandler# 1.1 继承 socketserver.StreamRequestHandlerclass MyRequestHandler(socketserver.StreamRequestHandler):    # 1.2 重写 handle 以处理请求    def handle(self):        print('...connected from:', self.client_address)        # socketserver.StreamRequestHandler 将输入和输出视为 file-like 对象        # 因此这里使用 readline() 和 write() 来读和写数据        # 注意在发送数据时,必须在最后加上回车换行,这里直接使用客户端发送过来的        # 回车换行,因此不必再加上了        self.wfile.write(('[%s] %s' %                 (time.ctime(), self.rfile.readline().decode('utf-8'))).encode('utf-8'))# 2. 创建 socketserver.TCPServerwith socketserver.TCPServer((HOST, PORT), MyRequestHandler) as tcpServ:    print('waiting for connection...')    # 3. 运行服务器    tcpServ.serve_forever()

客户端

#coding=utf-8import socketHOST = 'localhost'PORT = 21567BUFSIZ = 1024# 由于 socketserver 每次处理请求之后都会关闭连接,因此如果要多个请求,需要连接多次# 这里用 while True 建立多次连接,直到用户输入空退出while True:    # 1. 创建 socket    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as tcpCliSock:        # 2. 连接        tcpCliSock.connect((HOST, PORT))        data = input('> ')        if not data:            break        # 3. 发送、接收数据,注意发送数据时必须加 \r\n        tcpCliSock.send(('%s\r\n' % data).encode('utf-8'))        data = tcpCliSock.recv(BUFSIZ)        if not data:            break        print(data.decode('utf-8').strip())

UDP

服务器

#coding=utf-8import socketserverimport timeHOST = ''PORT = 21567# 1. 创建 RequestHandler# 1.1 继承 socketserver.DatagramRequestHandlerclass MyRequestHandler(socketserver.DatagramRequestHandler):    # 1.2 重写 handle 以处理请求    def handle(self):        print('...connected from:', self.client_address)        # socketserver.DatagramRequestHandler 将输入和输出视为 file-like 对象        # 因此这里使用 readline() 和 write() 来读和写数据        # 注意在发送数据时,必须在最后加上回车换行,这里直接使用客户端发送过来的        # 回车换行,因此不必再加上了        self.wfile.write(('[%s] %s' %                 (time.ctime(), self.rfile.readline().decode('utf-8'))).encode('utf-8'))# 2. 创建 socketserver.UDPServerwith socketserver.UDPServer((HOST, PORT), MyRequestHandler) as udpServ:    print('waiting for connection...')    # 3. 运行服务器    udpServ.serve_forever()

客户端

#coding=utf-8import socketHOST = 'localhost'PORT = 21567BUFSIZ = 1024# 由于 socketserver 每次处理请求之后都会关闭连接,因此如果要多个请求,需要连接多次# 这里用 while True 建立多次连接,直到用户输入空退出while True:    # 1. 创建 socket    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as tcpCliSock:        data = input('> ')        if not data:            break        # 2. 发送、接收数据,注意发送数据时必须加 \r\n        tcpCliSock.sendto(('%s\r\n' % data).encode('utf-8'), (HOST, PORT))        data, ADDR = tcpCliSock.recvfrom(BUFSIZ)        if not data:            break        print(data.decode('utf-8').strip())