2010-06-30 3 views
1

Исключение выбрано в строке 24 во второй раз, когда я что-то набираю (после того, как я набрал имя хоста) - сервер работает правильно. Кодjava Исключение DataOutputStream

import java.io.*; 
import java.net.*; 

class TCPclient { 
    public static void main(String[] args) throws Exception { 
     String hostname, msg; 
     InetAddress hostaddress; 
     BufferedReader inFromUser = new BufferedReader (new InputStreamReader(System.in)); 
     System.out.println("Please type host\n"); 
     hostname = inFromUser.readLine(); //I type localhost 
     hostaddress = InetAddress.getByName(hostname); 
     Socket cSocket = new Socket(hostaddress, 44444); 
     String cAddress = cSocket.getLocalSocketAddress().toString(); 
     DataOutputStream outToServer = new DataOutputStream (cSocket.getOutputStream()); 
     while (true) 
     { 
      msg = inFromUser.readLine(); 
      System.out.println(msg); 
      if (msg.equals("exit")) 
      { 
       System.out.println("exit"); 
       break; 
      } 
      outToServer.writeBytes(cAddress + " said : " + msg + '\n'); //this line throws an exception the second time it runs 
     } 
     cSocket.close(); 
    } 
} 

Я новичок в java, поэтому мне не хватает чего-то очевидного, я думаю. Исключение гласит:

Исключения в потоке "основное" java.net.SocketException: Программное обеспечение вызвало соединение прерывание: сокет запись ошибки в java.net.SocketOutputStream.socketWrite0 (Native Method) в java.net .SocketOutputStream.socketWrite (SocketOutputStream.java:92) на java.net.SocketOutputStream.write (SocketOutputStream.java:115) на java.io.DataOutputStream.writeBytes (DataOutputStream.java:259) в TCPclient.main (TCPClient .java: 52) Java Результат: 1

Сервер:

import java.io.*; 
import java.net.*; 

class TCPServer { 
    public static void main(String argv[]) throws Exception { 
     String clientSentence; 
     ServerSocket welcomeSocket = new ServerSocket(44444); 
     while(true) { 
     Socket connectionSocket = welcomeSocket.accept(); 
     BufferedReader inFromClient = new BufferedReader(
       new InputStreamReader(connectionSocket.getInputStream())); 
     clientSentence = inFromClient.readLine(); 
     System.out.println(clientSentence + "\n"); 
     } 
    } 
} 
+0

Связанный: http://stackoverflow.com/questions/2126607/official-reasons-for-software-caused-connection-abort-socket-write-error – BalusC

+0

Спасибо - Я думаю, что в моем случае это должно быть что-то более простое - «сервер» всегда получает первую строку, которую я печатаю, и получаю исключение во втором - это не то, что я смешиваю свои строки или что-то еще –

+0

@ dardana: трудно понять, что происходит, не имея представления о том, что такое сервер. –

ответ

4

Ваш клиент создает один сокет и пишет снова и снова к этому одну розетку. Ваш сервер, с другой стороны, это делает:

ServerSocket welcomeSocket = new ServerSocket(44444); 
while(true) { 
    Socket connectionSocket = welcomeSocket.accept(); 

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

Таким образом, чтобы исправить вашу непосредственную проблему, попробуйте переместить

Socket connectionSocket = welcomeSocket.accept(); 
    BufferedReader inFromClient = new BufferedReader(
      new InputStreamReader(connectionSocket.getInputStream())); 

до цикла.

+0

Спасибо, действительно, я новичок, и он показывает :) Я попробую, что вы скажете –

+0

Да - работает !!! Итак, соединение было закрыто - вот почему я получил исключение? –

+0

Правильно. Конечная точка сервера отказалась от подключения и перестала читать. Напомним, что серверный сокет имеет возможность принимать входящие соединения из * нескольких * клиентских сокетов. Однако, если вы приняли соединение через 'accept', полученный сокет остается постоянным (через магию TCP/IP). Нет необходимости восстанавливать соединение каждый раз, когда вы хотите отправить данные по линии. –

1

Как долго вы можете ждать ввода второй строки? Возможно, это связано с отсутствием сокета.

Также с таким кодом сервера вы увидите только первое сообщение. Попробуйте это:

import java.io.*; 
import java.net.*; 

class TCPServer { 
    public static void main(String argv[]) throws Exception { 
     String clientSentence; 
     ServerSocket welcomeSocket = new ServerSocket(44444); 
     Socket connectionSocket = welcomeSocket.accept(); 
     BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
     while (true) { 
      clientSentence = inFromClient.readLine(); 
      System.out.println(clientSentence + "\n"); 
     } 
    } 
} 
+0

Большое спасибо - я попробую ваши предложения сразу же - спасибо –

+0

Работы - спасибо - это не простаивание розетки, но закрытие соединения (???) –

+0

Я склонен согласиться с Марком Петерсом: вы просто после получения первого сообщения удалите все ссылки на сокет сервера. В какой-то момент сокет будет закрыт, и вы получите исключение. –

0

Try:

while (true) 
{ 
    if(inFromUser.readLine() != null) 
    {   
     msg = inFromUser.readLine(); 

     System.out.println(msg); 
     if (msg.equals("exit")) 
     { 
      System.out.println("exit"); 
      break; 
     } 

     outToServer.writeBytes(cAddress + " said : " + msg + "\n"); 
    } 
} 

Обратите внимание на изменения:

if(inFromUser.readLine() != null) 
{ 

и

... "\n"); 

не

... '\n'); 

Сделайте снимок. Это, вероятно, слишком простое решение, но это что-то :)

+0

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

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