如何与来自 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)
}
在我开始读取输入后,我发现服务器实际上开始向我发送字符串并与我通信。我希望每个人都能让他们的代码在这方面或任何其他方面发挥作用!
这些问题听起来可能很愚蠢,但我对网络这个东西还是陌生的。 我已经尝试了好几天来实现一个与 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)
}
在我开始读取输入后,我发现服务器实际上开始向我发送字符串并与我通信。我希望每个人都能让他们的代码在这方面或任何其他方面发挥作用!