【问题标题】:Python UDP Server/ClientPython UDP 服务器/客户端
【发布时间】:2020-06-22 17:48:13
【问题描述】:

我正在尝试创建一个简单的 UDP 服务器和客户端,它们将仅交换其连接的字符串确认。但是,我的客户端程序虽然似乎已连接,但并没有执行数据传输。

这是我的服务器的代码,我很确定这段代码没问题,因为我能够让其他人连接他们的 UDP 客户端并且执行很好。

#!/usr/bin/env python

################ UDP SERVER ################################

import socket
import threading
import sys


ip = sys.argv[1] # this is local host
port = int(sys.argv[2])    # we'll start here.

sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM)

done = False
while not done:
   try:                                       # servers must bind an ip address and a port to work
     sock.bind((ip, port))
     done = True
     print("Listening on Port: " + str(port))
   except:
     print("Cannot connect to Port: " + str(port))
     port += 1 

def handel( a_socket):
  request = a_socket.recv(1024)
  print(str(request))
  a_socket.send("Thank you sir!")              # the acknowledgement 
  a_socket.close()                             # close the socket so it is NOT locked up.

while True:  
  message,addr = sock.recvfrom(2500) # OK someone pinged me.
  print( "received from "+str(addr)+': '+str(message) )
  sock.sendto("Thank you!",addr)
  sock.close()
  sys.exit()
  break

这是我的错误 UDP 客户端程序

#!/usr/bin/env python

##################### UDP CLIENT #############################

import socket
import ssl
import sys

if len(sys.argv) < 3:
   print "USAGE program IP port "
   sys.exit()

try:
  ip = sys.argv[1]
  port = int(sys.argv[2])
except:
   print "USAGE program IP port "
   sys.exit()

def listen(ip, port):
  sox = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  try:
    sox.connect((ip, port))
    print("UDP server listening on Port: " +str(port))
    data, addr = sox.recvfrom(1024)
    print("Received: ", data, addr)
    sox.sendto("Thank you!", addr)
    sox.close()
  except:
    print("UDP server not listening on Port: " + str(port))
    sys.exit()

listen(ip, port)

用 Python 2.7 编写,需要两个命令行输入 ip 地址和端口号。让我知道您的想法,感谢您的宝贵时间!

【问题讨论】:

  • 您的服务器等待接收数据报,然后发送响应。您的客户端还等待接收数据报,然后发送响应。既然他们都在等对方说话,他们没有取得太大进展也就不足为奇了。但是 +1 是一个很好的问题。

标签: python server udp client


【解决方案1】:

以下是针对工作客户端和服务器的一些调整。客户端不需要在套接字上调用 connect(),它应该在调用 recvfrom() 之前调用 sendto()。向客户端添加超时是个好主意。

请注意,如果您想绑定到所有可用的 IPv4 地址,请指定 0.0.0.0 或 "" 作为服务器上的 IP 地址。

server.py

#!/usr/bin/env python

################ UDP SERVER ################################

import socket
import sys

if len(sys.argv) < 3:
    print("USAGE: server.py IP port")
    sys.exit()

ip = sys.argv[1]           # this is local host
port = int(sys.argv[2])    # start port here

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:
    try:
        # server must bind to an ip address and port
        sock.bind((ip, port))
        print("Listening on Port:", port)
        break
    except Exception:
        print("ERROR: Cannot connect to Port:", port)
        port += 1

try:
    while True:
        message, addr = sock.recvfrom(1024)  # OK someone pinged me.
        print(f"received from {addr}: {message}")
        sock.sendto(b"Thank you!", addr)
except KeyboardInterrupt:
    pass
finally:
    sock.close()

client.py

#!/usr/bin/env python

##################### UDP CLIENT #############################

import socket
import sys

if len(sys.argv) < 3:
    print("USAGE: client.py IP port")
    sys.exit()

try:
    ip = sys.argv[1]
    port = int(sys.argv[2])
except Exception:
    print("USAGE: client.py IP port")
    sys.exit()

def listen(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        print("UDP sending on Port:", port)
        sock.settimeout(5)
        sock.sendto("Hello".encode(), (ip, port))
        print("message sent")
        print("waiting for response on socket")
        data, addr = sock.recvfrom(1024)
        print("Received:", data.decode(), addr)
    except socket.timeout:
        print("ERROR: acknowledgement was not received")
    except Exception as ex:
        print("ERROR:", ex)
    finally:
        sock.close()

listen(ip, port)

服务器输出

> python server5.py localhost 8000
Listening on Port: 8000
received from ('127.0.0.1', 54773): b'Hello'

客户输出

> python client5.py localhost 8000
UDP sending on Port: 8000
message sent
waiting for response on socket
Received: Thank you! ('127.0.0.1', 8000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多