2012-06-08 2 views
1

Я обычно в .net Dev (не бейте меня!), Так что простите любые действительно глупые ошибки, которые я сделал здесь :)Groovy TCP клиент висит

У меня есть TCP слушателя, написанный на .net, который получает 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(); 

Я отладка в затмении, и она висит на линии withStreams. То, что я должен получить, - сообщение «Сообщение не было XML», которое я могу получить через telnet.

Любые идеи, что я делаю неправильно?

Update Я просто попытался это вместо закрытия 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() вызов

Update снова

Оказалось, что это была проблема с тем, как удаленная служба закрывалась (или больше - не было закрытие) поток. Оба .net и наш мейнфрейм обрабатывали его правильно, но отличный скрипт был недоволен. Я исправил эту услугу, и сценарий работает счастливо сейчас, поэтому стоит учитывать, что кто-то еще сталкивается с чем-то подобным.

+0

Моя догадка сервер держит соединение открытым, так что читатель буферизация Безразлично Не знаю, что хорошо вернуться (и блокирует ожидание большего количества данных). Кроме того, должен ли '' Hello test server '' быть перед извлечением responseText? –

+0

хорошо, но могут быть плохие сервисы или сломанные соединения. так, в groovy, как реализовать тайм-аут, прочитанный для надежного клиента? – Massimo

ответ

3

===== Обновление ====

Эй Крис;

Попробуйте поместить сокет, пишите за пределы процессора потоков. Вы можете направлять вывод прямо в гнездо с 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 [email protected] 
java.io.InputStreamReader.read(InputStreamReader.java:167) 
java.io.BufferedReader.fill(BufferedReader.java:136) 
java.io.BufferedReader.readLine(BufferedReader.java:299) 
    - locked [email protected] 
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) 
+0

Имеет смысл, но все еще висит в одной точке - он, кажется, висит на линии withStreams, прежде чем он ударит что-нибудь в закрытии. Спасибо за подробный ответ кстати! –

+0

См. Обновленный ответ. – Nicholas

+0

По-прежнему получается точно так же - он зависает на линии withStreams (или отключается, если я включаю команду тайм-аута. Я могу видеть запрос, проходящий через журналы сервера, и ответ «Запрос текста не в формате XML» отправляется обратно Странно, у нас это работает от множества клиентов довольно счастливо. Почти готов просто отказаться от LoadUI в качестве инструмента тестирования. –

Смежные вопросы