zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    图像按钮
    提交按钮
    文件上传域
    Python创建虚拟环境
    Typecho使用技巧
    面向对象
    Python语法入门
    Python 基础数据类型
    与用户交互
    MySQL5.7安装教程
  • 原文地址:https://www.cnblogs.com/aaron456-rgv/p/12500443.html
Copyright © 2011-2022 走看看