【问题标题】:How do I send UDP packets to the UDP server I have created in Python (3.7.3)?如何将 UDP 数据包发送到我在 Python (3.7.3) 中创建的 UDP 服务器?
【发布时间】:2019-09-08 17:27:28
【问题描述】:

请允许我开始说我是 Python 新手(CS 一年级学生),这是我正在学习的第一门编程语言。

我有一个包含 2 个部分的作业;客户端和服务器

在服务器端我正在尝试:

1) 创建一个不断等待 UDP 消息并等待两个不同的 UDP 消息(字符串 1 和字符串 2)的服务器

2) 然后它将 2 个数据包的字符串连接为 string3,并在单个 UDP 数据包中将其发送到客户端并重新开始。

例如服务器接收string1和string2为pinea和pples,构造菠萝为string3并将string3发送给客户端

在客户端,我需要编写一些代码: 1) 启动时提示客户端输入字符串#

2) 将该字符串拆分为 2 (n/2 如果 n 是偶数并且 (n+1)/2 和 (n-1)/2 如果 n 是奇数)

3) 在单独的 UDP 数据包中等待来自服务器的字符串

4) 检查来自服务器的字符串是否 = 两个拆分字符串的连接

5) 显示最终答案的结果

例如用户输入字符串为菠萝,客户端发送字符串 1 和字符串 2 为 pinea 和 pples;然后从服务器接收 string3 作为菠萝并检查 string3==string1+string2。

我想弄清楚为什么在设置我的服务器后我无法向服务器发送数据包。

我目前正在使用 Python IDLE 3.7.3,我观看了很多视频并阅读了其他一些堆栈溢出论坛,但无法确定问题所在,如前所述,我是初学者,将不胜感激任何帮助

这是我的代码:

对于我拥有的服务器:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
address = ("127.0.0.1", 5002)
sock.bind (address)

while True:
    data,addr= sock.recvfrom(1024)
    print (data)
    print (addr)

sock.listen(5)

我的客户端代码如下:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s=str(input("Please input a word: "))
string1 = s[:len(s)//2]
string2 = s[:len(s)//2:] 
message1= string1.encode()
message2= string2.encode()
sock.sendto(message1+message1,("127.0.0.1",5002))
received= sock.recv(1024)
received==string1+string2

while True:
    print (message1, message2)
    print (received)

当我尝试运行我的客户端代码时,我目前收到错误消息“现有连接被远程主机强制关闭”。

非常感谢(这也是我第一次使用 Stack Overflow,所以如果我在帖子中做了任何不恰当的事情,请告诉我,以便我纠正)

【问题讨论】:

  • received== ?....最后一个while循环只是永远打印?
  • 请不要在每个代码行都加倍空格,或者给所有代码行添加额外的缩进。如果您认为编辑器/IDE 对代码的运行方式有任何影响,请直接使用 Python 从命令行运行它。

标签: python server udp packet


【解决方案1】:

您的代码结构似乎很奇怪,while 不按顺序循环/做一些无意义的事情等等...

我已经整理/重写了您的代码,以便对我有用。我正在使用上下文管理器以便很好地清理套接字。对于服务器,类似:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
    sock.bind(("127.0.0.1", 5002))

    while True:
        data, addr = sock.recvfrom(8192)
        print(data, addr)
        sock.sendto(b"hi from server", addr)

和客户:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
    sock.connect(("127.0.0.1", 5002))

    sock.send(b"hi from client")
    print(sock.recvfrom(8192))

UDP 显然是“无连接”,但调用connect 允许执行一次名称解析,而不是每次send。为了简单起见,我还对发送的消息进行了硬编码。

在调试时,它有助于消除尽可能多的复杂性,在这种情况下,读取输入似乎与网络代码无关。

我还建议使用socket.getaddrinfo,这样您的代码可以更轻松地使用 IPv6,但这是一个单独的问题。

【讨论】:

  • 非常感谢山姆。我运行了客户端代码,收到如下错误信息: ConnectionResetError: [WinError 10054] An existing connection wasforced closed by the remote host 我在网上看了看,有人说这只是因为连接已经计时出去……我错过了什么吗?我的服务器代码末尾不需要 sock.listen() 吗?谢谢!
  • listen 主要用于 TCP 套接字,因此不适用于 UDP。 UDP 不使用“连接”,因此它们不会超时。我猜想某种防火墙交互..另外,你在同一台计算机上运行这些,不是吗?在收到错误之前需要多长时间。我也有几年没碰过 Windows 电脑了,所以帮不上什么忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多