zoukankan      html  css  js  c++  java
  • socketserver tcp黏包

    socket (套接字)

    tcp(黏包现象原因) 传输中由于内核区缓冲机制(等待时间,文件大小),会在 发送端 缓冲区合并连续send的数据,也会出现在 接收端 缓冲区合并recv的数据给指定port.

    解决办法: 引入内置模块 struct ( 这个模块可以把要发送的数据长度转换成固定长度的字节。这样客户端每次接收消息之前只要先接受这个固定长度字节的内容看一看接下来要接收的信息大小,那么最终接受的数据只要达到这个值就停止,就能刚好不多不少的接收完整的数据了。)

      该模块可以把一个类型,如数字,转成固定长度的bytes (2的32次方)

         -2147483648 <= number <= 2147483647 #这个是范围

    # 客户端
    import
    time,struct import socket sk = socket.socket() sk.connect(('127.0.0.1',9000)) time.sleep(0.5) num = struct.unpack('i',sk.recv(4)) print(sk.recv(num[0]).decode('utf-8')) print(sk.recv(1024)) ----------------------------
    # 服务端 import time,struct import socket sk = socket.socket() sk.connect(('127.0.0.1',9000)) time.sleep(0.5) num = struct.unpack('i',sk.recv(4)) print(sk.recv(num[0]).decode('utf-8')) print(sk.recv(1024))

    socketserver

    SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。
    即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求
    # socketserver模块 上层模块 基于底层socket进一步改造,实现更多功能,tcp协议的server端的并发
    # socket模块 所有网络服务的最底层 socket
    import socketserver
    
    class Myserver(socketserver.BaseRequestHandler):
    
        def handle(self):
            # 必须实现haddle方法
            # 在简历连接之后所有内容都在haddle中实现就可以了
            # ThreadingTCPServer 多线程处理了并发
            print('-->','执行我啦')
            conn = self.request
            while True:
                msg = conn.recv(1024).decode()
                print(msg)
                conn.send(msg.upper().encode())
    
    server = socketserver.ThreadingTCPServer(('127.0.0.1',9000),Myserver)
    server.serve_forever() #一直在执行
    server.py
    import socket
    import time
    sk = socket.socket()
    
    time.sleep(1)
    sk.connect(('127.0.0.1',9000))
    
    while True:
        sk.send(b'hello')
        msg = sk.recv(1024)
        print(msg)
    
    sk.close()
    client.py






  • 相关阅读:
    PHP中利用jQuery操作json格式数据,实现$_POST的数据传输和接收
    如何快速掌握一门技术【婴儿最强学习回头看一看】
    显示桌面.scf
    注册表数据库
    win10home_fixgpedit.msc
    Eclipse 中 jetty 调试模式(debug)正常启动无法访问;非调试模式正常
    svn中的与资源库同步操作 讲解
    windows下二进制mysql的卸载以及安装教程
    mysql服务正在启动或停止中请稍后片刻再试一次,服务强制杀死的方法
    Eclipse中git检出、更新、提交、合并分支、以及解决冲突
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10071973.html
Copyright © 2011-2022 走看看