zoukankan      html  css  js  c++  java
  • 网络编程二

    一.socket套接字

    server端

    import socket
    server= socket.socket()
    server.bind(('127.0.0.1',8080))  #把地址绑定到套接字
    server.listen()          #监听链接
    conn,addr = server.accept() #接受客户端链接
    ret = conn.recv(1024)  #接收客户端信息
    print(ret)       #打印客户端信息
    conn.send(b'hi')        #向客户端发送信息
    conn.close()       #关闭客户端套接字
    sk.close()        #关闭服务器套接字(可选)
    View Code

    client端

    import socket
    client = socket.socket()           # 创建客户套接字
    client.connect(('127.0.0.1',8898))    # 尝试连接服务器
    client.send(b'hello!')
    ret = client.recv(1024)         # 对话(发送/接收)
    print(ret)
    client.close()            # 关闭客户套接字
    View Code

    127.0.0.1  本机回还地址
    只能自己访问自己  别人无法访问

    服务器与客户端的send与recv要一一对应

    二.粘包问题

    udp粘包问题出现的原因 :

    使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。

    解决粘包问题的的方法:

    服务端

    import socket
    import subprocess
    import struct
    import json
    
    
    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)
                if len(cmd) == 0:break
                cmd = cmd.decode('utf-8')
                obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
                res = obj.stdout.read() + obj.stderr.read()
                d = {'name':'jason','file_size':len(res),'info':'asdhjkshasdad'}
                json_d = json.dumps(d)
                # 1.先制作一个字典的报头
                header = struct.pack('i',len(json_d))
                # 2.发送字典报头
                conn.send(header)
                # 3.发送字典
                conn.send(json_d.encode('utf-8'))
                # 4.再发真实数据
                conn.send(res)
                # conn.send(obj.stdout.read())
                # conn.send(obj.stderr.read())
            except ConnectionResetError:
                break
        conn.close()
    View Code

    客户端

    import socket
    import struct
    import json
    
    client = socket.socket()
    client.connect(('127.0.0.1',8080))
    
    while True:
        msg = input('>>>:').encode('utf-8')
        if len(msg) == 0:continue
        client.send(msg)
        # 1.先接受字典报头
        header_dict = client.recv(4)
        # 2.解析报头 获取字典的长度
        dict_size = struct.unpack('i',header_dict)[0]  # 解包的时候一定要加上索引0
        # 3.接收字典数据
        dict_bytes = client.recv(dict_size)
        dict_json = json.loads(dict_bytes.decode('utf-8'))
        # 4.从字典中获取信息
        print(dict_json)
        recv_size = 0
        real_data = b''
        while recv_size < dict_json.get('file_size'):  # real_size = 102400
            data = client.recv(1024)
            real_data += data
            recv_size += len(data)
        print(real_data.decode('gbk'))
    View Code
  • 相关阅读:
    SqlServer 利用临时表批量添加&&修改数据库表中的数据
    有关Linux的实时性
    烟囱式到SOA再到微服务
    消费金融前世今生
    其它 一加7t禁止系统更新
    电商 相关底层知识
    CRMEB 基础 列表拖动排序2
    CRMEB 基础 列表拖动排序1
    前端 table排序
    MacBook 关闭访客登陆
  • 原文地址:https://www.cnblogs.com/Cpsyche/p/11318419.html
Copyright © 2011-2022 走看看