zoukankan      html  css  js  c++  java
  • 粘包2

    客户端

     1 from socket import *
     2 
     3 tcp_server = socket(AF_INET, SOCK_STREAM)
     4 tcp_server.bind(('127.0.0.1', 8080))
     5 tcp_server.listen(124)
     6 coon, addr = tcp_server.accept()
     7 data1 = coon.recv(1024)
     8 print('第一次收', data1.decode())
     9 
    10 data2 = coon.recv(1024)
    11 print('第二次收', data2.decode())
    12 
    13 data3 = coon.recv(1024)
    14 print('第三次收', data3.decode())

    服务端

    1 from socket import *
    2 
    3 tcp_client = socket(AF_INET,SOCK_STREAM)
    4 tcp_client.connect(('127.0.0.1',8080))
    5 tcp_client.send('hello'.encode())
    6 tcp_client.send('world'.encode())
    7 tcp_client.send('中国'.encode())   # 套接字没有规定一发一收
    8 # 套接字都是往缓冲区中发

    运行可知,tcp协议:当发送接收数据时,如果发送的数据包很小,操作系统会将多个小的数据包合并发送。接收方就一次接受所有的数据包。

    这个原理就是Nagle算法。

    下面是发送的数据量小的一种情况:

    用了时间模块后,发现这个是由系统决定的。

    第二种情况,发送的数据量大的情况:服务端:

    1 from socket import *
    2 
    3 udp_server = socket(AF_INET, SOCK_DGRAM)
    4 udp_server.bind(('127.0.0.1', 8080))
    5 data = udp_server.recvfrom(1024)  # 哪怕是发送了很多个包在缓冲区,但是一次接受只能接受一个包
    6 print('收到的数据包为:', data)

    客户端:

    1 from socket import *
    2 
    3 udp_client = socket(AF_INET, SOCK_DGRAM)
    4 udp_client.sendto(b'hello', ('127.0.0.1', 8080))
    5 udp_client.sendto(b'world', ('127.0.0.1', 8080))
    6 udp_client.sendto(b'egon', ('127.0.0.1', 8080))

    原因:udp是基于数据报的工作方式工作的    一个包就是一个包,操作系统不会把多个包进行合并

    udp   一发一收

  • 相关阅读:
    【LeetCode】203. Remove Linked List Elements
    【Leetcode】237. Delete Node in a Linked List
    char * const * (*a) (int b)
    排序算法
    系统设计
    PHP生成随机单词
    通过建立ssh信任,启动其他客户机的服务
    定时监控服务,告警,并启动服务
    定时监控所有服务器的端口,如果挂起,发送报警邮件
    反射
  • 原文地址:https://www.cnblogs.com/ch2020/p/12528378.html
Copyright © 2011-2022 走看看