在tcp客户端连接后,可持续接收客户端发送的信息。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
HOST = '0.0.0.0'
PORT = 8880
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen(5)
print '[*] 服务器已启动 (长连接模式),正在监听 %s:%s' % (HOST, PORT)
print '[*] 客户端连接后可发送多条消息,输入 "quit" 或 "exit" 断开连接'
while True:
# 等待新客户端连接
client_conn, client_addr = server_socket.accept()
print '\n[+] 接收到来自 %s:%s 的新连接,进入对话模式' % (client_addr[0], client_addr[1])
try:
# 保持与当前客户端的连接,循环接收消息
while True:
# 接收数据
data = client_conn.recv(1024)
if not data:
# 客户端正常关闭连接(发送了空数据)
print '[-] 客户端 %s:%s 已主动断开连接' % (client_addr[0], client_addr[1])
break
# 解码数据(Python 2中recv返回的是字符串)
message = data.strip()
print '[%s:%s] 收到: %s' % (client_addr[0], client_addr[1], message)
# 检查是否为退出指令
if message.lower() in ('quit', 'exit', 'bye'):
response = 'Goodbye! Connection will be closed.\n'
client_conn.sendall(response)
print '[-] 客户端请求退出,断开与 %s:%s 的连接' % (client_addr[0], client_addr[1])
break
# 处理业务逻辑(这里示例:将消息转为大写并返回)
# 你可以在这里替换成你的实际处理逻辑
processed_message = message.upper()
response = 'Server processed: %s\n' % processed_message
# 发送响应
client_conn.sendall(response)
print '[ ] 已发送响应: %s' % response.strip()
except socket.error as e:
# 客户端异常断开(如网络故障)
print '[!] 与 %s:%s 的连接异常: %s' % (client_addr[0], client_addr[1], str(e))
finally:
# 确保连接被关闭
client_conn.close()
print '[ ] 连接 %s:%s 已清理\n' % (client_addr[0], client_addr[1])
如果提示:
bash
[zhao@ tcpServeringTest]$ python tcpServer.py
Traceback (most recent call last):
File "tcpServer.py", line 10, in <module>
server_socket.bind((HOST, PORT))
File "/usr/lib64/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use
[zhao@ tcpServeringTest]$
那些按如下执行,终止之前的tcp服务
bash
[zhao@ tcpServeringTest]$
[zhao@hljcors tcpServeringTest]$ sudo netstat -tlnp | grep :8880
tcp 0 0 0.0.0.0:8880 0.0.0.0:* LISTEN 3658/python
[zhao@ tcpServeringTest]$
[zhao@ tcpServeringTest]$
[zhao@tcpServeringTest]$ sudo kill -9 3658
[1]+ Killed python tcpServer.py
[zhao@ tcpServeringTest]$