一. 前言
当socket服务端通信出现异常时,我们需要做重启程序,可根据具体场景做出选择
二. 示例代码
1. 重启服务
import socket
import time
import sys
import traceback
HOST = '127.0.0.1' # 服务器IP地址
PORT = 8080 # 服务器端口号
BACKLOG = 5 # 服务器监听队列大小,即最多同时接收多少个客户端连接
RECONNECT_INTERVAL = 5 # 重连间隔,单位:秒
def start_server():
while True:
try:
# 创建一个 TCP/IP socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定服务器 IP 地址和端口号
server_socket.bind((HOST, PORT))
# 开始监听客户端连接请求
server_socket.listen(BACKLOG)
print('服务器启动,监听端口:%s' % PORT)
while True:
# 等待客户端连接
print('等待客户端连接...')
client_socket, client_address = server_socket.accept()
try:
print('新客户端连接,地址:%s' % str(client_address))
# 读取客户端发送的数据
data = client_socket.recv(1024)
print('Received data:', data.decode())
# 向客户端发送数据
message = 'Welcome to my server!'
client_socket.sendall(message.encode())
except Exception as e:
print('客户端连接异常,错误信息:%s' % e)
finally:
# 关闭客户端连接
client_socket.close()
print('客户端连接已关闭')
except Exception as e:
print('服务器异常,错误信息:%s' % e)
traceback.print_exc()
# 关闭服务端 socket
server_socket.close()
print('{}s后尝试重连服务器...'.format(RECONNECT_INTERVAL))
time.sleep(RECONNECT_INTERVAL)
if __name__ == '__main__':
# 启动服务器
start_server()
在这个例子中,我们在服务器端加入了一个异常捕获的逻辑,并在发生异常时关闭服务器端 socket,然后等待一段时间后再次重连。需要注意的是,在这个例子中只对 socket.bind() 方法和 socket.listen() 方法进行了异常捕获和处理,如果需要对其他 socket 操作进行异常捕获和处理,则需要在相应的位置添加类似的逻辑。
运行效果如下:
2. kill掉进程,重启服务
import multiprocessing
import os
import threading
import time
import sys
import traceback
import socket
import signal
HOST = '127.0.0.1' # 服务器IP地址
PORT = 8080 # 服务器端口号
BACKLOG = 5 # 服务器监听队列大小,即最多同时接收多少个客户端连接
RECONNECT_INTERVAL = 3 # 重连间隔,单位:秒
def start_server():
while True:
try:
# 创建一个 TCP/IP socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定服务器 IP 地址和端口号
server_socket.bind((HOST, PORT))
# 开始监听客户端连接请求
server_socket.listen(BACKLOG)
print('服务器启动,监听端口:%s' % PORT)
while True:
# 等待客户端连接
print('等待客户端连接...')
client_socket, client_address = server_socket.accept()
try:
print('新客户端连接,地址:%s' % str(client_address))
# 读取客户端发送的数据
data = client_socket.recv(1024)
print('Received data:', data.decode())
# 向客户端发送数据
message = 'Welcome to my server!'
client_socket.sendall(message.encode())
except Exception as e:
print('客户端连接异常,错误信息:%s' % e)
finally:
# 关闭客户端连接
client_socket.close()
print('客户端连接已关闭')
except Exception as e:
print('服务器异常,错误信息:%s' % e)
# 关闭服务器端 socket
server_socket.close()
print('服务器即将重启...')
# 等待一段时间后重启服务器
time.sleep(RECONNECT_INTERVAL)
os.execv(sys.executable, ['python'] + sys.argv)
# os.kill(os.getpid(), signal.SIGTERM)
# print(f"Process {multiprocessing.current_process().pid}: {threading.active_count()} threads")
# print(f"Process {threading.current_thread()}: {threading.active_count()} threads")
# print(f"Total threads: {threading.active_count()}")
# print(f"Total processes: {len(multiprocessing.active_children())}")
if __name__ == '__main__':
# 启动服务
start_server()
运行效果:
在这个例子中,如果服务器端出现异常,它会打印错误消息并关闭服务器端socket
对象,然后等待一段时间后重新启动服务器。这个重启过程使用了os.execv()
函数来实现,它可以重新启动当前进程并运行新的Python程序。
需要注意的是,在服务重启之前,一定要关闭之前的服务端 socket,否则可能会出现 socket 地址已经被占用的问题。而且,在重启之前最好还是将所有的资源释放掉,以免影响到下一次的服务器运行。
另外,这个例子中的重启间隔可以根据实际情况进行调整,程序的运行也需要注意进程和线程的创建是否出现异常情况,确保cpu的运行效率。
查看线程和进程的数量
print(f"Process {multiprocessing.current_process().pid}: {threading.active_count()} threads")
print(f"Process {threading.current_thread()}: {threading.active_count()} threads")
print(f"Total threads: {threading.active_count()}")
print(f"Total processes: {len(multiprocessing.active_children())}")
以上就是关于【socket】 服务端Server异常重启处理简单示例,希望对你有所帮助!