zoukankan      html  css  js  c++  java
  • 通信循环 粘包问题 及解决方法 socket通信 struct模块 subprocess模块复习

    socket通信

    import socket
    
    server = socket.socket()  # 买手机  不传参数默认用的TCP协议
    server.bind(('127.0.0.1',8080))  # bind(host,port)    插电话卡    绑定ip和端口
    server.listen(5)  # 开机       半连接池
    
    conn,addr = server.accept()  # 接听电话  特点运行之后会卡在哪里   等着别人打电话   没有数据会阻塞
    data = conn.recv(1024)  # 听别人说话    接受1024个字节数据                         没有数据会阻塞
    print(data)
    conn.send(b'hello baby~~~')  # 给别人回话
    conn.close()  # 挂电话
    server.close()  # 关机
    服务端
    import socket
    
    client = socket.socket()  # 那电话
    client.connect(('127.0.0.1',8080))  # 拨号  写的是对方的ip和port
    client.send(b'hello,world!!!')
    
    data = client.recv(1024)  # 听别人说话
    
    print(data)
    
    client.close()  #挂电话
    客户端
    import socket
    
    server = socket.socket()
    server.bind(('127.0.0.1',8080))
    
    server.listen(5)
    
    conn, addr = server.accept()
    data = conn.recv(1024)
    conn.send(b'asdasdasd')
    
    print(data)
    conn.close()
    server.close()
    服务端
    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.1',8080))
    
    client.send(b'xixixi')
    
    data = client.recv(1024)
    
    print(data)
    
    client.close()
    客户端

    通信循环

    import socket
    
    server = socket.socket()  # 生成一个对象
    server.bind(('127.0.0.1',8080))  # 绑定ip和port
    server.listen(5)  # 半连接池      同时服务数量
    
    
    while True:
        conn, addr = server.accept()  # 等到别人来    conn  就类似于双向通道
        print(addr)
        while True:
            try:
                data = conn.recv(1024)
                print(data)  # 针对mac和linux  客户端异常之后  服务端不会报错  会一直收b''
                if len(data) == 0:    # 增加代码兼容性
                    break
                conn.send(data.upper())
            except ConnectionResetError as e:
                print(e)
                break
    
        conn.close()
    服务端
    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.1',8080))
    while True:
        msg = input('输入>>>:').encode('utf-8')
        if not msg:
            continue
        client.send(msg)
        data = client.recv(1024)
        print(data)
    客户端

    粘包问题

    import socket
    
    server = socket.socket()  # 不传参数默认就是TCP协议
    server.bind(('127.0.0.1',8080))  # bind(host,port)     ;两个参数   ip  和port
    server.listen(5)  # 半连接池
    
    conn, addr = server.accept()  #等着别人给你打电话
    data = conn.recv(5)   # 接受5字节数据
    print(data)
    data = conn.recv(5)   # 接受5字节数据
    print(data)
    data = conn.recv(4)   # 接受4字节数据
    print(data)
    
    
    import socket
    server = socket.socket()
    server.bind(('127.0.0.1',8080))
    server.listen(5)
    
    conn,addr = server.accept()
    data = conn.recv(6)
    print(data)
    服务端
    import socket
    
    client = socket.socket()  # 拿电话
    client.connect(('127.0.0.1',8080))  #
    
    client.send(b'hello')
    client.send(b'world')
    client.send(b'baby')
    
    
    
    
    import socket
    client = socket.socket()
    client.connect(('127.0.0.1',8080))
    
    client.send(b'asdasd')
    客户端

    解决粘包问题

    服务端

    import socket,json,subprocess,struct
    server = socket.socket()
    server.bind(('127.0.0.1',8080))
    server.listen(5)
    
    while True:
        conn,addr = server.accept()
        while True:
            try:
                cmd = conn.recv(1024).decode('utf-8')
                if not cmd:
                    break
                obj = subprocess.Popen(shell=True,stdout=subprocess.Popen,stderr=subprocess.PIPE)
                res = obj.stdout.read() + obj.stdout.read()
                dic = {'name':'james','file_size':len(res),'info':'asd'}
                json_dic = json.dumps(dic)
                header = struct.pack('i',len(json_dic))
                conn.send(header)
                conn.send(json_dic.encode('utf-8'))
                conn.send(res)
            except Exception:
                break
        conn.close()

    客户端

    import socket,json,struct
    
    client = socket.socket()
    client.connect(('127.0.0.1',8080))
    
    while True:
        cmd = input('>>>').encode('utf-8')
        if not cmd:
            continue
        client.send(cmd)
        header_dict = client.recv(1024)
        dict_size = struct.unpack('i',header_dict)[0]
        dict_bytes = client.recv(dict_size)
        dict_json = json.loads(dict_bytes.decode('utf-8'))
        recv_size = 0
        read_data = b''
        while recv_size > dict_json.get('file_size'):
            data = client.recv(1024)
            read_data += data
            recv_size += len(data)

    struct模块

    import struct
    
    # res = 'qwertyuiopasdfghjkqwertyuiosdfghjkqwertyuiopasdfghjk'
    # print('原始数据长度',len(res))
    
    # 原始数据特别大的时候  i模式打包不了   需要更换模式
    # 如果遇到数据量特别大的情况   该如何解决
    
    dic = {
        'name':'james',
        'file_size':8979879879798777777777777777777777777946513232,
        'info':'厉害了我的哥'
    
    }
    import json
    json_d = json.dumps(dic)
    print(len(json_d))
    
    
    # 对数据打包
    res1 = struct.pack('i',len(json_d))
    print(len(res1))
    
    # 对数据解包
    res2 = struct.unpack('i',res1)[0]
    print('解包之后的',res2)

    subprocess模块复习

    import subprocess
    
    cmd = input('>>>:')
    obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    print(obj.stdout.read().decode('gbk'))   # 正确的命令返回的结果
    print(obj.stderr.read().decode('gbk'))   # 错误的命令返回的结果
    # subprocess   获取的数据 拿完就没了    不能重复的拿
    print(obj.stdout.read().decode('gbk'))   # 正确的命令返回的结果
    print(obj.stderr.read().decode('gbk'))   # 错误的命令返回的结果
  • 相关阅读:
    linux下使用c99链接libuv遇到的问题
    linux连接lua遇到的问题
    uv_timer_t的释放问题
    libuv的源码分析(1)
    [转]关于截取字符串substr和substring两者的区别
    输入框获取焦点后placeholder文字消失、修改placeholder的样式
    发送验证码功能
    针对移动浏览器判断不同的内核的方法
    preventDefault()对象
    [转]JQ中$(window).load和$(document).ready区别与执行顺序
  • 原文地址:https://www.cnblogs.com/xuzhaolong/p/11340545.html
Copyright © 2011-2022 走看看