Обычная c проблема, но я не могу найти свою ошибку. Я в основном использовал этот учебный код для реализации моей собственной клиент-серверной программы: клиент отправляет некоторые данные, сервер отображает их (вместо повторения данных, как в учебном пособии)
Повторяющийся учебный код работает, но мой скорректированный код для печати данных на сервере - нет. Я добавил какой-то механизм разделителя для обнаружения всего сообщения. Мой код:
Server.py:
class ThreadedServer:
def __init__(self, host, port):
self.host = host
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.host, self.port))
print("Server bound on Port "+str(port))
def listen(self):
self.sock.listen(5)
while True:
print("Waiting for incoming connections...")
client, address = self.sock.accept()
client.settimeout(60)
print("Starting Working thread.")
threading.Thread(target=self.listenToClientDelimiter, args=(client, address)).start()
def listenToClientDelimiter(self, client, address):
print("Connect to client "+address)
length = None
buffer = ""
while True:
data = client.recv(1024)
print("Received raw data: "+str(data))
if not data:
break # connection closed
buffer += data
while True:
if length is None:
if LENGTH_DELIMITER not in buffer:
break # delimiter not found, wait for next data package
length_str, _, buffer = buffer.partition(LENGTH_DELIMITER)
length = int(length_str)
if len(buffer) < length:
break # wait until full length got received before we proceed
message = buffer[:length]
buffer = buffer[length:]
length = None
# PROCESS MESSAGE HERE
print(message)
client.close()
if __name__ == "__main__":
ThreadedServer('', 65432).listen()
Client.py:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(("127.0.0.1", 65432))
connect_user_cmd = "18:CONNECT_USER;Peter"
print("Trying to send data: "+connect_user_cmd.decode())
print(s.send(connect_user_cmd))
Я запускаю сервер, затем клиент. Вывод с сервера:
Server bound on Port 65432
Waiting for incoming connections...
Как видите, я ожидаю несколько сообщений журнала и, конечно же, свое отправленное сообщение. Клиент выводит это:
Trying to send data: 18:CONNECT_USER;Peter
21
Process finished with exit code 0
Это выводится от клиента, даже когда я не запускаю сервер. Странно то, что эхо действительно работало. Может ли кто-нибудь намекнуть мне в правильном направлении? Спасибо!