Python3---学习TCP服务器

服务器代码:

from socket import *
from time import ctime
'''
作用:创建一个TCP服务器,它接收来自客户端的消息,并返回加了时间戳前缀的相同信息
TCP服务器伪代码:
ss = socket() 创建服务器套接字
ss.bind() 套接字与地址绑定
ss.listen() 监听链接
inf_loop: 服务器无限循环
    cs = ss.accept() 接收客户端链接
    comm_loop: 通信循环
        cs.recv()/cs.send() 对话(接收/发送)
    cs.close() 关闭客户端套接字
ss.slose() 关闭服务器套接字
'''
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)

tcpSerSock = socket(AF_INET,SOCK_STREAM)
#s.bind()将地址(主机名,端口号)绑定到套接字
tcpSerSock.bind(ADDR)
#s.listen() 设置并启动TCP监听器,“5”表示连接欸被转接或拒绝之前,传入链接请求的最大请求数
tcpSerSock.listen(5)
'''
bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列。它是 bytearray 的不可变版本
'''
while True:
    print('waiting for connection...')
    #s.accept() 被动接收TCP客户端连接,一直等待直到连接到达(阻塞)
    tcpCliSock, addr = tcpSerSock.accept()
    print('...connected from:', addr)
    while True:
        data = tcpCliSock.recv(BUFSIZ)
        print(type(data))
        ctime = ctime().encode()
        if not data:
            #break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码
            break
        tcpCliSock.send(ctime)
        #tcpCliSock.send('[%s] %s' %(ctime,data))
        #tcpCliSock.send('[%s] %s' %(bytes(ctime(),'UTF-8'),data))
    tcpCliSock.close()
tcpSerSock.close()

客户端代码:

from socket import *

'''
作用:创建一个TCP客户端,它提示用户输入发送到服务器端的消息,并接收从服务器端返回的添加了时间戳前缀的仙消息,然后返回结果
TCP客户端伪代码:
    cs = socket() 创建客户端套接字
    cs.connect() 尝试链接服务器
    comm_loop:
        cs.send()/cs.recv() 对话(发送/接收)
    cs.close() 关闭客户端套接字
'''
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)

tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
'''
s.recv() 接收TCP消息
报错:ypeError: a bytes-like object is required, not 'str'
报错原因:python3和Python2在套接字返回值解码上有区别。
解决方案:data = data.encode()
'''
while True:
    data = input('> ')
    print(type(data))
    data = data.encode()
    print(type(data))
    #data = data.encode()
    if not data:
        break
    tcpCliSock.send(data)
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print(data.decode('utf-8'))
tcpCliSock.close()

猜你喜欢

转载自www.cnblogs.com/aaron456-rgv/p/12500443.html