当前位置: 首页 > 知识库问答 >
问题:

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

李凯定
2023-03-14

我正在努力让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导入就是从该客户端开始的。

共有1个答案

江嘉悦
2023-03-14

您通常对线程套接字服务器进行编程的方式是:

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

最后,您应该尝试使用线程模块,而不是不建议使用的线程

 类似资料:
  • 问题内容: 我敢肯定这是一个简单的问题,但是我不知道socket.io文档在哪里,而http://labs.learnboost.com/socket.io/上的文档并没有真正的帮助。 假设我有一个socket.io http服务器,并写了一个网站来连接它。 我如何为服务器提供保护,以使未经授权的人(未通过网站连接的人)被阻止/丢弃/禁止。 如何在服务器端结束套接字连接?所以如果我有 如何结束套接

  • 我在netty server应用程序中面临资源问题。 无法看到与Netstat的任何打开或挂起的连接... 我使用ReadTimeoutHandler关闭未使用的连接,并使用以下exceptionHandler代码: 服务器引导程序如下所示: 更新2:根据请求,我将日志处理程序移到ReadTimeouthandler前面,以下是日志。客户端通常断开连接的情况: 客户端不断开连接的情况: 所以收盘前

  • 我在tomcat日志中每两分钟就会出现一次异常: 警告nio。ReadHandler[hz.\u hzInstance\u 1\u xyz.IO.thread-in-2]-[127.0.0.1]:5702[xyz][3.2.3]hz_hzInstance_1_xyz。木卫一。线程2关闭套接字到endpoint地址[127.0.0.1]:5701,原因:java。木卫一。EOFEException:

  • 我正在开发一个非常简单的Java客户机/服务器系统(只是为了让我的脚沾满套接字)。由于某种原因,我一直收到“套接字已关闭”错误。。。这是我的密码。。 服务器文件 客户端文件 我在客户端的第41行得到了错误,然后在第46行得到了NullPointerException。。 提前感谢您的帮助。我只是想在这里学习。

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow的主题。 2年前关闭。 改善这个问题 我想在我可以访问的计算机上运行服务器,并且已经能够在本地运行笔记本计算机。 如何设置以便可以 远程 访问? 问题答案: 如果您具有ssh访问将运行服务器的计算机的权限,请执行以下步骤: 1)在将运行 服务器 的机器上,执行: 2)

  • 问题内容: 我有服务器和客户端。我的服务器接受所有连接并返回到客户端字符串。但是当我尝试发送更多行时,它崩溃了 这是我的服务器代码: 这是我的客户代码: 问题答案: 来自in中的javadoc: 关闭返回将关闭关联的套接字。 另外,关闭(和所有其他打印机/写入器)也将关闭其基础流。因此,您可以通过关闭(in ),然后尝试写入已关闭的套接字来关闭您的套接字。 要解决此问题,请不要关闭。垃圾收集将为您