#python #sockets
#python #сокеты
Вопрос:
У меня есть сервер сокетов и клиент сокетов с двумя сторонними программами:
Сервер:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
# Author:sele
import socket
HOST = '127.0.0.1'
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print('Connected by', addr)
if addr and addr[0] != '127.0.0.44':
conn.sendall(b'ip error') # there I want to cut off the socket connection.
else:
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
клиент:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
# Author:lele
import socket
HOST = '127.0.0.1'
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
вы видите, в моем коде сервера: if addr and addr[0] != '127.0.0.44':
там я хочу закрыть соединение, как с этим поступить?
просто ли добавить conn.close()
код в это место?
поскольку я пытался использовать conn.close()
, сервер, похоже, перестал работать:
sele-MacBook-Pro:test01 ldl$ ./tests02-server.py
Connected by ('127.0.0.1', 53321)
sele-MacBook-Pro:test01 ldl$
Ответ №1:
Вызов conn.close()
действительно правильный способ закрыть соединение.
поскольку я пытался использовать conn.close(), сервер, похоже, перестал работать:
Правильно, потому что это то, на что вы запрограммировали сервер. В частности, клиент, закрывающий соединение, вызывает conn.recv(1024)
возврат None
, что приводит к успешному завершению вашего if-теста, а затем break
выводит сервер из цикла while, и оттуда сервер завершает работу, потому что для его выполнения больше нет циклов.
while True:
data = conn.recv(1024)
if not data:
break
Если вы хотите, чтобы сервер продолжал работать (и принимал другое соединение с сокетами) после этого, вам нужно создать еще while True:
один цикл вокруг кода, который начинается со s.accept()
строки, т. е.:
while True:
conn, addr = s.accept()
with conn:
print('Connected by', addr)
[...]