Как закрыть соединение с сокетами в python?

#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)
       [...]