Search code examples
javapythontwistedtelnet

Twistd - Telnet - Python server, Java Client, client never receives string until connection closed, when all strings concatenated and sent together


I've got a server written in python running twisted (twistd), and a client written in Java. The idea is that we'll be able to send Strings of encoded data between clients via this server. However, we're finding that clients never send a string to the server (it's never logged on the server as having been received). Does anyone have any ideas?

I've included the code for the client and server below.

Client:

    Socket s = new Socket("localhost", 1025);
    InputStream is = s.getInputStream();
    OutputStream os = s.getOutputStream();
    System.out.println("Before Read");
    System.out.println(is.read());
    System.out.println("After Read");
    os.write("Hello from java!".getBytes());

Server:

class MyChat(basic.LineReceiver):
__opponent = None

def connectionMade(self):
    print "SLOG"
    self.factory.clients.append(self)
    print "SLOG 1"
    self.factory.notInGame.append(self)
    print "SLOG 2"
    while (len(self.factory.notInGame) >= 2):
        x = self.factory.notInGame.pop(0)
        y = self.factory.notInGame.pop(0)
        x.__opponent = y
        y.__opponent = x
    print "SLOG FINISH YAY"

def connectionLost(self, reason):
    print "SLOG Lost a client!"
    self.factory.clients.remove(self)
    if (self.__opponent == None):
        self.factory.notInGame.remove(self)
    else:
        self.__opponent.__opponent = None
        self.factory.notInGame.append(self.__opponent)

def lineReceived(self, data):
    print "SLOG Sender data received"
    if self.__opponent == None:
        self.transport.write("E0") # not in game
        print "SLOG E0"
        return
    self.__opponent.transport.write(data)


from twisted.internet import protocol
from twisted.application import service, internet

factory = protocol.ServerFactory()
factory.protocol = MyChat
factory.clients = []
factory.notInGame = []

application = service.Application("chatserver")
#internet.TCPServer(1025, factory).setServiceParent(application)
reactor.listenTCP(1025, factory)

Any help appreciated - thanks

Sam


Solution

  • LineReceiver accumulates data in a buffer and calls the lineReceived callback when it receives a full line. By default lines are terminated by the byte sequence "\r\n".

    It looks like your Java application sends "Hello from java!". Since it does not send "\r\n" LineReceiver never decides to call lineReceived.