如何与来自 Java 的 python Twisted 服务器成功通信?

How to communicate with a python Twisted server from Java successfully?

这些问题听起来可能很愚蠢,但我对网络这个东西还是陌生的。 我已经尝试了好几天来实现一个与 Twisted 服务器一起工作的客户端,但我无法从服务器获得任何响应。我阅读了很多文档并观看了一些教程,并且修复了一些内容并更好地理解了一些概念。

在开始提问之前,我想先向您展示我的代码。这是我用来与基于 Twisted 的服务器通信的方式:

        val socketfactory: SocketFactory = SocketFactory.getDefault()
        val socket = socketfactory.createSocket(host, port)
        socket.keepAlive = true
        socket.tcpNoDelay = true
        val isSocketConnected = socket.isConnected //this checks socket's connectivity
        val dOut = DataOutputStream(socket.getOutputStream())
        val dIn = DataInputStream(socket.getInputStream())
        
        val teststring = "Hi server!"
        dOut.writeUTF(teststring)
        Log.d("MILESTONE", "MESSAGE SENT AT THIS POINT, Socket is connected ?: $isSocketConnected")
        
        var testreader = ""
        while (true) {
            testreader = dIn.readUTF()
            Log.d("READING:", "RECEIVED THIS: $testreader")
        }
        

我的代码似乎永远不会到达第二个“日志”行。它永远不会到达那里。我认为那是因为我从未从服务器获得任何输入。这让我很困惑。因为“socket.isConnected”returns是真的。这是否意味着客户端(我)和服务器之间存在持续连接?但是当我发送任何输出时,服务器不会回复。

所以我的问题是: 1-我做错了什么吗?为什么我没有收到来自服务器的通话并且它阻止了代码? 2- SocketFactory 是必需的吗? 3- 是否有任何库与来自 Java 的 Twisted 通信?

提前致谢!

对于正在努力与 Twisted-运行 python 服务器进行通信的每个人,我提供了有史以来最好的解决方案!检查 Twisted 的开源代码后,我开始意识到它有一个“LineReceiver”class,它只在行结束时才响应消息。换句话说,您可以一直发送数据,并且在您完成该行并开始新的行之前它永远不会响应。当使用分隔符时,Twisted 会知道该行已经结束。 (它是在服务器端配置的)。大多数服务器 运行 Twisted 将使用行分隔符:“\r\n”

这就是棘手的事情!一旦你发送那个小字符串,它就会开始回应你。这是一个例子:

      val dOut = DataOutputStream(socket.getOutputStream()) //This is my favorite way of sending data!
      val dIn = socket.getInputStream().bufferedReader(Charsets.UTF_8) //This is my favorite way of reading data ! 
      val teststring = "hi server! \r\n" //This is the tricky part !

就是这样!之后你所要做的就是从 bufferedReader 中读取行,就像这样!

var testreader: List<String>
        while (true) {
            testreader = dIn.bufferedReader(Charsets.UTF_8).readLines()
            for (line in testreader)
                Log.e("MILESTONE", line)

        }

在我开始读取输入后,我发现服务器实际上开始向我发送字符串并与我通信。我希望每个人都能让他们的代码在这方面或任何其他方面发挥作用!