如何在python中关闭套接字连接?

时间:2019-04-13 04:11:02

标签: python sockets

我有套接字服务器和套接字客户端两个辅助程序:

服务器:

#!/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 个答案:

答案 0 :(得分:1)

调用conn.close()确实是关闭连接的正确方法。

  

因为我尝试使用conn.close(),所以服务器现在似乎停止运行:

对,因为这就是您对服务器进行编程的方式。特别是,关闭连接的客户端会导致conn.recv(1024)返回None,这会导致if-test成功,然后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)
       [...]