2013-04-04 71 views
0

我寫了一些客戶端 - 服務器程序,共享數據,但在服務器端我收到數據後EOFException。我試圖自己修復它,但很難找到自己的錯誤。Java流與EOFException

錯誤是由這一行造成的:Message command =(Message) serInputStream.readObject();

這裏是從服務器的一些輸出:

java.io.EOFException 

at Java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2577) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
at transfer.Serwerus.run(Serwerus.java:42) 

Server代碼:

import java.io.*; 
import java.net.*; 

public class Serwerus implements Runnable 
{ 
public InputStream is; 
public FileOutputStream fos; 
public BufferedOutputStream bos; 
public ObjectOutputStream serOutputStream; 
public ObjectInputStream serInputStream; 
ServerSocket socket; 
private String clientMessage, clientFileName; 
private int clientFileSize; 

public Serwerus() 
{ 
    try 
    { 
     socket = new ServerSocket(6060); 
     System.out.println("Server started...."); 
    } 
    catch(IOException e) 
    { 
     System.err.println("Error: " + e); 
     e.printStackTrace(); 
    } 
} 

@Override 
public void run() 
{ 
    try 
     { 
      Socket sock = socket.accept(); 
      System.out.println("Client accepted"); 
      serOutputStream = new ObjectOutputStream(sock.getOutputStream()); 
      serInputStream = new ObjectInputStream(sock.getInputStream()); 
      while (true) 
      { 
       Message command =(Message) serInputStream.readObject(); 
       System.out.println("after readObject"); 
       if (command.getCommand().startsWith("FileU")) 
       { 
        System.out.println("Name = " + command.getfileName() + ", size= " + command.getfileSize()); 
        serOutputStream.writeObject(new Message("Bring", "", 0)); 
        //ReciveData(socket, command.getfileName(), command.getfileSize()); 
       } 
       else if(command.getCommand().startsWith("Wait")) 
       { 
        System.out.println("hohoho"); 
        ReciveData(sock, command.getfileName(), command.getfileSize()); 
       } 
       else if(command.getCommand().startsWith("Quit")) 
       { 
        System.exit(1); 
       } 
       else 
       { 
        System.out.println("Unknow"); 
       } 
      } 
     } 
     catch(ClassNotFoundException | IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     finally 
     { 
      try 
      { 
       serInputStream.close(); 
       serOutputStream.close(); 
       socket.close(); 
      } 
      catch (IOException e) 
      { 
       System.err.println("Fallen on closing socket.\n Error: " + e); 
      } 
     } 
} 

public void SendData(Socket sock, String filePath) throws Exception 
{ 
    File myFile = new File (filePath); 
    System.out.println("File name = " + myFile.getName() + " File len = " + (int)myFile.length()); 
    byte [] mybytearray = new byte [(int)myFile.length()]; 
    FileInputStream fis = new FileInputStream(myFile); 
    BufferedInputStream bis = new BufferedInputStream(fis); 
    bis.read(mybytearray,0,mybytearray.length); 
    OutputStream os = sock.getOutputStream(); 
    System.out.println("Sending..."); 
    os.write(mybytearray,0,mybytearray.length); 
    os.flush(); 
    sock.close(); 
    System.out.println("Sending finished"); 
} 

public void ReciveData(Socket sock, String filePath, int fileSize) 
{ 
    System.out.println("Recive in progress, filesize = " + fileSize); 
    int bytesRead = 0, current = 0; 
    byte[] array = new byte[fileSize]; 

    try 
    { 

     is = sock.getInputStream(); 
     FileOutputStream fos = new FileOutputStream(filePath); 
     bos = new BufferedOutputStream(fos); 
     do 
     { 
      System.out.println(bytesRead); 
      bytesRead = is.read(array); 
      current += bytesRead; 
     } 
     while(bytesRead > -1); 

     bos.write(array, 0 , current); 
     bos.flush(); 
     bos.close(); 
     fos.close(); 
     // sock.close(); 
     System.out.println("Reciveing finished"); 
    } 
    catch (IOException ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

public static void main (String [] args) throws IOException 
{ 
    new Thread(new Serwerus()).start(); 
} 
} 

客戶端代碼:

import java.io.*; 
import java.net.*; 

public class Clientus implements Runnable 
{ 
    InputStream is; 
    FileOutputStream fos; 
    BufferedOutputStream bos; 
    ObjectOutputStream cliOutputStream; 
    ObjectInputStream cliInputStream; 
    Socket socket; 
    File actFile; 
    private String serverMessage, serverFileName; 
    private int serverFileSize; 

    public Clientus() 
    { 
     try 
     { 
      socket = new Socket("localhost", 6060); 
      cliOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
      cliInputStream = new ObjectInputStream(socket.getInputStream()); 
      File file = new File(<filepath>); 
      actFile = file; 
     } 
     catch (Exception e) 
     { 
      System.err.println("Error: " + e); 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void run() 
    { 
     try 
      { 
       cliOutputStream.writeObject(new Message("FileU", actFile.getPath(), (int) actFile.length())); 
       cliOutputStream.flush(); 
       //while (true) 
       //{ 
        Message command =(Message) cliInputStream.readObject(); 
        if (command.getCommand().startsWith("File")) 
        { 
         String name = command.getfileName(); 
         int size = command.getfileSize(); 
         System.out.println("Name = " + command.getfileName() + ", size= " + command.getfileSize()); 
         if(size != 0 && !"".equals(name)) 
         { 
          //ReciveData(socket, 0); 
         } 
        } 
        else if(command.getCommand().startsWith("Bring")) 
        { 
         cliOutputStream.writeObject(new Message("Wait", "D:\\KP2\\Serwer\\dupa.txt",(int) actFile.length())); 
         cliOutputStream.flush(); 
         try 
         { 
          SendData(socket, actFile.getPath()); 
          //this.socket.close(); 
         } 
         catch (Exception ex) 
         { 
         System.err.println("Error with: SendData()"); 
         } 
        } 
        else if(command.getCommand().startsWith("Quit")) 
        { 
         System.exit(1); 
        } 
        else 
        { 
         System.out.println("Command unknown"); 
        } 
       //} 
      } 
      catch(ClassNotFoundException | IOException ex) 
      { 
       ex.printStackTrace(); 
      } 
      finally 
      { 
       try 
       { 
        socket.close(); 
        cliOutputStream.close(); 
        cliInputStream.close(); 
       } 
       catch (IOException e) 
       { 
        System.err.println("Fallen on closing socket.\n Error: " + e); 
       } 
      } 
    } 

    public void SendData(Socket sock, String filePath) throws Exception 
    { 
     byte [] mybytearray = new byte [(int) new File(filePath).length()]; 
     FileInputStream fis = new FileInputStream(filePath); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     bis.read(mybytearray,0,mybytearray.length); 
     OutputStream os = sock.getOutputStream(); 
     System.out.println("Sending..."); 
     os.write(mybytearray,0,mybytearray.length); 
     fis.close(); 
     bis.close(); 
     os.close(); 
     System.out.println("Sending finished"); 
    } 

    public void ReciveData(Socket sock, String fileName, int fileSize) 
    { 
     int bytesRead, current = 0; 
     byte[] array = new byte[fileSize+1]; 
     try 
     { 
      is = sock.getInputStream(); 
      fos = new FileOutputStream(<file_path>); 

      bos = new BufferedOutputStream(fos); 
      bytesRead = is.read(array,0,array.length); 

      current = bytesRead; 
      do 
      { 
       bytesRead = is.read(array, current, (array.length - current)); 
       if(bytesRead >= 0) 
        current += bytesRead; 
      } 
      while(bytesRead > -1); 

      bos.write(array, 0 , current); 
      bos.flush(); 

      long end = System.currentTimeMillis(); 

      //System.out.println("Send time: " + (end - start)); 
      bos.close(); 
      sock.close(); 
      System.out.println("Reciveing finished"); 
     } 
     catch (IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

    public static void main (String [] args) throws IOException 
    { 
     new Thread(new Clientus()).start(); 
    } 
} 

任何人都可以幫忙嗎?

+0

請指定'Exception'是指程序的哪一行。 – boomz 2013-04-04 15:54:04

+0

也許這個問題可能會幫助你http://stackoverflow.com/a/10858195/2115680 – 2013-04-04 15:56:25

+0

@boomz我懷疑有問題的行是'Message command =(Message)serInputStream.readObject();' – 2013-04-04 15:59:47

回答

1

發送數據後,您的客戶端可能會斷開連接,並且由於您的服務器正在等待更多數據,將發生EOFException

要解決此問題,可以在客戶端斷開連接時添加try-catch塊來捕獲此異常。

+0

不要使用代碼格式化爲不是代碼的文本。 – EJP 2017-04-05 10:32:36

0

您正在使用ObjectOutputStream和套接字自己的OutputStream發送數據,並且您不同步。當您直接通過套接字發送原始數據時,您並未首先發送長度,所以接收器不知道該傳輸有多少個字節。實際上,它只是讀取所有內容,直到EOS,因此下次您撥打ObjectInputStream.readObject()時,它自然會收到EOFException。爲了解決這個問題:

  1. 使用ObjectInputStreamObjectOutputStream一切
  2. 發送文件之前,發送它的長度,通過writeLong().
  3. 在接收端,接收文件時,首先把它的長度,通過readLong(),然後讀取來自ObjectInputStream正是很多字節,並將它們複製到文件。