2009-08-06 5 views
0

Я хочу написать простой веб-прокси для упражнений. Вот код, который я до сих пор:Клиентский сокет читает «freezes»


def g = new Proxy() 
g.serverPort = 9000 
println "starting" 
g.eachClient { Socket client -> 
    println "got a client" 
    try { 
     client.withStreams { input,output -> 
      String text = input.text 
      println "received $text from client" 
      client.close() 
     } 
    } catch(IOException io) { 
     println "IO error. Probably client disconnected" 
     //io.printStackTrace() 
    } 
} 

вещь, линия:

String text = input.text

поглощает все имеющиеся данные в InputStream сокета. Если клиент не закрывает соединение, этот метод будет просто ждать, пока он не сможет прочитать конец символа файла (если я правильно помню). Что я должен предотвратить, чтобы это произошло, и чтобы строка клиента была доступна как можно скорее?

ответ

2

Я думаю, что вы захотите проверить документацию на ObjectInputStream. Сделайте length = input.available, чтобы получить количество доступных байтов в настоящее время, затем используйте input.read(buffer, offset, length), чтобы читать точно столько же, сколько доступно. Вероятно, вы захотите запустить новый поток для каждого нового соединения, которое прозрачно управляет этим буфером в фоновом режиме, если только вы не создаете однопоточный прокси-сервер.

+0

Это сработало! Благодаря! Еще один вопрос, пожалуйста, как java знает, сколько байтов доступно? – Geo

+0

Это больше вопрос о библиотеке сокетов базовой операционной системы, которую Java абстрагирует для вас. Вы можете увидеть пример того, как это сделать, используя C в операционной системе * nix здесь: http://www.dholm.com/2008/05/13/available-socket-bytes/ –

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