python代码模拟服务器实验1:阻塞IO

client.py

python 复制代码
import socket
import sys

# 创建一个TCP/IP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务器
server_address = ('localhost', 9090)

try:
    client_socket.connect(server_address)
except ConnectionRefusedError:
    print("Connection refused")
    sys.exit()

try:
    # 发送数据
    message = 'This is a test message.'
    print(f"Sending: {message}")
    client_socket.sendall(message.encode('utf-8'))

finally:
    # 发送FIN
    client_socket.close()

server.py

python 复制代码
import socket

# 创建一个TCP/IP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定套接字到地址和端口
server_address = ('localhost', 9090)
server_socket.bind(server_address)

# 开始监听传入连接
server_socket.listen(1)

print("Server is waiting for a connection...")

# 阻塞等待客户端连接
connection, client_address = server_socket.accept()

try:
    print(f"Connection established with {client_address}")

    # 循环接收数据
    while True:
        data = connection.recv(1024)  # 阻塞等待接收数据
        if data:
            print(f"Received: {data.decode('utf-8')}")
        else:
            print("No more data from client, closing connection.")
            break

finally:
    connection.close()

在这个例子中,listen(1) 指定连接队列的最大长度为1,这意味着:

如果服务器正忙于处理当前连接,而另一个连接请求到来,那么这个新的连接请求将被放入队列中。

如果在这个时候有第三个客户端请求连接,由于队列长度已经达到 1,第三个请求可能会被拒绝,或者客户端会收到 ECONNREFUSED 错误。

实际使用建议:

在实际应用中,backlog 参数的值通常会设置得比1大,尤其是在处理多个客户端的情况下。例如,常见的值有 5、10 或者更高,这样可以确保服务器能处理更多并发的连接请求而不容易拒绝新的连接。

总结:server_socket.listen(1) 中的 1 是连接请求队列的最大长度,决定了在服务器处理当前连接时,可以有多少其他连接请求被挂起等待处理。

相关推荐
tg_xianheyun4 小时前
CDN节点分布如何影响网页加载速度和用户体验
服务器·cdn加速·全球访问优化
lsh曙光5 小时前
延时at指令和定时cron指令
linux·服务器·网络
笨鸟先飞,勤能补拙5 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
微学AI5 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
长和信泰光伏储能6 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
豆瓣鸡6 小时前
算法日记 - Day3
java·开发语言·算法
浦信仿真大讲堂6 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
夏殇之殁6 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
韭菜炒鸡肝天6 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
Gu Gu Study7 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python