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   一发一收

  • 相关阅读:
    Head first javascript(七)
    Python Fundamental for Django
    Head first javascript(六)
    Head first javascript(五)
    Head first javascript(四)
    Head first javascript(三)
    Head first javascript(二)
    Head first javascript(一)
    Sicily 1090. Highways 解题报告
    Python GUI programming(tkinter)
  • 原文地址:https://www.cnblogs.com/ch2020/p/12528378.html
Copyright © 2011-2022 走看看