You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python UDP Socket建立首次连接后无法正常工作

解决UDP Socket首次连接后无法工作的问题

兄弟,我一眼就瞅出问题根源了——你明明要做UDP协议的应用,代码里却用了TCP专属的SOCK_STREAM!这俩协议的工作逻辑完全不一样,UDP是无连接的,根本不需要listen()这类TCP特有的方法,这就是你代码跑不起来的核心原因。

修正后的server.py代码

import socket

# 创建UDP套接字,替换TCP的SOCK_STREAM为UDP的SOCK_DGRAM
serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = "127.0.0.1"
port = 8000

print(f"服务器绑定到 {host}:{port}")
serversocket.bind((host, port))
print('UDP服务器已启动,等待客户端消息...')

# UDP无连接,直接循环收发消息
while True:
    # 接收客户端消息,同时获取客户端地址
    data, client_addr = serversocket.recvfrom(1024)
    print(f"收到来自 {client_addr} 的消息: {data.decode('utf-8')}")
    
    # 给客户端回复消息
    reply_content = f"服务器已收到你的消息: {data.decode('utf-8')}"
    serversocket.sendto(reply_content.encode('utf-8'), client_addr)

关键改动说明

  • 替换套接字类型:把socket.SOCK_STREAM改成socket.SOCK_DGRAM,这是UDP协议的正确套接字类型,TCP和UDP的套接字不能混用。
  • 移除TCP专属方法:UDP是无连接协议,不需要listen()来监听连接请求,绑定端口后直接就能接收消息。
  • 使用UDP专属收发方法:用recvfrom()和sendto()替代TCP的recv()和send(),因为UDP没有固定连接,每次收发都需要明确对方的地址。
  • 添加循环持续处理:让服务器一直处于接收-回复的循环中,满足你无限循环交互的需求。

配套测试用client.py代码

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_addr = ("127.0.0.1", 8000)

print("UDP客户端启动,输入消息发送给服务器(输入exit退出)")
while True:
    message = input("> ")
    if message.lower() == "exit":
        break
    # 发送消息到服务器
    client_socket.sendto(message.encode('utf-8'), server_addr)
    # 接收服务器回复
    reply_data, _ = client_socket.recvfrom(1024)
    print(f"服务器回复: {reply_data.decode('utf-8')}")

client_socket.close()

内容的提问来源于stack exchange,提问作者Aleksej_Shherbak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:39:07