python无法让套接字服务器监听线程

时间:2019-09-03 19:31:22

标签: python multithreading sockets

Python 3中的多线程套接字服务器有一个小问题,我似乎无法开始在自己的线程中侦听套接字。我可能离基地很远。

在这里借用了代码:How to make a simple multithreaded socket server in Python that remembers clients

但是我需要在线程内或至少在后台监听客户端。无法弄清楚我在做什么错。

这是我的代码:

`

如您所见,在侦听部分之后我有一些代码,我需要能够在终端上接受输入。但是,代码从未到达那里。

输出非常简单:

import socket
from threading import Thread
from cmd import Cmd

class ThreadedServer(Thread):

  def __init__(self):
    self.host = "127.0.0.1"
    self.port = int(8080)
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.sock.bind((self.host, self.port))

  def listen(self):
    self.sock.listen(5)
    print("[Info]: Listening for connections on {0}, port {1}".format(self.host,self.port))
    while True:
        print("Hello?") # Just debug for now
        client, address = self.sock.accept()
        client.settimeout(60)
        threading.Thread(target = self.listenToClient,args = (client,address)).start()

  def listenToClient(self, client, address):
    size = 1024
    while True:
        try:
            data = client.recv(size)
            if data:
                # Set the response to echo back the recieved data
                response = data
                client.send(response)
            else:
                raise error('Client disconnected')
        except:
            client.close()
            return False

class CommandInput(Cmd):
  # Able to accept user input here but is irrelevant right now
  pass

print("[Info]: Loading complete.")

clientThread = ThreadedServer().listen()
clientThread.start()

print("[Info]: Server ready!")

prompt = CommandInput()
prompt.prompt = '> '
prompt.cmdloop("[Info]: Type \'help\' for a list of commands and their descriptions/use")

我期望:

[Info]: Loading complete.
[Info]: Listening for connections on 127.0.0.1, port 8080
Hello?

有一个可供我键入的光标。

因此,如何正确地使程序在适当的线程中侦听该循环中的客户端,以便可以在命令行中输入提示并处理用户输入(例如,我要实现的命令之一是客户端“发送”,我可以将调试信息发送到连接的客户端)

感谢您可以提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

这可能不是设置所需内容的理想结构,但似乎可以解决您提出的要求。

在终端上启动此脚本后,您可以通过打开一个或多个localhost:8080的浏览器标签来建立示例客户端连接。

import socket
from threading import Thread
from cmd import Cmd

# basic threading tutorial: https://www.tutorialspoint.com/python3/python_multithreading.htm

class ThreadedServer(Thread):

  def __init__(self):
    Thread.__init__(self)  # change here
    self.host = "127.0.0.1"
    self.port = int(8080)
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.sock.bind((self.host, self.port))

  def run(self):    # change here
    self.sock.listen(5)
    print("[Info]: Listening for connections on {0}, port {1}".format(self.host,self.port))
    while True:
        print("Hello?") # Just debug for now
        client, address = self.sock.accept()
        client.settimeout(60)
        Thread(target = self.listenToClient, args = (client,address)).start()   # change here

  def listenToClient(self, client, address):
    size = 1024
    while True:
        try:
            data = client.recv(size)
            if data:
                # Set the response to echo back the recieved data
                response = data
                client.send(response)
            else:
                raise error('Client disconnected')
        except:
            client.close()
            return False


class CommandInput(Cmd):
  # Able to accept user input here but is irrelevant right now
  pass

if __name__ == "__main__":
  print("[Info]: Loading complete.")

  server = ThreadedServer()  # change here
  server.start()  # change here

  print("[Info]: Server ready!")

  prompt = CommandInput()
  prompt.prompt = '> '
  prompt.cmdloop("[Info]: Type \'help\' for a list of commands and their descriptions/use")