Skip to main content
 首页 » 编程设计

python之运行 python 套接字服务器,如果远程关闭,则再次启动它监听

2025年05月04日11daizhj

我正在努力让我的 python 套接字正常运行。

主要有两个问题:

1) 当它监听客户端连接时,程序停止,这是一个问题,因为它在 IRC 客户端 python 解释器上运行,导致 IRC 客户端在客户端连接之前不响应。

2) 当客户端断开连接时,整个脚本必须停止然后再次重新启动,以便让套接字服务器再次监听。

我认为绕过它的方法可能是在一个单独的线程中启动套接字监听,这样 IRC 客户端可以在等待客户端连接时继续。此外,一旦客户端决定关闭连接,我需要一种重新启动它的方法。

下面的代码很糟糕并且无法运行,但它可能会让您了解我正在尝试的内容:

__module_name__ = "Forward Module" 
__module_version__ = "1.0.0" 
__module_description__ = "Forward To Flash Module by Xcom" 
 
 
# Echo client program 
import socket 
import sys 
import xchat 
import thread 
import time 
 
HOST = None               # Symbolic name meaning all available interfaces 
PORT = 7001              # Arbitrary non-privileged port 
s = None 
socketIsOpen = False 
 
def openSocket(): 
    # start server 
    print "starting to listen" 
 
    for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, 
                                  socket.SOCK_STREAM, 0, socket.AI_PASSIVE): 
        af, socktype, proto, canonname, sa = res 
        try: 
            s = socket.socket(af, socktype, proto) 
        except socket.error as msg: 
            s = None 
            continue 
        try: 
            s.bind(sa) 
            s.listen(1) 
        except socket.error as msg: 
            s.close() 
            s = None 
            continue 
        break 
    if s is None: 
        print 'could not open socket' 
        global socketIsOpen = False 
        sys.exit(1) 
    conn, addr = s.accept() 
    print 'Connected by', addr   
    global socketIsOpen = True 
 
def someone_said(word, word_eol, userdata): 
    username = str(word[0]) 
    message = str(word[1]) 
    sendMessage = username + " : " + message 
    send_to_server(sendMessage) 
 
 
 
def send_to_server(message): 
    conn.send(message) 
 
 
def close_connection(): 
    conn.close() 
    print "connection closed" 
 
 
xchat.hook_print('Channel Message' , someone_said) 
 
def threadMethod(arg) : 
    while 1: 
        if (not socketIsOpen) : 
            openSocket() 
 
try:  
    thread.start_new_thread(threadMethod, args = []) 
except: 
    print "Error: unable to start thread" 

python 在名为 HexChat 的 IRC 客户端上运行,这是 xchat 导入的来源。

请您参考如下方法:

通常编写线程套接字服务器的方式是:

  • 在循环中调用accept()
  • 生成一个新线程来处理新连接

一个非常小的例子是这样的:

import socket 
import threading 
import time 
 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind(('0.0.0.0', 9999)) 
server.listen(1) 
 
def handle(conn): 
    conn.send(b'hello') 
    time.sleep(1)  # do some "heavy" work 
    conn.close() 
 
while True: 
    print('listening...') 
    conn, addr = server.accept() 
    print('handling connection from %s' % (addr,)) 
    threading.Thread(target=handle, args=(conn,)).start() 

您正在生成新的线程,在其中创建您的监听套接字,然后接受并处理您的连接。当 socketIsOpen 为 True 时,您的程序将使用大量 cpu 循环通过您的 while 循环,什么都不做。 (顺便说一句,您检查 socketIsOpen 的方式允许竞争条件,您可以在设置之前启动多个线程。)

最后一件事,您应该尝试使用 threading 模块而不是已弃用的 thread。