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

244*_*boy 0 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)
Run Code Online (Sandbox Code Playgroud)

客户端:

#!/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))
Run Code Online (Sandbox Code Playgroud)

你看,在我的服务器代码中: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$ 
Run Code Online (Sandbox Code Playgroud)

Jer*_*ner 5

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

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

是的,因为这就是您对服务器进行编程要做的事情。特别是,客户端关闭连接会导致conn.recv(1024)return None,这会导致您的 if 测试成功,然后使break服务器脱离其 while 循环,并从那里服务器退出,因为没有进一步的循环可供执行。

        while True:
            data = conn.recv(1024)
            if not data:
                break
Run Code Online (Sandbox Code Playgroud)

如果您希望服务器之后继续运行(并接受另一个套接字连接),您需要在从while True:该行开始的代码周围放置另一个循环s.accept(),即:

while True:
   conn, addr = s.accept()
   with conn:
       print('Connected by', addr)
       [...]
Run Code Online (Sandbox Code Playgroud)