python说正在使用端口,而它没有使用端口的原因可能是什么?

2024-04-24 01:12:24 发布

您现在位置:Python中文网/ 问答频道 /正文

不管我设置了什么端口,Python都说它正在使用,我不明白为什么,我使用的是twisted

Sat Aug 26 12:49:31 2017 - (/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py:980) Couldn't listen on any:4444: [Errno 98] Address already in use.

我不知道你需要什么代码部分或信息,所以如果你需要什么让我知道。你知道吗

服务器.py

import glob
import uuid
from modules import util
from modules import db as _db
from modules import LOG
from objects.user import User
from objects.room import Room
from objects.message import Message
from objects.Table import Table
from autobahn.twisted.websocket import WebSocketServerProtocol, \
    WebSocketServerFactory, \
    listenWS

def hexc(e):
    et, ev, tb = sys.exc_info()
    if not tb:
        return str(e)
    while tb:
        lineno = tb.tb_lineno
        fn = tb.tb_frame.f_code.co_filename
        tb = tb.tb_next
    return "(%s:%i) %s" % (fn, lineno, str(e))

class oChat(WebSocketServerProtocol):
    _rooms = []
    _userlist = Table()
    _commands = Table()
    _commands.user = Table()
    db = _db.db('/home/chat/database.db')

    def onOpen(self):
        self.loadUserCommands()
        self.loadSysCommands()

    def getLevel(self, user):
        if user.mod:
            return 1
        elif user.owner:
            return 2
        else:
            return 0

    def add(self, object):
    if object not in self._rooms:
        self._rooms.append(object)

    def get(self, name):
    for room in self._rooms:
        if room.name == name: 
           return room

    def execFile(self, f, dict):
        with open(f, "r") as file:
            try:
                exec (compile(file.read(), f, 'exec'), dict)
            except:
                execfile(f, dict)
            file.close()
        return dict

    def config(self, value):
        config = {}
        self.execFile("configuration/config.conf", config)
        return config[value]

    def getCommand(self, name):
        name = name.lower()
        if self._commands.has_key(name):
            if not self._commands[name].disabled:
                return self._commands[name]

    def getUserCommand(self, name):
        name = name.lower()
        if self._commands.user.has_key(name):
            if not self._commands.user[name].disabled:
                return self._commands.user[name]


    def setCommand(self, name, desc, func, disabled=False):
        name = name.lower()
        self._commands[name] = Table()
        self._commands[name].desc = desc
        self._commands[name].func = func
        self._commands[name].disabled = disabled

    def setUserCommand(self, name, desc, func, disabled=False, level=0):
        name = name.lower()
        self._commands.user[name] = Table()
        self._commands.user[name].desc = desc
        self._commands.user[name].func = func
        self._commands.user[name].level = level
        self._commands.user[name].disabled = disabled

    def reload(self):
        try:
            self.loadSysCommands()
            self.loadUserCommands()
        except Exception as e:
            print hexc(e)

    def make_user(self, *args):
        return User(*args)

    def make_room(self, *args):
        return Room(*args)

    def make_message(self, *args):
        return Message(*args)

    def loadUserCommands(self):
        files = glob.glob("protocol/user/*.py")
        for file in files:
            b = self.execFile(file, {})
            b['init'](self)

    def loadSysCommands(self):
        files = glob.glob("protocol/*.py")
        for file in files:
            b = self.execFile(file, {})
            b['init'](self)

    def joinRoom(self, room, user, args):
        has_sym = util.has_symbles(args, False)
        room.removeUser(user, self)
        room._sendCommand("uc", str(room.getCount(self)))
        if args in self.db.getRooms():
            room.addUser(user, self)
            user.setNewRoom(room.name)
        self.add(room)
            room._sendCommand("uc", str(room.getCount(self)))
            return True
        else:
            args = args.replace(" ", "-")
            if not has_sym and user.status == "logged_in":
                self.db.addRoom(args, user.name)
                room = Room(args, self)
                self.add(room)
                user.setNewRoom(args)
        room.addUser(user, self)
                self.db.setTitle(room.name, user.name, room.name)
                room._sendCommand('title', room.name)
                room._sendCommand("uc", str(room.getCount(self)))
                return True
            else:
                return False

    def onConnect(self, req):
        self.id = uuid.uuid4().hex
        User(self.id).setIdent(db._ident(str(self.peer.split(":", 2)[1])))
    User(self.id).setConnection(self.id, self)
        msg = "[CONNECT] IP(%s) IDENTITY(%s)" % (str(self.peer.split(":", 2)[1]), User(self.id).ident)
        print(LOG.Log(msg))

    def onMessage(self, payload, isBinary):
        data = payload.decode('utf8').split("::", 1)
        user = User(self.id).get()
        room = self.get(user.roomname)
    if not room: room = Room(user.roomname.lower(), self)
    try: room.check(user, self.db)
    except: pass
        print LOG.Log(payload.decode("utf8"))
        if len(data) > 1:
            cmd, args = data[0], data[1]
        else:
            cmd, args = data[0], ""
        if cmd == "bmsg":
            if args.startswith(self.config("USER_PROTOCOL_SEP")):
                data = args.split(self.config("USER_PROTOCOL_SEP"), 1)
                data = data[1].split(" ", 1)
                if len(data) > 1:
                    cmd, args = data[0], data[1]
                else:
                    cmd, args = data[0], ""
                key = cmd
                cmd = self.getUserCommand(key)
                msg = Message(room.name, user.name, args, ident=user.ident)
                if cmd and self.getLevel(user) >= cmd.level: # user protocol
                    try: cmd.func(self, room, user, msg, args)
            except Exception as e: user._sendCommand('sysmsg', 'er', hexc(e))
            else:
                if not user.banned:
                    key = cmd
                    msg = Message(room.name, user.name, args, ident=user.ident) # just storing the message the bmsg.py handles sending
                    msg.createMessage(self.db, True)
                    cmd = self.getCommand(key)

                    if cmd: # main protocol bmsg
                        if user.status == 'logged_in': cmd.func(self, room, user, msg, args)
            else: user._sendCommand('sysmsg', 'er', 'login or register')
                else:
                    user._sendCommand('sysmsg', 'banned', 'you are banned') # set on sending live msg only
        else:
            key = cmd
        cmd = self.getCommand(key)
            if cmd: # main protocol other
                msg = Message(room.name, user.name, args, ident=user.ident, storeMsg=False)
                try: cmd.func(self, room, user, msg, args)
        except Exception as e: user._sendCommand("sysmsg", "er", hexc(e))

