У меня есть класс, который служит в качестве клиентского потока. в классе у меня есть метод run
, который обрабатывает операции чтения и записи из и в сокет. мой метод запуска выглядит следующим образом:не удалось уловить -1 ответ сокета читать
public void run(){
System.out.println("New connection at " + new Date() + "\n");
try {
DataInputStream in = new DataInputStream (threadSocket.getInputStream());
out = new DataOutputStream (threadSocket.getOutputStream());
while (running){
// read input from client
byte[] input = new byte [200];
int count = in.read(input);
if (count == -1) {
running = false;
break;
}
String msg = new String(input, 0, count);
// parse in going message
messageParsing(msg);
// respond to client
response();
}
}
catch (IOException ex) {ex.printStackTrace();}
finally {
try {
threadSocket.close();
System.out.println("Connection closed.\n");
} catch (IOException ex) {ex.printStackTrace();}
}
}
Я создал массив фиксированного размера байт, и я читать данные из сокета в него. Доступные длины поступающих данных: 147 и 61, если длина входных данных равна 0, это ничего не значит. Я хотел бы закрыть сокет, когда число равно -1, но я не увенчался успехом. Кажется, что когда нет данных, счет равен 0, он просто пытается читать данные из сокета, и он застревает.
Как решить эту проблему? Что я делаю не так? Любая помощь будет оценена по достоинству.
'count' не может быть' 0', по крайней мере, если вы доверяете javadoc. – Kayaman
Если вы действительно читаете текст, подумайте об использовании 'InputStreamReader', а не конструктора' String'. –
@ Kayaman На самом деле это может быть, если вы предоставите буфер нулевой длины для 'read (byte [])' или нулевой счет для 'read (byte [], int, int)'. Но не с этим кодом. – EJP