• 套接字编程(TCP)


    json模块补充

    json保存的格式中,key值一定要用双引号隔开

    import json
    #把字典转成json格式字符串
    dic = {'name': 'lqz', 'xx': False, 'yy': None}
    print(type(dic)) #字典类型
    
    dic_s = json.dumps(dic)
    #json格式字符串
    print(type(dic_s))#字符串类型(json形式)
    
    dic_s2 = str(dic)
    print(dic_s2)
    print(type(dic_s2)) #是字符串,但是不是json格式的字符串
    
    json.dumps() #字典转成字符串(json)
    json.dump() #字典转成字符串(json),并存到文件中
    
    json.loads() #把json格式字符串转成字典
    json.load() #从文件中把json格式字符串转成字典
    
    
    #不是json格式字符串转换,直接报错
    ss = 'falseee'#会报错,普通字符串不能转换,(false,null,还有字典{},列表[]除外)
    ss = 'false'#打印出来是bool值
    print(json.loads(ss))
    print(type(json.loads(ss)))
    
    ss = {'name': 'lqz', 'xx':False, "yy":None}
    print(json.dumps(ss))
    print(type(json.dumps(ss)))
    '''
    {"name": "lqz", "xx": false, "yy": null}
    <class 'str'>
    '''
    
    

    套接字编程(TCP)

    ###服务端
    import socket
    
    #买手机,实例化生成一个socket对象
    server = socket.socket()
    
    #绑定手机卡, 监听地址
    server.bind(('127.0.0.1', 8003))
    
    #监听,设置半连接池的大小
    server.listen(5)
    
    #连接循环
    while True:
        #一旦有个客户端来连接成功,会返回两个值,
        # 如果没有,会卡在这
        conn, addr = server.accept()
    
        #通信循环
        while True:
            #卡在这,等着客户端来发
            data = conn.recv(1024)
            conn.send(data.upper())
        conn.close()
    server.close()
    
    
    #客户端
    
    import socket
    client = socket.socket()
    client.connect(('127.0.0.1', 8003))
    #通信循环
    while True:
        msg = input('>>>:')
        client.send(msg.encode('utf8'))
        #client.send(bytes(msg, 'utf8')) #和上面的语句相同
        data = client.recv(1024)
        print(data)
    client.close()
    
    
    

    套接字编程(TCP)(解决粘包问题)

    粘包问题:我的理解是,由于TCP协议是流式协议,像流水一般是连续的,所以有可能我的数据尾会和后面的数据头连在一块,形成粘包。(TCP协议会把数据量较小,时间间隔较短的数据,一次性发过去)

    详细了解请>>>>https://www.cnblogs.com/nickchen121/p/11031027.html

    #客户端_粘包
    
    import socket
    import struct
    import json
    client =socket.socket()
    client.connect(('127.0.0.1', 8003))
    while True: #通信循环
        msg=input('开始接收?>>:')
        #先收4个字节,取出头部的长度
        head_len=struct.unpack('i',client.recv(4))[0]
        #接收头部
        dic=json.loads(client.recv(head_len))
        l=dic['size']
        name=dic['name']
        count=0
        data=b''
        with open(name,'wb') as f:
            while count<l:
                if l<1024:
                    data_temp=client.recv(l)
                else:
                    if l-count>=1024:
                        data_temp=client.recv(1024)
                        print(data_temp)
    
                    else:
                        data_temp=client.recv(l - count)
                data+=data_temp
                count+=len(data_temp)
            f.write(data)
    
    
        print('接收完成')
    client.close()
    
    
    
    #服务端_粘包
    
    import socket
    import os
    import json
    import struct
    server=socket.socket()
    server.bind(('127.0.0.1', 8003))
    server.listen(5)
    while True: #连接循环
        #一旦有个客户端来连接成功,会返回两个值,如果没有,会卡在这
        conn,addr=server.accept()
    
        while True: #通信循环
            #加个文件头
            # {size:os.path.getsize(),name:'333.py',md5:asdfasdfasfd}
            #计算一下头的长度
            dic={'size':os.path.getsize('json模块.py'),'name':'xxxxxx.py'}
            #转成bytes格式
            dic_b=bytes(json.dumps(dic),'utf-8')
            #获取长度
            dic_b_len=len(dic_b)
            obj=struct.pack('i',dic_b_len)
            #发送四个字节
            conn.send(obj)
            #发头部内容
            conn.send(dic_b)
            #直接以+形式打开,就不需要转换了  rb
            with open('json模块.py','rb') as f:
                # conn.send(f.read())
                # f 是文件对象,它可迭代
                for line in f:
                    conn.send(line)
        conn.close()
    server.close()
    
    
    
    
    
    
    
  • 相关阅读:
    python's twenty eithth day for me 模块和包
    python's twenty-seventh day for me 模
    python's twenty-sixth day for me 模块
    python's twenty-fifth day for me 模块
    python's twenty_fourth day for me 内置方法
    python's twenty-third day for me 面向对象进阶
    python's twenty-second day for me 封装,property方法
    python's twenty-first day for me 抽象类和接口类以及多态
    字典
    元组(tuple)基本操作
  • 原文地址:https://www.cnblogs.com/michealjy/p/11494840.html
Copyright © 2020-2023  润新知