http://www.binarytides.com/programming-udp-sockets-in-python/의 예제를 기반으로 파이썬 3에서 실행되도록 수정하고 클라이언트와 서버에서 두 개의 반대 포트를 사용하므로 각각의 응답이이 포트로 이동합니다. 여기 내 예다른 일치하는 들어오는 나가는 포트가있는 파이썬 UDP 클라이언트 - 서버
이서버 :
'''
Simple udp socket server
'''
import socket
import sys
HOST = 'localhost'
PORT_IN = 8889 # Arbitrary non-privileged port
PORT_OUT = 8888
# Datagram (udp) socket
try :
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print('Socket created')
except socket.error as e:
print(e)
sys.exit()
# Bind socket to local host and port
try:
s.bind((HOST, PORT_IN))
except socket.error as e:
print(e)
sys.exit()
print('Socket bind complete')
#now keep talking with the client
while 1:
# receive data from client (data, addr)
d = s.recvfrom(1024)
data = d[0]
addr = d[1]
if not data:
break
reply = 'OK...' + str(data)
s.sendto(reply.encode('UTF-8'), ('localhost', PORT_OUT))
print('Message[' + addr[0] + ':' + str(addr[1]) + '] - ' + str(data).strip())
s.close()
클라이언트 :
'''
udp socket client
Silver Moon
'''
import socket #for sockets
import sys #for exit
# create dgram udp socket
try:
s1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error:
print('Failed to create socket')
sys.exit()
host = 'localhost'
port_out = 8889
port_in = 8888
counter = 0
while(1) :
# msg = b'aoua'
msg = 'aoua' + str(counter)
try :
#Set the whole string
s1.sendto(msg.encode('UTF-8'), (host, port_out))
# receive data from client (data, addr)
s2.bind(('localhost', port_in))
d = s2.recvfrom(1472)
reply = d[0]
addr = d[1]
print('Server reply : ' + str(reply))
except socket.error as e:
print(e)
# sys.exit()
counter += 1
문제는 모든 서버에서 응답 및 오류 [WinError 10022] An invalid argument was supplied
와 d = s2.recvfrom(1472)
중지를받을 수없는 클라이언트입니다. sock.settimeout(seconds)
과 약간 다른 동작을 발견했지만 실제로 그 이유를 알 수는 없습니다. d = s2.recvfrom(buffer)
은 들어오는 데이터를 기다리지 않아야합니까? 여기에 무엇이 누락 되었습니까?