我有套接字服务器和套接字客户端两个辅助程序:
服务器:
#!/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$
答案 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)
[...]