Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行python套接字服务器,如果关闭,则远程启动它,再次侦听_Python_Multithreading_Sockets - Fatal编程技术网

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

运行python套接字服务器,如果关闭,则远程启动它,再次侦听,python,multithreading,sockets,Python,Multithreading,Sockets,我正在努力使python套接字正常工作 有两个主要问题: 1) 当它侦听客户端连接时,程序会暂停,这是一个问题,因为它在IRC客户端python解释器上运行,导致IRC客户端在客户端连接之前不响应 2) 当客户端断开连接时,必须停止整个脚本,然后重新启动,以便让套接字服务器再次侦听 我认为解决方法可能是在单独的线程中启动套接字侦听,这样IRC客户端可以在等待客户端连接时继续。此外,一旦客户端决定关闭连接,我需要一种方法重新启动它 下面的代码很糟糕,不起作用,但它可能会让您了解我在尝试什么: __

我正在努力使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
时,您的程序将在while循环中使用大量的cpu循环,而while循环什么也不做。(顺便说一句,您检查
socketIsOpen
的方式允许竞争条件,您可以在设置之前启动多个线程。)


最后一件事,你应该尝试使用
线程
模块,而不是不推荐使用的
线程

喜欢问题的第一句:)+1使用
getaddrinfo()
这看起来很有希望,我明天会试用,让你知道它是否有效。谢谢。这不起作用,因为循环会导致HexChat IRC客户端暂停,服务器也会过早关闭。在客户端远程关闭连接之前,我需要服务器-客户端连接保持打开状态以进行多次字符串传输。