Groovy TCP客户端挂起

时间:2012-06-08 09:28:31

标签: sockets groovy tcp

我通常是.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脚本不高兴。我已经修复了这项服务,现在脚本运行愉快,值得注意的是其他任何人遇到类似的事情。

1 个答案:

答案 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)