2017-08-26 67 views
-3

不管我设置的Python说,它正在使用我不明白为什么,我使用什么端口扭曲python说端口被使用的原因是什么?

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

+0

您之前运行了该程序,然后执行了Ctrl + Z。 –

+2

'sudo netstat -l | grep 4444' – ShmulikA

+0

你可能意外启动了两台服务器?显示你正在使用的命令('twist'?)以及启动服务的模块的来源。 – Ryan

回答

1

您正在将服务器设置为侦听两次 - 一次使用listenWS,一次使用reactor.listenTCP。删除reactor.listenTCP,因为您想listenWS为您拨打reactor.listenSSL

0

有各种原因,这可能发生[常规解决方案],

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

原因2:您可能会终止应用程序,因此关闭套接字(例如socket.close())的指令永远不会被调用。所以插座是开放的地方

原因3:这是你唯一的错误信息?它是否说有关管理权限的任何内容?你有没有尝试在管理权限运行?

+0

以root身份运行,然后重新启动服务器仍然表示正在使用它 – Tinkerbell91

相关问题