zoukankan      html  css  js  c++  java
  • 粘包问题

    粘包问题

    产生原因

    ​ 1.两个数据非常小,同时间隔时间短

    ​ 2.数据太大,一次性取不完,下一次还取这个数据

    解决方法

    ​ 在数据传输之前,传一个数据的大小,数据的大小必须定长度

    基于UDP协议的socket套接字编程

    • UDP无连接

    服务端

    import socket
    
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server.bind(('127.0.0.1', 8000))
    
    print('start...')
    while True:
        data, client_addr = server.recvfrom(1024)
        print(client_addr)
        print(data)
        server.sendto(data.upper(), client_addr)
    
    

    客户端

    import socket
    
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    while True:
        msg = input('please enter your msg:')
        client.sendto(msg.encode('utf8'), ('127.0.0.1', 8000))
    
        data = client.recvfrom(1024)
        print(data)
    
    

    基于socketserver实现并发的socket套接字编程

    • 让服务端同时和多个客户端进行连接,以前我们写的是一个警局有五部电话只有一个人,现在写的是五部电话五个人

    服务端

    # 同一时刻有多个人在接听
    import socketserver
    import subprocess
    import struct
    
    
    class MyHandler(socketserver.BaseRequestHandler):
        # 通信循环
        def handle(self):
    
            while True:
                try:
                    cmd = self.request.recv(1024)
                    print(cmd)
    
                    pipeline = subprocess.Popen(cmd.decode('utf8'),
                                                shell=True,
                                                stderr=subprocess.PIPE,
                                                stdout=subprocess.PIPE)
    
                    stdout = pipeline.stdout.read()
                    stderr = pipeline.stderr.read()
    
                    count_len = len(stdout) + len(stderr)
                    guding_bytes = struct.pack('i', count_len)
    
                    self.request.send(guding_bytes)  # 4
    
                    self.request.send(stderr + stdout)
    
                except ConnectionResetError:
                    break
    
    
    # 使用socketserver的连接循环(并发),但是使用了自己的通信循环
    # myhandler = MyHandler()
    if __name__ == '__main__':
        server = socketserver.ThreadingTCPServer(('127.0.0.1', 8000), MyHandler, bind_and_activate=True)
        print('start...')
        server.serve_forever()
    
    
  • 相关阅读:
    Ubuntu下SVN命令行递归加入文件夹文件(免去一个一个的加入 --force)
    oschina插件和扩展
    oschina iOS代码库
    oschina 开发工具
    oschina应用工具
    oschina程序开发
    网络爬虫 kamike.collect
    WebFetch 是无依赖极简网页爬取组件
    commoncrawl 源码库是用于 Hadoop 的自定义 InputFormat 配送实现
    JAVA平台上的网络爬虫脚本语言 CrawlScript
  • 原文地址:https://www.cnblogs.com/einsam/p/11157570.html
Copyright © 2011-2022 走看看