Есть несколько проблем с вашим кодом, но одна, которая, вероятно, решит вашу проблему, устанавливает параметр сокета SO_REUSEADDR
с помощью:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
после создания сокета (с socket.socket(...)
но за до вы пытаетесь связать адрес (с s.bind()
.
. С другой стороны, две "половины" кода довольно противоречивы - как вы копировали ивставил код из двух разных мест и попытался их использовать? (Один использует менеджер контекста и синтаксис Python 3 print
, а другой использует синтаксис Python 2 print
...)
Но я написалдостаточно сокетных программ, чтобы я мог расшифровать практически все что угодно, так что вот рабочая версия вашего кода (с некоторыми довольно неоптимальными параметрами, например, размером буфера 1, но как иначе вы могли бы ожидать перехват одного ;
?)
Сервер:
import socket
HOST = '127.0.0.1' # The server's hostname or IP address
PORT = 8192 # The port used by the server
BUFFER_SIZE = 1
def server_socket():
data = []
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST,PORT))
s.listen()
while 1: # Accept connections from multiple clients
print('Listening for client...')
conn, addr = s.accept()
print('Connection address:', addr)
while 1: # Accept multiple messages from each client
buffer = conn.recv(BUFFER_SIZE)
buffer = buffer.decode()
if buffer == ";":
conn.close()
print("Received all the data")
for x in data:
print(x)
break
elif buffer:
print("received data: ", buffer)
data.append(buffer)
else:
break
server_socket()
Клиент:
import socket
import json
HOST = '127.0.0.1' # The server's hostname or IP address
PORT = 8192 # The port used by the server
def json_message(direction):
local_ip = socket.gethostbyname(socket.gethostname())
data = {
'sender': local_ip,
'instruction': direction
}
json_data = json.dumps(data, sort_keys=False, indent=2)
print("data %s" % json_data)
send_message(json_data + ";")
return json_data
def send_message(data):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(data.encode())
data = s.recv(1024)
print('Received', repr(data))
json_message("SOME_DIRECTION")