使用 socket_server 创建一个简单的服务器和客户端

使用 socket_server  创建一个简单的服务器和客户端

创建TCP服务器

# StreamRequestHandler: 支持操作文件对象那样话操作输入输出套接字
# 使用 readline() 获取客户消息
# 使用 write() 把字符串发给客户端
from socketserver import TCPServer as TCP, StreamRequestHandler as SRH
from time import ctime


HOST = ''
PORT = 21569
ADDR = (HOST, PORT)


class MyRequestHandle(SRH):
    # 再有客户端消息进来的时候, handle 方法就会被调用
    def handle(self):
        '''重写handle方法'''
        print(f'...连接地址: {self.client_address}')
        self.wfile.write(f'[{ctime()}] {self.rfile.readline()}'.encode())


tcp_serv = TCP(ADDR, MyRequestHandle)
print('等待连接...')
tcp_serv.serve_forever()

创建TCP客户端

# 创建一个TCP客户端, 程序会提示用户输入要传给服务器的信息, 显示服务器返回的加了时间戳的结果
from socket import *


# HOST 和 PORT 表示服务器的主机名与端口号, 由于这里是在一台电脑运行, 所以 HOST 里放的是 localhost
# 如果服务器和客户端不在一台电脑上, HOST要做出相应的修改
# 端口号和服务器的设置完全相同
HOST = 'localhost'   # HOST 变量为空, 表示 bind() 函数可以绑定到所有的有效地址上
PORT = 21569    # 设置端口号
BUFSIZ = 1024   # 设置缓冲区大小为1K
ADDR = (HOST, PORT)


while True:
    # socket_server 的请求处理器默认行为是接受连接, 得到请求, 然后关闭连接
    # 所以这里每次都要创建新的套接字连接, 有点像UDP。不过这种行为也可以通过重写请求处理器中相应的函数来改变
    tcp_cli_sock = socket(AF_INET, SOCK_STREAM)
    tcp_cli_sock.connect(ADDR)

    data = input('>>>>>>请输入内容: ')
    if not data:
        break

    tcp_cli_sock.send(f'{data}
'.encode())
    data = tcp_cli_sock.recv(BUFSIZ)
    if not data:
        break

    print(f'>>>>>客户端data: {data}')

tcp_cli_sock.close()

TCP客户端执行结果

TCP服务端执行结果

原文地址:https://www.cnblogs.com/gxfaxe/p/15202432.html