python网络(2)_Tcp协议

Socket

Socket是套接字
socket处于应用层与传输层之间,提供了一些简单的接口,避免与操作系统之间对接,省去了繁琐复杂的操作
socket在python中属于一个模块,为我们提供了一些简单功能

low比版本

server服务端

Android=socket.socket()
Android.bind(("127.0.0.1",8866))#绑定服务器
Android.listen(2)#监听
conn,addr=Android.accept()#等待连接,这是个阻塞,拥有两个参数
#conn是管道,addr客户端ip地址
from_client_data =conn.recv(1024)#接收内容1024个字节
#from_client_data是客户端的文字缓存
print(F'客户端{addr}内容:{from_client_data}')
string=input("请输入").strip().encode('utf-8')
conn.send(string)
conn.close()
Android.close()

client服务端

Android=socket.socket()
Android.connect(("127.0.0.1",8866))#绑定服务器
string=input("请输入").strip().encode('utf-8')
Android.send(string)
from_client_data =Android.recv(1024)#接收内容1024个字节
#from_client_data是客户端的文字缓存
print(F'服务器内容:{from_client_data}')
Android.close()

非常厉害的版本

服务端处理高级粘包

#高级粘包处理

Android=socket.socket()
Android.bind(("127.0.0.1",8848))
Android.listen(3)#允许有三个客户端加到半链接池子,超过会报错
while 1:
    conn,arrd=Android.accept()
    print(f"连接成功一位{arrd}")
    while 1:
        try:
            from_client_data=conn.recv(1024)
            if from_client_data == b'0':
                print(f"客户端{arrd}已经退出")
                break
            obj = subprocess.Popen(from_client_data.decode("gbk"),
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE,
                                   )
            print(f'客户端{arrd}内容:{from_client_data.decode("gbk")}')
            result = obj.stdout.read() + obj.stderr.read()
            #1自定义报头
            head_dic = {
                'file_name':"test1",
                'md5':"656765678678",
                'total_size':len(result),
            }

            #2json形式的报头
            head_dic_json=json.dumps(head_dic)
            #3bytes形式报头
            head_dic_json_bytes=head_dic_json.encode("gbk")

            #4获取bytes形式的报头总字节数
            len_head_dic_json_bytes=len(head_dic_json_bytes)

            #5将不固定的int总结字数固定长度4个字节
            four_head_bytes=struct.pack("i",len_head_dic_json_bytes)
            #6发送固定4长度的报头
            conn.send(four_head_bytes)
            #发送报头数据
            conn.send(head_dic_json_bytes)
            #发送总数据
            conn.send(result)
        except ConnectionResetError:
            print(f"客户端{arrd}已经退出")
            break
    conn.close()
Android.close()

客户端处理高级粘包

phone=socket.socket()
phone.connect(("127.0.0.1",8848))
while 1:
    to_server_data=input("请输入").strip().encode("gbk")
    phone.send(to_server_data)

    if not to_server_data:
        print("输入内容不能为空")
        continue
    if to_server_data.upper() == "Q":
        print("客户端退出")
        break
    #1接收固定长度的四个字节
    head_bytes = phone.recv(4)

    #2获得bytes类型字典的总字节数
    len_head_dic_json_bytes = struct.unpack("i", head_bytes)[0]

    #3接收bytes形式的dic数据
    head_dic_json_bytes = phone.recv(len_head_dic_json_bytes)

    #4接收转换成json类型的dic
    head_dic_json=head_dic_json_bytes.decode('gbk')

    #5转换成字典形式的报头
    head_dic=json.loads(head_dic_json)
    tatal_data=b''
    while len(tatal_data) < head_dic["total_size"]:
        tatal_data += phone.recv(1024)
    print(tatal_data.decode("gbk"))
phone.close()

原文地址:https://www.cnblogs.com/SkyRabbit/p/11357141.html