I have the following situation:
SomeServer(S) <-> (C)MyApp(S) <-> (C)User
(S) represents a server socket
(C) represents a client socket
Essentially, MyApp initiates a connection with SomeServer ( SomeServer (S) ↔ (C) MyApp ) and after some authentication procedures, MyApp (S) successfully starts to wait ( C) for the user to connect. As soon as the User connects, MyApp transfers the data from SomeServer to the User . This happens in both directions.
My SomeServer (S) ↔ (C) MyApp works fine, but I can not get MyApp (S) ↔ (C) User . I get to the User connecting to MyApp (S) , but can not get relayed data!
Ok, I hope some of them are clear;) Now let me show my code for MyApp . The BTW implementation of SomeServer and the User is not suitable for solving my question, since none of them can be changed.
I commented on my code indicating where I am having problems. Oh, I should also mention that I have no problem breaking the entire “Server Section” for some other code, if necessary. This is POC, so the focus is on working with functionality, rather than writing efficient code. Thank you for your time.
''' MyApp.py module '''
import asyncore, socket
import SSL
class MyAppClient(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((host, port))
connectionPhase = 1
def handle_read(self):
print "connectionPhase =", self.connectionPhase
if self.connectionPhase < 3:
data = self.recv(1024)
print 'Received:', data
rs = RelayServer(('localhost', 8080), self.socket)
print 'RelayServer started'
elif self.connectionPhase == 3:
data = self.recv(1024)
print 'Received data - forward to User:', data
class RelayConnection(asyncore.dispatcher):
def __init__(self, client, sock):
asyncore.dispatcher.__init__(self)
self.client = client
print "connecting to %s..." % str(sock)
def handle_connect(self):
print "connected."
self.client.is_readable = True
def handle_read(self):
self.client.send(self.recv(1024))
class RelayClient(asyncore.dispatcher):
def __init__(self, server, client, sock):
asyncore.dispatcher.__init__(self, client)
self.is_readable = False
self.server = server
self.relay = RelayConnection(self, sock)
def handle_read(self):
self.relay.send(self.recv(1024))
def handle_close(self):
print "Closing relay..."
self.relay.close()
self.close()
def readable(self):
return self.is_readable
class RelayServer(asyncore.dispatcher):
def __init__(self, bind_address, MyAppClient_sock):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.bind(bind_address)
self.MyAppClient_sock = MyAppClient_sock
print self.MyAppClient_sock
self.listen(1)
def handle_accept(self):
conn, addr = self.accept()
RelayClient(self, conn, self.MyAppClient_sock)
if __name__ == "__main__":
connectionPhase = 1
c = MyAppClient('host', port)
asyncore.loop()
EDIT:
@samplebias I replaced my complete module with your code (not shown), and I re-added all the bits and pieces that I need for authentication, etc.
At this point, I get the same result as my own code above. I mean that MyApp (or the Server in your code) is connected to SomeServer and transfers data back and forth. So far so good. When a user (or client application) connects to localhost 8080, this code runs:
if not self.listener:
self.listener = Listener(self.listener_addr, self)
BUT this is not fulfilled
elif self.user:
print 'self.user'
self.user.send(data)
, . User, , , init - . handle_read() .
?