gpt4 book ai didi

sockets - Groovy TCP 客户端挂起

转载 作者:可可西里 更新时间:2023-11-01 02:37:32 25 4
gpt4 key购买 nike

我通常是 .net 开发人员(不要伤害我!)所以请原谅我在这里犯的任何非常愚蠢的错误:)

我有一个用 .net 编写的 TCP 监听器,它接收 xml 并发回响应。我正在尝试用 groovy 为它编写一个客户端,以便我可以使用 loadUI 进行负载测试。这是我目前所拥有的:

def s = new Socket("10.208.24.59", 9061);
s.withStreams { inStream, outStream ->
def reader = inStream.newReader()
def responseText = reader.readLine()
outStream << "Hello test server"
println "response = $responseText"
}
s.close();

我在 eclipse 中调试,它卡在 withStreams 线上。我应该收到的是一条“消息不是 XML”消息,我可以通过 telnet 得到它。

知道我做错了什么吗?

更新我刚刚试过这个而不是 withStreams 闭包:

def r = new BufferedReader(new InputStreamReader(s.getInputStream()));
def w = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
w.write("Hello test server 2");
w.flush();
println r.readLine();
w.flush();
w.close();

它现在卡在 println r.readLine() 调用上

再次更新

事实证明,这是远程服务关闭(或者更确切地说 - 没有关闭)流的方式的问题。 .net 和我们的大型机都可以正确处理它,但 groovy 脚本不满意。我已经修复了服务,脚本现在可以愉快地运行,对于遇到类似问题的任何其他人来说值得牢记。

最佳答案

=====更新====

嗨,克里斯;

尝试将套接字写入放在流处理器之外。由于 Groovy leftShifted 套接字类,您可以将输出直接指向套接字。此外,没有直接关系,但有助于调试,设置套接字读取超时,这样您的线程就不会无休止地阻塞。

def s = new Socket("10.208.24.59", 9061);
s.setSoTimeout(3000);
s << "Hello test server";
s.withStreams { inStream, outStream ->
def reader = inStream.newReader()
def responseText = reader.readLine()
println "response = $responseText"
}
s.close()

=====/更新====

问题是 newReader等待服务器输出的 block 。请参阅下面的堆栈跟踪。由于您永远无法发送请求,因此服务器没有响应。简而言之,在使用单线程时,不要在发送请求之前发出监听。将您的代码更改为此,它应该可以工作:

def s = new Socket("10.208.24.59", 9061);
s.withStreams { inStream, outStream ->
outStream << "Hello test server" // send request first
def reader = inStream.newReader()
def responseText = reader.readLine()
println "response = $responseText"
}
s.close();

等待线程的堆栈跟踪如下所示:

Stack trace: 
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:129)
sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
- locked java.io.InputStreamReader@2119899e
java.io.InputStreamReader.read(InputStreamReader.java:167)
java.io.BufferedReader.fill(BufferedReader.java:136)
java.io.BufferedReader.readLine(BufferedReader.java:299)
- locked java.io.InputStreamReader@2119899e
java.io.BufferedReader.readLine(BufferedReader.java:362)
java_io_BufferedReader$readLine.call(Unknown Source)
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)

关于sockets - Groovy TCP 客户端挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10946254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com