2014-09-18 3 views
0

У меня есть очень простой многопоточный сервер, который просто распечатывает вход клиента. Проблема, с которой я сталкиваюсь, заключается в том, что клиент рушится после более чем одного использования outToServer.writeBytes().Java - сбой программы после многократного использования writeBytes

Мой исходный код для клиента здесь:

public class Client { 

    public void run() throws Exception{ 
     String sentence; 

     Socket clientSocket = new Socket("localhost", 25565); 

     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 

     while (true){ 
      sentence = inFromUser.readLine(); 
      if(!sentence.equalsIgnoreCase("exit")){ 
       outToServer.writeBytes(sentence + '\n'); 
      } else { 
       break; 
      } 
     } 

     clientSocket.close(); 
    } 
} 

Я сделал некоторые исследования по ошибке, и это может быть мой колледж сеть убивает связь, но это не имеет особого смысла, учитывая, что он позволяет использовать первое соединение.

Кроме того, здесь ошибка:

java.net.SocketException: Software caused connection abort: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(Unknown Source) 
    at java.net.SocketOutputStream.write(Unknown Source) 
    at java.io.DataOutputStream.writeBytes(Unknown Source) 
    at com.cs.Client.run(Client.java:21) 
    at com.cs.Main.main(Main.java:14) 

В строке 21 в Client.java является линия с writeBytes в нем

+1

Какое исключение? –

+0

Пожалуйста, отправьте исключение. Если он не пойман и, по крайней мере, зарегистрирован, это настоящая проблема. Скорее всего, это говорит вам (почти), в точности, что пошло не так. Кроме того, это новичка (но очень распространенная), предполагающая, что сетевое соединение доступно после его получения до тех пор, пока вы этого хотите. Это не так, поэтому, если вы хотите действительно иметь надежную программу, не решайте свои проблемы так, как если бы это было так. –

+0

Упс. Я знал, что кое-что забыл. Я добавлю исключение сейчас – JamEngulfer

ответ

0

Открытие соединения не нравится открывать дверь. Соединение - это виртуальная концепция, а не гарантированный путь.

Поэтому, когда вы открываете соединение, в основном вы переконфигурировали некоторую управляемую область памяти операционной системы, чтобы знать, что при записи данных в определенную ячейку памяти ей необходимо скопировать эти данные на провод.

Это означает, что открытие соединения не всегда является общим событием (так как на удаленном компьютере может не полностью гарантировать путь к программе или даже может не знать, что был запрошен путь к удаленной программе).

Таким образом, при сетевом программировании, несмотря на API, которые сформулированы так, чтобы подразумевать иное, у вас нет функционального соединения, пока вы не получите первый ответ от удаленной машины.

Я видел, если вы можете запустить wirehark и посмотреть, можете ли вы захватить данные перед отправкой, и я проверил бы любые параметры подключения и попытаюсь проверить доступность соединения независимо от программы.

Вышеупомянутая процедура поможет вам быстро определить, какой сетевой компонент неисправен с точки зрения клиента; однако в 90% случаев это действительно тривиально, например, программный брандмауэр, блокирующий требуемый порт.

Кроме того, вы можете использовать telnet для обеспечения аналогичной функциональности, но подключение к нестандартному порту.

telnet hostname 25565 

удачи, и ваш код кажется довольно разумным, я бы потратить немного времени, чтобы убедиться, что вы не сосредотачиваясь на коде, когда окружающая среда может быть в вине.

+0

Возможно, также захочется очистить выходной поток. Но исключение указывает на то, что очистка выходного потока не является проблемой, с которой вы в настоящее время сталкиваетесь. –

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