Socket Programming (TCP) (to be improved)

json module supplements

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'>
'''

Socket Programming (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()

Socket Programming (TCP) (stick package to solve the problem)

Stick package question: is my understanding that, due to the TCP protocol is a protocol flow, like water generally continuous, it is possible to the end of my data and the following data will be connected in a head to form a stick package. (Small amount of data will TCP protocol, the shorter the time interval data sent in the past-time)

For more, please >>>> 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()





Guess you like

Origin www.cnblogs.com/michealjy/p/11494840.html