我编写了一个侦听客户端的简单服务器,当客户端连接时,它打开一个Datainputstream,读取客户端发送的所有数据(我的客户端UTF数据)。
这是ServerCode:
@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文档中读取此异常将被抛出<>。 但是我怎么能避免这种情况呢?
答案 0 :(得分:7)
您正在发送一个字符串,然后关闭连接。您正在尝试阅读无限多的字符串。他们没有被发送。你得到的是预期的 EOFException.
这里没有问题需要解决。如果您需要通过同一个连接发送更多字符串,请在发送后不要将其关闭。
答案 1 :(得分:0)
尽管这不是Alesso的问题,但这是EOFException发生的另一种方式:
您将输出流打开到文件,然后再将输入流打开到相同的文件,而无需先关闭输出流。