2

私は通常.net開発者です(私を傷つけないでください!)ので、私がここで犯した本当に愚かな間違いを許してください:)

xmlを受信して​​応答を返す.netで記述されたTCPリスナーがあります。loadUIを使用してテストをロードできるように、Groovyでクライアントを作成しようとしています。これが私がこれまでに持っているものです:

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();

今はprintlnr.readLine()呼び出しにぶら下がっています

再度更新する

これは、リモートサービスがストリームを閉じていた(または、より正確には、閉じていなかった)方法に問題があったことが判明しました。.netとメインフレームの両方がそれを正しく処理していましたが、Groovyスクリプトは満足できませんでした。私はサービスを修正し、スクリプトは正常に実行されるようになりました。同様の問題に遭遇した他の人にとっては、覚えておく価値があります。

4

1 に答える 1

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