问题描述
我必须制作一个简单的udp echo客户端和服务器,当前我的问题是客户端将自己挂在代码“数据,地址= sock.recvfrom(dataSize)”上。这是我的客户端和服务器代码(我删除了一些api函数,所以时间不长)。我尝试了相同的端口和不同的端口,并且与ip相同,但是我没有收到任何消息。我从一个朋友那里尝试了原始文件,并且他的版本起作用了,两个文件上都有相同的端口和ip以及相同的方法,但是它仍然挂在第一行的echoClient方法receiveMSG上。
echoServerUDP.py
0<0# : ^
'''
@echo off
python "%~f0" %*
pause
exit /b 0
'''
#!/usr/bin/env python
import socket
import json
host = '0.0.0.0'
sport = 11111 # own port
dataSize = 1024
ip_adresses = {}
def echo_server():
receiveSock = socket.socket(socket.AF_INET,socket.soCK_DGRAM)
receiveSock.setsockopt(socket.soL_SOCKET,socket.so_REUSEADDR,1)
receiveSock.bind((host,sport))
print("Starting up echo server on %s port %s" % (host,sport))
while True:
print("Waiting to receive message")
print("Generate a Session ...")
data,address = receiveSock.recvfrom(dataSize)
data = data.decode("utf-8")
if data:
print("receive data: %s from %s" % (data,address))
json_object = json.loads(data)
operation=json_object["operation"]
if operation == "register":
register(json_object["name"],json_object["value"],json_object["sid"])
json_message={"ergebnis":"ok"}
dump = json.dumps(json_message)
sendMSG(bytes(dump,encoding="utf-8"),address)
print("er")
if operation == "unregister":
unregister(json_object["name"],json_object["sid"])
if operation == "query":
query(json_object["sid"])
if operation == "reset":
reset(json_object["sid"])
print("sent %s bytes back to %s" % (data,address))
def sendMSG(data,address):
sendSock = socket.socket(socket.AF_INET,socket.soCK_DGRAM)
sendSock.setsockopt(socket.soL_SOCKET,1)
sendSock.sendto(data,address)
sendSock.close()
if __name__ == '__main__':
echo_server()
,这里是echoClientUDP.py
0<0# : ^
'''
@echo off
python "%~f0" %*
pause
exit /b 0
'''
#!/usr/bin/env python
import socket
import time
import json
from random import randint
host = '127.0.0.1'
sport = 11111
dataSize = 1024
sid= randint(1,10000)
name=socket.gethostname()
own_ip = socket.gethostbyname(name)
def echo_client():
sendSock = socket.socket(socket.AF_INET,socket.soCK_DGRAM)
try:
json_message = {"operation":"register","name":name,"value":own_ip,"sid":sid}
dump = json.dumps(json_message)
print("Sending %s to %s:%s" % (dump,host,sport))
sendMSG(sendSock,dump)
data = receiveMSG(sendSock)
if data:
print("Received: %s" % data)
except Exception as err:
print("Socket error: %s" %str(err))
finally:
print("Closing connection to the server")
sendSock.close()
def sendMSG(sendSock,data):
sendSock.connect((host,sport))
sendSock.sendall(bytes(data,encoding="utf-8"))
def receiveMSG(sock):
data,address = sock.recvfrom(dataSize)
print(data)
return data
if __name__ == '__main__':
echo_client()
解决方法
请在某些方面加倍努力,例如您没有添加任何标题,并且变得更加复杂,我还创建了一个类似的工作脚本,请查看并观察该脚本并对您的脚本进行更改
client.py:-
import socket
import sys
HEADER = 64
PORT = 65432
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER,PORT)
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(ADDR)
def send(msg):
message = msg.encode(FORMAT)
msg_length = len(message)
send_length = str(msg_length).encode(FORMAT)
send_length += b' ' * (HEADER - len(send_length))
client.send(send_length)
client.send(message)
print(client.recv(2048).decode(FORMAT))
def chat():
while True:
try:
a = input()
if 'quit' in a:
sys.exit()
else:
send(a)
except Exception as e:
print(e)
sys.exit()
chat()
server.py:-
import socket
import threading
HEADER = 64
PORT = 65432
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER,PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "Bye"
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(ADDR)
def handle_client(conn,addr):
print(f"[NEW CONNECTION] {addr} connected.")
connected = True
while connected:
msg_length = conn.recv(HEADER).decode(FORMAT)
if msg_length:
msg_length = int(msg_length)
msg = conn.recv(msg_length).decode(FORMAT)
if msg == DISCONNECT_MESSAGE:
connected = False
print(f"[{addr}] left")
print(f"[{addr}] {msg}")
conn.send("Msg received".encode(FORMAT))
conn.close()
def start():
server.listen()
print(f"[LISTENING] Server is listening on {SERVER}")
while True:
conn,addr = server.accept()
thread = threading.Thread(target=handle_client,args=(conn,addr))
thread.start()
print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")
print("[STARTING] server is starting...")
start()
并且我在这里使用了线程处理来使过程更快。
首先在后台运行server.py,然后运行client.py连接到服务器。