【问题标题】:How to communicate with a python Twisted server from Java successfully?如何从 Java 成功与 python Twisted 服务器通信?
【发布时间】:2021-11-12 18:27:51
【问题描述】:

这些问题可能听起来很傻,但我对网络这个东西很陌生。 我已经尝试了好几天来实现一个与 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”返回 true。这是否意味着客户端(我)和服务器之间存在持续的连接?但是当我发送任何输出时,服务器不会回复。

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

提前致谢!

【问题讨论】:

    标签: java python kotlin twisted socketfactory


    【解决方案1】:

    对于所有努力与 Twisted 运行的 python 服务器进行通信的人来说,我提供了有史以来最好的解决方案!在检查了 Twisted 的开源代码后,我意识到它有一个“LineReceiver”类,它只在线路完成时才响应消息。换句话说,您可以一直发送数据,并且在您完成一行并开始新的一行之前,它永远不会响应。当使用分隔符时,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)
    
            }
    

    在我开始阅读输入后,我发现服务器实际上开始向我发送字符串并与我进行通信。我希望每个人都能让他们的代码在这个或任何其他事情上正常工作!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2012-10-27
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多