zoukankan      html  css  js  c++  java
  • 套接字编程(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()
    
    
    
    
    
    
    
  • 相关阅读:
    java的构造方法 java程序员
    No result defined for action cxd.action.QueryAction and result success java程序员
    大学毕业后拉开差距的真正原因 java程序员
    hibernate的回滚 java程序员
    验证码 getOutputStream() has already been called for this response异常的原因和解决方法 java程序员
    浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓 java程序员
    你平静的生活或许会在某个不可预见的时刻被彻底打碎 java程序员
    Spring配置文件中使用ref local与ref bean的区别. 在ApplicationResources.properties文件中,使用<ref bean>与<ref local>方法如下 java程序员
    poj1416Shredding Company
    poj1905Expanding Rods
  • 原文地址:https://www.cnblogs.com/michealjy/p/11494840.html
Copyright © 2011-2022 走看看