最新公告
  • 欢迎您光临知事网软件APP资源下载站,一个优质的手机App应用商店和网站源码基地。欢迎加入永久SVIP
  • python如何使用socket通信传输数据?

    正文概述 知事网   2020-12-18 09:12:30   298

    本篇主要教大家用socket通信传输数据,具体内容我们往下看。

    1.服务器端

    功能:计算客户端传输过来的文件个数、文件总长度、字符串总次数、字符串总个数、数据总长度,并且总长度不大于max_len,否则服务器将断开联系

    异常处理

    import socket
    server=socket.socket()
    server.bind(("localhost",5555))
    server.listen()
    conn,address=server.accept()
     
    file_number=0#文件个数
    file_len=0#文件总字长
    data_number=0#字符串个数
    data_len=0#数据长度
    recv_len=0#总字长
    max_len=2000000
     
    #文件处理方法
    def file_deal(data,file_number):
        with open(str(file_number)+'.jpg','wb')as f:
            f.write(data)
        print("文件保存成功!")
     
     
    while True:
        try:
            #传输数据超过max_len则断开数据传输
            if recv_len>max_len:
                print("客户端传输数据超过{}字节,服务器断开连接".format(max_len))
                print("本次一共传输{}字节的数据那,其中字符串为{}字节,传输{}次,文件为有{}字节,传输{}次".format(recv_len, data_len, data_number, file_len, file_number))
                #conn.send("你已经超出传输范围{},服务器断开连接".format(max_len))
                break
            recv_data=conn.recv(1000)
            #recv处理层!
            #服务器和客户端达成协议,客户端向服务器端发来的指令:
            # 发送文件为2,发送数据为1,结束发送为4,继续发送为3
            #send处理层:
            #回复1为收到,2为未收到!
            if recv_data.decode('utf-8')=='1':
                print("准备客户端发送过来的字符串!")
                data_recv=conn.recv(1000)
                print("收到从客户端发送过来的字符串:",data_recv.decode('utf-8'))
                data_number+=1#字符串总个数
                recv_len+=len(data_recv)#总字长
                data_len+=len(data_recv)#字符串总长
            elif recv_data.decode('utf-8')=='2':
                print("准备接受客户端发送过来的文件")
                data_recv=conn.recv(100000000)
                file_deal(data_recv,file_number)
                file_number+=1#文件个数
                recv_len += len(data_recv)#总字长
                file_len+=len(data_recv)#文件总字长
            elif recv_data.decode('utf-8')=='3':
                print("客户端重新发送数据")
                data_recv=conn.recv(10000)
                continue
            else:
                print("客户端已断开联系!我也断开联系吧")
                data_recv=conn.recv(10000)
                print("本次一共传输{}字节的数据那,其中字符串为{}字节,传输{}次,文件为有{}字节,传输{}次".format(recv_len, data_len, data_number, file__len, file_number))
                break
        except:
            print("客户端突然中断")
            break
    server.close()

    2.客户端

    功能:向服务器端发送文件和字符串,并进行异常处理

    import socket,os
     
    def isfile(filename):
        result=os.path.exists(filename)
        return result
     
    def readfile(filename):
        with open(filename,'rb')as f:
            data=f.read()
        return data
     
    specialchar=['1','2','3','4']
    client=socket.socket()
    client.connect(('localhost',5555))
     
    while True:
        try:
            #if client.recv(1000):
                #break
            data_send=input("请输入您想发送的数据类型!1为字符串2为文件4为结束发送3为继续发送:").strip()
            if data_send not in specialchar:
                continue
            client.send(data_send.encode('utf-8'))
            if data_send=='1':
                while True:
                    data_send=input("请输入您想发送的字符串:").strip()
                    if data_send not in specialchar:
                        client.send(data_send.encode('utf-8'))
                        break
                    else:
                        continue
            elif data_send=='2':
                while True:
                    data_filename=input("请您输入你想发送的文件名:").strip()
                    if isfile(data_filename):
                        client.send(readfile(data_filename))
                        break
                    else:
                        print("请重新输入文件!")
                        continue
            elif data_send=='3':
                client.send('3'.encode('utf-8'))
                continue
            elif data_send=='4':
                client.send('4'.encode('utf-8'))
                break
            else:
                print("输入错误!请重新输入!")
                continue
        except:
            print("服务器端突然中断!")
            break
     
    client.close()

    实现功能:实时传输数据(包括字符串、文件),客户端文件的保存等。

    3.socket通信优点

    客户端:

    向服务器端发送文件和字符串,并进行异常处理

    服务器端:

    计算客户端传输过来的文件个数、文件总长度、字符串总次数、字符串总个数、数据总长度,并且总长度不大于max_len,否则服务器将断开联系、异常处理。

    本文来源于网络,如有雷同联系作者修改。

    转载自:python学习网 https://www.py.cn/


    知事网 » python如何使用socket通信传输数据?

    发表评论

    还没有评论,快来抢沙发吧!

    [!--temp.right--]
    请选择支付方式
    ×
    余额支付
    ×
    微信扫码支付 0 元