if __name__ == '__main__':
    try:
        import sys
        from twisted.internet import reactor,ssl
    contextFactory = ssl.DefaultOpenSSLContextFactory('/etc/letsencrypt/live/otku.ga/privkey.pem',
'/etc/letsencrypt/live/otku.ga/fullchain.pem')
        factory = WebSocketServerFactory(u"wss://otku.ga:4444")
        factory.protocol = oChat
    listenWS(factory, contextFactory)
        #log.startLogging(sys.stdout)
        #factory.setProtocolOptions(maxConnections=2)
        reactor.listenTCP(4444, factory)
        reactor.run()

    except KeyboardInterrupt:
        print("[ERR] KBI")
    except Exception as e:
        LOG.Log(hexc(e), 'er')

我没有任何错误,除了正在使用的端口,而它不是。 如果你需要整个服务器,我会提供一个带有要求.txt你知道吗


Tags: nameimportselfcmddbdatareturnif
2条回答

您将服务器设置为侦听两次—一次使用listenWS,另一次使用reactor.listenTCP。删除reactor.listenTCP,因为您希望listenWS为您调用reactor.listenSSL。你知道吗

可能发生这种情况的原因有很多[一般解决方案]

原因1:您可能尝试运行的应用程序是保留端口[0-1024]之一,因此某些应用程序可能实际使用该端口。你知道吗

原因2:您可以终止应用程序,因此关闭套接字的指令(例如插座关闭())从未接到过电话。所以插座是开着的

原因3:这是您唯一的错误信息吗?上面写的是关于管理员权限的吗?你试过在管理员权限下运行吗?你知道吗

相关问题 更多 >