python3 套接字练习

发布时间:2019-09-27 07:07:17编辑:auto阅读(1815)

    练习目的

    有随机30个数字
    然后分别需要计算
    1、这30个数字的 奇偶性 奇数返回True 偶数返回False
    2、这30个数字的 2倍
    3、这30个数字的 是否大于10
    要求用socket分布式部署给三个client来计算
    服务端进行数据汇总显示.


    服务器端:

    #导入模块
    import socket
    import threading
    import random
    import time
    
    #创建一个函数来创建套接字
    def sock_start():
        #创建一个套接字,并以tcp链接(主机(ip)+端口(port))
        sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        #绑定主机加端口(''空表示任意的主机)
        #绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址
        sock.bind(('',8000))
        #最大打开5个监听,大于5个链接,则等待
        sock.listen(5)
        #死循环一直等待这主机来连接
        while True:
            #有主机来连接,建立连接
            client,address =sock.accept()
            #创建一个套接字
            t = threading.Thread(target=setResponse,args=(client,address))
            #开始运行
            t.start()
    
        #关闭链接
        sock.close()
    
    def setResponse(sock,address):
        num = 1
        while True:
            info = '''
            是否开启本次作业?
            开启请输入yes
            不开启请输入no
            你直接回车就是默认开启,坏笑!!!
            现在是第 %s 次开始运行!!!!
            '''%num
    
            #判断是否要运行与客户端的数据交流
            status = input(info)
            if status == 'no':
                print('你不开始我退出了!')
                exit()
            else:
                for i in range(10):
                    j = random.randint(1,100)
                    #把数字转化为字符串
                    data = str(j)
                    #加码数据,发送数据给客户端
                    sock.send(data.encode('utf-8'))
                    time.sleep(1)
                    #接受客户端的数据
                    msg_rec = sock.recv(1024)
                    #解码客户端的数据,并打印出来
                    print(msg_rec.decode('utf-8'))
            num +=1
    if __name__ == '__main__':
        sock_start()



    客户端:

    # -*- coding: utf-8 -*-
    # File  : 客户端3.py
    # Author: HuXianyong
    # Date  : 2018-08-23 15:26
    
    import socket,time
    
    my_name = '客户端3'
    #创建一个套接字,并以tcp链接(主机(ip)+端口(port))
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #  主动初始化TCP服务器连接,格式为元组(hostname,port)
    sock.connect(('127.0.0.1',8000))
    while True:
        #接收客户端的数据(数据大小)
        msg_rec = sock.recv(1024)
        #把字符串转化为×××
        num  = int(msg_rec)
        #判断数据的奇偶
        if num%2 == 0:
            sex = '女同志'
        else:
            sex = '男同胞'
    
        #判断数字是否大于10
        if num <= 10:
            age = '瓜娃子'
        elif 10<num<=20:
            age = '2b小青年'
        elif 20 <num <= 40:
            age = '成家立业,养瓜娃子'
        elif 40< num <=60:
            age = '人到中年'
        else:
            age = '该养老了'
    
        #生成数据类型
        msg_send = '我是:%s 性别:%s 人生:%s 年龄:%d'%(my_name,sex,age,num*2)
        #加码数据,并发送数据
        sock.send(msg_send.encode('utf-8'))
        time.sleep(1)
        #打印接收到的服务器端的数据
        print(msg_rec.decode('utf-8'))
    
    #关闭连接
    sock.close()


    我这里要用三个客户端,所以这里的客户端代码复制三次,执行三次:


    执行的效果如下:

    image.png


关键字