我有套接字服务器和套接字客户端两个端程序:
服务器:
#!/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)
调用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)
| 归档时间: |
|
| 查看次数: |
32254 次 |
| 最近记录: |