我通常是.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脚本不高兴。我已经修复了这项服务,现在脚本运行愉快,值得注意的是其他任何人遇到类似的事情。
答案 0 :(得分:4)
=====更新====
嘿克里斯;
尝试将套接字写入流处理器之外。您可以直接在套接字上直接输出,因为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)