【发布时间】:2016-02-07 10:22:34
【问题描述】:
我编写了一个侦听客户端的简单服务器,当客户端连接时,它会打开一个 Datainputstream,读取从客户端发送的所有数据(我的客户端写入 UTF 数据)。
这是服务器代码:
@Override
public void run() {
// TODO Auto-generated method stub
try {
ServerSocket ss = new ServerSocket(7000);
while(true){
System.out.println("Il Server sta cercando Connessioni");
Socket s = ss.accept();
System.out.println("Il Server ha accettato un Client");
Thread t2 = new Thread(new Runnable(){
public void run(){
try {
while(true){
DataInputStream dis = new DataInputStream(s.getInputStream());
isAlreadyOpened = true;
System.out.println(dis.readUTF());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
isAlreadyOpened = false;
}
}
});
if(!isAlreadyOpened){
t2.start();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这是非常基本的,我的客户端是一个在单击按钮时发送数据的 Andorid 应用程序:
@Override
public void onClick(View v) {
try {
DataOutputStream out = new DataOutputStream(s.getOutputStream());
out.writeUTF("Testiamo sto socket");
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
当客户端连接到服务器时,一切都很完美。但是当我只单击一次客户端按钮时,发送的数据会显示在我的服务器日志中,但在引发异常后立即显示。
Il Server sta cercando Connessioni
Il Server ha accettato un Client
Il Server sta cercando Connessioni
Testiamo sto socket
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
从 Oracle 文档中读取该异常被抛出 。 但是我怎样才能避免这种情况呢?
【问题讨论】:
-
您是否尝试过在 readuTF 之前添加 if 语句,例如
if(dis.readUTF() != null){do the stuff} -
是的,我试过了。但它不起作用..它抛出异常但是一旦数据它就不会打印。所以我觉得比以前更糟了..
-
while(true)...语句效率不高,应避免使用。EOFException是文件结束异常。所以这意味着你做错了什么(可能阅读了不存在的东西)。 -
While(true) 设置为允许服务器永远监听数据。我认为没有其他方法可以这样做..问题是当客户端发送数据时服务器可以读取它..但是由于它在一个while循环中..第二次没有数据阅读所以它抛出异常。即使我需要每次都监听数据的服务器,这也是我想要避免的。
-
@xdevs23 你关于
while (true)语句无效的说法是100% 的废话。没有什么比这更有效了。
标签: java datainputstream eofexception