Как закрыть сокет-соединение в python? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть сокет-сервер и сокет-клиент двух сторонних программ:

Сервер:

#!/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 Ответ

1 голос
/ 13 апреля 2019

Вызов 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)
       [...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...