可能是什么原因python说端口被使用时它不是?

时间:2017-08-26 16:55:43

标签: 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.

我不确定您需要哪些代码部分或信息,所以如果您需要任何信息请告诉我。

server.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')

除了端口正在使用之外,我没有任何其他错误。 如果您需要整个服务器,请提供带requirements.txt的压缩文件

2 个答案:

答案 0 :(得分:1)

您要将服务器设置为两次监听 - 一次使用listenWS,一次使用reactor.listenTCP。删除reactor.listenTCP,您可以listenWS为您致电reactor.listenSSL

答案 1 :(得分:0)

这种情况可能有多种原因[一般解决方案],

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

原因2:您可能已终止该应用程序,因此从未调用关闭套接字的指令(例如socket.close())。套接字在某处开放

原因3:这是您唯一的错误消息吗?它是否说明了管理员权限?您是否尝试过以管理员权限运行?