정말 짧고 쉬운 질문이 있습니다.
다른 파이썬 파일 / 클래스 에서 send () 메서드를 호출하는 방법은 무엇입니까? 다른 구성 요소에서 클라이언트로 메시지를 보내고 싶습니다 (연결이 설정 됨).
싱글 톤 인스턴스의 참조를 가져 와서 다음과 같이 "보내야"한다고 생각했습니다.
server = Server(ip,port)
server.send("hello")
그렇게하면 오류가 발생합니다.
NoneType' object has no attribute 'send'
어쩌면 "자기"가 여기에 문제가있을 수도 있습니다 ...
다음은 서버 클래스입니다.
class Server(threading.Thread):
##############################################################################
# Server: Singleton Instance
##############################################################################
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Server, cls).__new__(cls, *args, **kwargs)
return cls._instance
##############################################################################
# Constructor of Server
##############################################################################
def __init__(self, host, port):
threading.Thread.__init__(self)
print "[SERVER____] Creating Server Thread"
self.host = host
self.port = port
self.__reset__()
##############################################################################
# Resetting local attributes
##############################################################################
def __reset__(self):
print "[SERVER____] Reset"
self.serverSock = None
self.clientSock = None
self.clientAddr = None
self.clientData = None
self.isRunning = None
self.isWaiting = None
###########################################################################
def send(self, message):
print "[SERVER____] Sending Message", message
self.clientSock.send(message)
##############################################################################
# Stop the Server: Close the Socket and Reset
##############################################################################
def stop(self):
# Close The Client Socket
if(self.clientSock):
self.clientSock.close()
print "[SERVER____] Aborting Client Socket"
# Close The Server Socket
if(self.serverSock):
self.serverSock.close()
print "[SERVER____] Aborting Server Socket"
# Reset the Member Fields
self.__reset__()
print "[SERVER____] Aborting Server Thread"
self._Thread__stop()
##############################################################################
# Server.start()
##############################################################################
def run(self):
try:
# Create The Socket
self.serverSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "[SERVER____] Creating Server Socket"
# Set Socket Options
#self.serverSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1);
# Bind The New Socket
self.serverSock.bind((self.host, self.port))
print "[SERVER____] Binding Server Socket"
print "[SERVER____] IP: ", self.host, " Port: ", self.port
# Set The Awaiting Flag
self.isWaiting = True;
# Start The Server Loop
while self.isWaiting:
# Listen On New Socket
self.serverSock.listen(1)
print "[SERVER____] Listening Server Socket"
# Accept New Connection
self.clientSock, self.clientAddr = self.serverSock.accept()
print "[SERVER____] Accepting New Connection: " , self.clientAddr
# Set The Running Flag
self.isRunning = True;
# Serve The Connection
while self.isRunning:
print "[SERVER____] Want to recv message...."
try:
# Receive A New Data Block
self.clientData = self.clientSock.recv(config.BUFFERSIZE)
# Process The New Data Block
if not self.clientData:
print "[SERVER____] Reset By Client Connection"
break
else:
print "[SERVER____] Receiving Message: ", self.clientData
parser = MessageParser()
parser.parseSMMessage(self.clientData)
except socket.error:
print "[SERVER_ERR] Error at receiving data from client."
except Exception as exc:
print "[SERVER____] Server Thread Exception ", exc
싱글 톤 패턴의 구현이 잘못되어을 호출 self.clientSock
하기 None
전에 로 설정됩니다 self.clientSock.send
. __init__
싱글 톤 인스턴스를 가져올 때마다 호출되므로 구현이 잘못되었습니다 . 기본적으로 발생하는 일은 다음과 같습니다.
Server(...)
인스턴스를 가져 오기 위해 호출 합니다.run
해당 인스턴스에서 호출됩니다. 이것은 self.clientSock
.Server(...)
인스턴스를 다시 가져 오기 위해 호출 합니다. 이 구현으로 인해 동일한 인스턴스가 반환 __new__
되지만 __init__
이 인스턴스 에서 다시 호출되어 self.clientSock
로 재설정됩니다 None
.self.clientSock.send
인해 예외 가 발생합니다.__new__
싱글 톤이 필요한 경우 사용하지 않는 것이 좋습니다 (단일 톤을 전혀 사용하지 않는 것이 가장 좋습니다). 다른 방법은 여기 에 나열되어 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다