2013-06-30 3 views
0

Я написал программу TCP-Socket-клиент-сервер, так что клиент войдет в строку и будет отображаться сервером (эхо-программа) ... это условие, когда я вхожу в свидание программа должна выйти ... Ну и хорошо, что клиентская программа выходит ... но серверная программа выходит из java.io.DataInputStream.readUTF() и readFully исключений .. PLZ помогите мне .. что не так в коде ...Java TCP Socket programming throwing IO exceptions

/*Client*/ 

import java.net.*; 
import java.io.*; 
public class echoclient { 

public static void main(String args[]) throws Exception 
{ 
    Socket soc = new Socket("127.0.0.1",4000); 
    OutputStream sout = soc.getOutputStream(); 
    DataOutputStream out = new DataOutputStream(sout); 
    DataInputStream din = new DataInputStream(System.in); 
    while(true) 
    { 
    String message = din.readLine(); 
    if(message.equals("bye")) 
     break; 
    out.writeUTF(message); 
    } 
    soc.close(); 
} 

}

/*Server*/ 
import java.io.*; 
import java.net.*; 
public class echoserver { 

public static void main(String args[]) throws Exception 
{ 
    ServerSocket server = new ServerSocket(4000); 
    Socket soc = server.accept(); 
    System.out.println("Server Started...."); 

    InputStream sin = soc.getInputStream(); 
    DataInputStream in = new DataInputStream(sin); 
    while(true) 
    { 
    String fromClient = in.readUTF(); 
    if(fromClient.equals("bye")) 
     {break;} 
    System.out.println("Client says : "+fromClient); 
    } 
    soc.close();server.close(); 
} 
} 

Исключение:

Exception in thread "main" java.io.EOFException 
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340) 
at java.io.DataInputStream.readUTF(DataInputStream.java:589) 
at java.io.DataInputStream.readUTF(DataInputStream.java:564) 
at echoserver.main(echoserver.java:15) 
+3

Это могло бы помочь, если бы вы могли предоставить нам исключение. –

+0

@JunedAhsan - out.writeUTF() от клиента и in.readUTF() на сервере – radai

+0

Это исключение я получаю: –

ответ

0

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

Есть два решения:

  • уловов и обрабатывать EOFException.

  • Измените свой «протокол», чтобы клиент (каким-то образом) сообщил серверу, когда он отправил последнее сообщение ... и собирается закрыть сокет.


Закрытие DataOutputStream на стороне клиента, это хорошая идея, но это, вероятно, не решит проблему. A DataOutputStream не буферизуется, и ни один из них не является OutputStream Socket, поэтому не должно быть данных, которые должны быть сброшены. (Любые данные, выданные в стеке сетевых протоколов, должны передаваться при закрытии Socket или OutputStream.)

+0

Можете ли вы PLZ помочь мне в том, как изменить протокол? –

+0

Я рекомендую вам обработать исключение. Но существует множество способов изменить протокол. Например, пустая строка может означать приближение EOF, как и некоторое специальное строковое значение. Или вы можете отправить логическое значение после каждой строки, которая является «true» или «false», в зависимости от того, идет ли EOF. –

+0

Я сделал это как try и (empty) catch block. Но это будет хорошая идея? Чтобы быть откровенным, я не удовлетворен, потому что все мои лабораторные программы основаны только на этом. –