Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 客户端无法接收UDP消息_Python_Sockets_Udp - Fatal编程技术网

Python 客户端无法接收UDP消息

Python 客户端无法接收UDP消息,python,sockets,udp,Python,Sockets,Udp,我是使用python进行套接字编程的初学者。我正在做我的课程计划。我的项目的一部分需要使用不同的端口发送和接收UDP消息。提供了名为robot的服务器程序,我需要编写名为student的客户端程序,该程序可以与机器人交互。因此,我无法在服务器程序中显示所有源代码 这是与服务器程序中的UDP套接字相关的部分 ############################################################################# phase 3 # Create a

我是使用python进行套接字编程的初学者。我正在做我的课程计划。我的项目的一部分需要使用不同的端口发送和接收UDP消息。提供了名为robot的服务器程序,我需要编写名为student的客户端程序,该程序可以与机器人交互。因此,我无法在服务器程序中显示所有源代码

这是与服务器程序中的UDP套接字相关的部分

############################################################################# phase 3
# Create a UDP socket to send and receive data
print ("Preparing to receive x...")
addr = (localhost, iUDPPortRobot)
s3 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s3.bind(addr)

x, addr = s3.recvfrom(1)
print ("Get x = %d" % (int(x)))
############################################################################# phase 3

time.sleep(1)
print ("Sending UDP packets:")

messageToTransmit = ""
for i in range(0,int(x) * 2):
    messageToTransmit += str(random.randint(0,9999)).zfill(5)
print ("Message to transmit: " + messageToTransmit)

for i in range(0,5):
    s3.sendto(messageToTransmit.encode(),(studentIP,iUDPPortStudent))
    time.sleep(1)
    print ("UDP packet %d sent" %(i+1))
    
############################################################################# phase 4
这是我的客户程序。s3是UDP套接字。我可以成功地将消息发送到服务器程序,但无法从服务器程序接收消息。这是因为端口不同吗?如果是,我应该怎么做才能修复它

import os
import subprocess
import socket
import random
import time

sendPort = 3310
localhost = '127.0.0.1'
socket.setdefaulttimeout(10)

command = "python robot_for_python_version_3.py"
subprocess.Popen(command)
print("ROBOT IS STARTED")

sendSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sendSocket.connect((localhost, sendPort))
studentId = '1155127379'
sendSocket.send(studentId.encode())

s_2Port = sendSocket.recv(5)
sendSocket.close()

s_2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_2.bind((localhost, int(s_2Port)))
s_2.listen(5)
s2, address = s_2.accept()
s_2.close()

step4Port = s2.recv(12)
iUDPPortRobot, dummy1 = step4Port.decode().split(",")
iUDPPortStudent, dummy2 = dummy1.split(".")

s3 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
num = random.randint(5,10)
time.sleep(3)
s3.sendto(str(num).encode(), (localhost, int(iUDPPortRobot)))
print("Test1")

charStr = s3.recvfrom(1024)
print("Test2")
print(charStr)



exit()

您没有接收到消息的原因是服务器将其发送到未侦听消息的端点。由于协议是UDP(无保证等),服务器将消息成功发送到非侦听端点,而侦听端点将永远等待

更详细地说,
addr
x返回,addr=s3。recvfrom(1)
不是
(studentIP,iUDPPortStudent)
。尝试以下内容以了解差异(注意,您省略了定义并共享
iudportrobot
的部分,为了便于说明,我将其设置为50000):

#在一个交互式会话1(终端)中,我们称之为会话1
>>>导入套接字
>>>随机输入
>>>导入时间
>>> 
>>>IUDPortRobot=50000
>>>地址=('localhost',iUDPPortRobot)
>>>s3=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
>>>s3.绑定(addr)
>>>x,addr=s3.recvfrom(1)#>>charStr=s3.recvfrom(1024)#