一. 前言

当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 操作进行异常捕获和处理,则需要在相应的位置添加类似的逻辑。

运行效果如下:

Python - 【socket】 服务端Server异常重启处理简单示例Demo(二)_python

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()

运行效果:

Python - 【socket】 服务端Server异常重启处理简单示例Demo(二)_python_02

在这个例子中,如果服务器端出现异常,它会打印错误消息并关闭服务器端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异常重启处理简单示例,希望对你有所帮助!