首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中运行具有不同端口的多个套接字

在Python中运行具有不同端口的多个套接字
EN

Stack Overflow用户
提问于 2017-08-08 14:53:42
回答 1查看 91关注 0票数 0

我尝试在不同的端口上运行几个套接字,如下所示:

套接字:

代码语言:javascript
复制
import socket

class Receiver:
    TCP_IP = '127.0.0.1'  # by default
    TCP_PORT = 1999  # by default
    BUFFER_SIZE = 1024

    def __init__(self, TCP_IP, TCP_PORT):
        self.TCP_IP = TCP_IP
        self.TCP_PORT = TCP_PORT

    def initialize(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind((self.TCP_IP, self.TCP_PORT))
        s.listen(1)

        conn, addr = s.accept()
        print('Connection address:', addr)
        while 1:
            data = conn.recv(self.BUFFER_SIZE)
            if not data: break
            rdata = 'U'.encode() + data
            print("received data:", data[1:5])
            conn.send(rdata[0:5])  # echo
        conn.close()

和Runner:

代码语言:javascript
复制
from NVGEmulator.Receiver import Receiver
import threading
class FireStarter:

    def starter(self):
        nvgEmu1 = Receiver('127.0.0.1', 2999)
        print("FIRST INITIALIZED")
        nvgEmu1.initialize()

        nvgEmu2 = Receiver('127.0.0.1', 2998)
        nvgEmu2.initialize()
        print("SECOND INITIALIZED")

    def starter_second(self):
        nvgEmu2 = Receiver('127.0.0.1', 2998)
        print("SECOND INITIALIZED")
        nvgEmu2.initialize()

if __name__ == '__main__':
    print("Receiver has been started")
    fs = FireStarter()
    thr = threading.Thread(target=fs.starter())
    thr.start()
    thr.join()

    thr2 = threading.Thread(target=fs.starter_second())
    thr2.start()

当我运行FireStarter时,它只运行socket的第一个实例。我读到有“线程”库,它可以在异步中运行多个进程,但无论如何都没有结果,因为在控制台中我看到“第一次初始化”。如何运行第二个或第三个套接字侦听器?也许有另一种方法可以做到这一点。

EN

回答 1

Stack Overflow用户

发布于 2017-08-08 15:11:33

这段代码有两个问题。

第一个:这里的第二个套接字等待第一个套接字结束,因为它被困在while循环中:

代码语言:javascript
复制
def starter(self):
    nvgEmu1 = Receiver('127.0.0.1', 2999)
    print("FIRST INITIALIZED")
    nvgEmu1.initialize()

    nvgEmu2 = Receiver('127.0.0.1', 2998)
    nvgEmu2.initialize()
    print("SECOND INITIALIZED")

第二个是这个连接语句thr.join(),用来强制第二个线程等待第一个线程,避免并行运行它。

我可能会遵循的方法是在接收器类中的initialize函数中派生一个线程,并在那里管理该线程(可能是扩展Thread类),这样就避免了每次自己派生一个新线程,并且代码更加封装。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45561253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档