sockets - Groovy TCP 客户端挂起

标签 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 脚本并不高兴。我已经修复了该服务,并且脚本现在可以正常运行,值得其他遇到类似问题的人牢记。

最佳答案

=====更新====

嘿克里斯;

尝试将套接字写入放在流处理器之外。由于 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/

相关文章:

java - 无法在 Groovy 中添加 BigDecimal 值

networking - TCP PSH 是如何工作的?

c++ - Boost asio::deadline_timer 在超时前重置

python - python套接字编程期间http响应正文中的奇怪数字

java - 如何在 JUnit 测试中的不同线程中启动 Main.main()

c - 逐行读取套接字但出现内存问题

c# - "A socket operation failed because the destination host was down"电脑连接移动设备时

php - 是否有可能实现 SSL (wss ://) using PHP socket extension?

android - 如何在 Intellij IDEA 中获取实时模板中的方法参数类型?

c# - 如何从C#读取Gradle程序