我编写了一个客户端 - 服务器TCP套接字程序,客户端将输入一个字符串,并由服务器显示(echo程序)...条件是当我进入再见时,程序应退出...嗯,好客户端程序正在退出...但是服务器程序正在退出java.io.DataInputStream.readUTF()和readFully异常.. plz帮我...代码中有什么错...
/*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)
答案 0 :(得分:0)
我认为答案就是这就是发生的事情。 EOFException
是唯一的方式,DataInputStream
告诉来电者它已达到EOF。因此,如果您的服务器在客户端关闭套接字时尝试读取,则会发生这种情况。
有两种解决方案:
抓住并处理EOFException。
修改您的“协议”,以便客户端(以某种方式)告诉服务器何时发送了最后一条消息...并将关闭套接字。
在客户端关闭DataOutputStream
是一个好主意,但它可能无法解决问题。 DataOutputStream
没有被缓冲,也没有Socket的OutputStream
,因此不应该刷新数据。 (当Socket
或OutputStream
关闭时,应传输网络协议栈中的任何数据未完成数据。)