python recv_Python网络编程04 /recv工作原理、展示收发问题、粘包现象

本文详细探讨了Python网络编程中`recv`函数的工作原理,包括服务端在不同情况下的行为,以及如何处理收发数据时可能遇到的问题。同时,文章还深入分析了网络通信中的粘包现象,提供了低级和高级版的解决方案,以确保数据正确无误地传输。
摘要由CSDN通过智能技术生成

Python网络编程04 /recv工作原理、展示收发问题、粘包现象

1. recv工作原理

源码解释:

Receive up to buffersize bytes from the socket.

# 接收来自socket缓冲区的字节数据,

For the optional flags argument, see the Unix manual.

# 对于这些设置的参数,可以查看Unix手册。

When no data is available, block untilat least one byte is available or until the remote end is closed.

# 当缓冲区没有数据可取时,recv会一直处于阻塞状态,直到缓冲区至少有一个字节数据可取,或者远程端关闭。

When the remote end is closed and all data is read, return the empty string.

# 关闭远程端并读取所有数据后,返回空字符串。

验证recv工作原理

1.验证服务端缓冲区数据没有取完,又执行了recv执行,recv会继续取值

# server服务端

import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind(('127.0.0.1',8080))

server.listen(5)

conn, client_addr = server.accept()

from_client_data1 = conn.recv(2)

print(from_client_data1)

from_client_data2 = conn.recv(2)

print(from_client_data2)

from_client_data3 = conn.recv(1)

print(from_client_data3)

conn.close()

server.close()

# client客户端

import socket

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect(('127.0.0.1',8080))

client.send('hello'.encode('utf-8'))

client.close()

2.验证服务端缓冲区取完了,又执行了recv执行,此时客户端20秒内不关闭的前提下,recv处于阻塞状态

# server服务端

import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind(('127.0.0.1',8080))

server.listen(5)

conn, client_addr = server.accept()

from_client_data = conn.recv(1024)

print(from_client_data)

print(111)

conn.recv(1024) # 此时程序阻塞20秒左右,因为缓冲区的数据取完了,并且20秒内,客户端没有关闭。

print(222)

conn.close()

server.close()

# client客户端

import socket

import time

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect(('127.0.0.1',8080))

client.send('hello'.encode('utf-8'))

time.sleep(20)

client.close()

3.验证服务端缓冲区取完了,又执行了recv执行,此时客户端处于关闭状态,则recv会取到空字符串

# server服务端

import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind(('127.0.0.1',8080))

server.listen(5)

conn, client_addr = server.accept()

from_client_data1 = conn.recv(1024)

print(from_client_data1)

from_client_data2 = conn.recv(1024)

print(from_client_data2)

from_client_data3 &#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值