2013-06-30 59 views
0

我已经编写了一个客户端服务器的TCP套接字程序,客户端将输入一个字符串,并将由服务器显示(回显程序)...条件是当我进入再见该程序应退出...嗯,良好的客户端程序正在退出......但服务器程序正在退出与java.io.DataInputStream.readUTF()和readFully异常.. plz帮助我..什么是错误的代码...Java TCP Socket编程抛出IO异常

/*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

我认为答案是,那就是发生了什么。 EOFException只有方式DataInputStream告诉调用者它已达到EOF。所以如果你的服务器在你的客户端关闭套接字时尝试读取,那将会发生什么。

解决办法有两个:

  • 捕获并处理的EOFException类。

  • 修改您的“协议”,以便客户端(以某种方式)告诉服务器何时发送最后一条消息,并且要关闭套接字。


在客户端关闭DataOutputStream是一个好主意,但它可能不会解决问题。 A DataOutputStream未被缓冲,也不是Socket的OutputStream,所以应该没有数据要刷新。 (当SocketOutputStream关闭时,网络协议栈中的任何数据未完成数据都应该发送。)

+0

你可以帮我修改协议吗? –

+0

我建议你处理这个异常。但有多种方法可以修改协议。例如,一个空字符串可能意味着EOF即将到来,正如某些特殊的字符串值。或者,您可以在每个字符串“true”或“false”后发送布尔值,具体取决于EOF是否即将到来。 –

+0

我把它作为尝试和(空)catch块。但这会是一个好主意吗?坦率地说,我不满意,因为我所有的实验室计划都只基于此。 –