我通常是一名 .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阻止等待服务器的输出。请参阅下面的堆栈跟踪。由于您永远无法发送请求,因此服务器没有响应。简而言之,使用单线程时,在发送请求之前不要发出监听。将您的代码更改为此,它应该可以工作:
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/