2

我通常是 .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 脚本并不满意。我已经修复了服务并且脚本现在运行愉快,对于遇到类似问题的其他人来说值得牢记。

4

1 回答 1

4

===== 更新 ====

嘿,克里斯;

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

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)
于 2012-06-08T13:58:09.183 回答