2017-08-26 2 views
-3

Egal welchen Port Ich habe Python sagt ihr Sein Ich verstehe nicht, warum benutzt, ich bin Was könnte der Grund sein, dass Python sagt, Port wird benutzt, wenn es nicht ist?

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. 

verdrehte

mit bin ich nicht sicher, welche Codeteile Sie oder Informationen benötigen, so, wenn Sie etwas brauchen, lassen Ich weiß es.

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

Ich habe keine Fehler andere dann den Port in Gebrauch zu sein, wenn es nicht. Wenn Sie den ganzen Server krank bieten einen Reißverschluss mit requirements.txt

+0

Sie lief das Programm vor und tat dann Strg + Z. –

+2

'sudo netstat -l | grep 4444' – ShmulikA

+0

Fangen Sie vielleicht versehentlich zwei Server an? Zeigen Sie den Befehl, den Sie verwenden ('twist'?) Und die Quelle des Moduls mit dem Dienst, der gestartet wird. – Ryan

Antwort

1

Sie stellen den Server so ein, dass er zweimal hört - einmal mit listenWS und einmal mit reactor.listenTCP. Entfernen reactor.listenTCP, wie Sie listenWS wollen reactor.listenSSL für Sie anzurufen.

0

Es gibt verschiedene Gründe, benötigen diese [General Lösung] passieren könnte,

Grund 1: Sie haben versucht, kann Ihre Anwendung ausgeführt wird einer der ist reservierte Ports [0-1024], so dass einige Anwendungen den Port tatsächlich verwenden.

Grund 2: Sie können die Anwendung beendet, so wird die Anweisung zum Schließen des Sockets (z. B. socket.close()) nie aufgerufen. Also der Sockel ist irgendwo offen

Grund 3: Ist das Ihre einzige Fehlermeldung? Sagt es etwas über Admin Erlaubnis? Hast du versucht, in der Admin-Berechtigung zu laufen?

+0

Ran als root und dann neu gestartet Server sagt immer noch seine Verwendung – Tinkerbell91

Verwandte Themen