2014-09-10 44 views
1

我想用兩個機器之間使用socket編程進行通信。java socket編程在兩臺機器之間發送和接收文件

我基本需要的是兩臺機器都應該能夠發送和接收文件。我在下面粘貼的代碼沒有顯示任何錯誤,但服務器端程序似乎無限期地運行,即它沒有終止。它卡在標有評論的線上。

在此代碼中,服務器最初發送名爲「file.txt」的文件,並且客戶端正在接收它並使用名稱「copy.txt」保存該文件。後來客戶端發送一個名爲「file2.txt」的文件,並且服務器正在接收並使用名稱「copy2.txt」進行保存。

有人可以告訴我的錯誤,並提出一些改進?

//server side code 

import java.net.*; 
import java.io.*; 
public class server 
{ 
public static void main (String [] args) throws IOException 
{ 

    //sending file started 
    ServerSocket serverSocket = new ServerSocket(16167); 
    Socket socket = serverSocket.accept(); 
    System.out.println("Accepted connection : " + socket); 
    File transferFile = new File ("/Users/abhishek/desktop/file.txt"); 
    byte [] bytearray = new byte [(int)transferFile.length()]; 
    FileInputStream fin = new FileInputStream(transferFile); 
    BufferedInputStream bin = new BufferedInputStream(fin); 
    bin.read(bytearray,0,bytearray.length); 
    OutputStream os = socket.getOutputStream(); 
    System.out.println("Sending Files..."); 
    os.write(bytearray,0,bytearray.length); 
    os.flush(); 
    System.out.println("File transfer complete"); 
    //socket.close(); 
    //sending comleted 

    //receiving file started 
    int filesize=1022386; 
    int bytesRead=0; 
    int currentTot = 0; 
    byte [] bytearray1 = new byte [filesize]; 

    InputStream is = socket.getInputStream(); 

    FileOutputStream fos = new FileOutputStream("/Users/abhishek/desktop/copy2.txt"); 
    //fos.flush(); 
    BufferedOutputStream bos = new BufferedOutputStream(fos); 
    //bos.flush(); 
    System.out.println("not moving ahead!!!");//program stucked here 
    bytesRead = is.read(bytearray1,0,bytearray1.length); 
    currentTot = bytesRead; 
    System.out.println("current"+currentTot); 
    do 
    { 
     bytesRead = is.read(bytearray1, currentTot, (bytearray1.length-currentTot)); 
     if(bytesRead >= 0) 
      currentTot += bytesRead; 
     System.out.println("current"+currentTot); 
    } while(bytesRead > -1); 
    System.out.println("outside current"+currentTot); 
    bos.write(bytearray1, 0 , currentTot); 
    bos.flush(); 
    //receiving complete 
    System.out.println("Receving file completed"); 
    socket.close(); 

} 
} 



//client side code 
import java.net.*; 
import java.io.*; 


public class client 
{ 
    public static void main (String [] args) throws IOException 
    { 
     int filesize=1022386; 
     int bytesRead=0; 
     int currentTot = 0; 
     Socket socket = new Socket("localhost",16167); 
     byte [] bytearray = new byte [filesize]; 
     InputStream is = socket.getInputStream(); 
     FileOutputStream fos = new FileOutputStream("/Users/abhishek/desktop/copy.txt"); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 
     bytesRead = is.read(bytearray,0,bytearray.length); 
     currentTot = bytesRead; 
     do 
     { 
      bytesRead = is.read(bytearray, currentTot, (bytearray.length-currentTot)); 
      if(bytesRead >= 0) 
       currentTot += bytesRead; 
     } while(bytesRead > -1); 
     System.out.println("current"+currentTot); 
     bos.write(bytearray, 0 , currentTot); 
     bos.flush(); 
     bos.close(); 
     System.out.println("receiving first file completed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 

     //sending file 
     System.out.println("sending second file started!"); 
     File transferFile = new File ("/Users/abhishek/desktop/file2.txt"); 
     byte [] bytearray2 = new byte [(int)transferFile.length()]; 
     FileInputStream fin = new FileInputStream(transferFile); 
     BufferedInputStream bin = new BufferedInputStream(fin); 
     bin.read(bytearray2,0,bytearray2.length); 
     OutputStream os = socket.getOutputStream(); 
     os.flush(); 
     os.write(bytearray2,0,bytearray2.length); 
     os.flush(); 
     System.out.println("sending second file completed!"); 
     //sending complete 


     socket.close(); 
    } 
} 

回答

-1

我敢打賭

bytesRead = is.read(bytearray1,0,bytearray1.length);

就是你真的卡住。如果你被困在這裏,問題通常是通信的另一端沒有發送任何數據,沒有什麼可讀的,並且你的線程被卡住等待它發送。

客戶方的

,你叫

bos.close();

發送的第一條消息之後。這也會導致套接字關閉,這會在服務器端拋出一個IOException,並且因爲你沒有捕獲到IOException,你的服務器程序就會退出。

你有多少套接字體驗?如果您剛開始使用套接字,則可能需要查看我爲此編寫的擴展,從ServerSocketExDataFetcher開始。

+0

這感覺就像它應該進入評論。 – tilpner 2014-09-10 14:54:08

+0

@StackOverflowException我已經更新了這個回答問題,幷包括這個建議的意見。 – ControlAltDel 2014-09-10 15:00:34

+0

是的,那是我卡住的地方。我是第一次進行套接字編程,所以請你以任何方式告訴我可以避免這種情況。此外,請閱讀我對@Nekojimi回覆下面的評論,以更好地理解我的問題。 – user3245573 2014-09-10 15:53:55

0

System.out.println("not moving ahead!!!");//program stucked here行是否實際執行?如果是這樣,那麼問題是InputStream.read()函數是blobking函數;他們將停止執行程序(「塊」),直到他們能夠完成。

JavaDoc for InputStream

讀取最多len從輸入流數據的字節到字節數組。嘗試讀取多達len字節,但可以讀取較小的數字。實際讀取的字節數作爲整數返回。 該方法會阻塞,直到輸入數據可用,檢測到文件結尾或引發異常。

由於你沒有得到一個例外,這意味着,當你調用.read(),有要讀取沒有可用的數據,並且程序坐在那裏等待數據讀取(永遠不會到來)。您應該首先檢查您的客戶端程序是否實際發送數據。

+0

是的,該行正在執行,並且我確定它在read()處卡住,因爲沒有可用的數據。但是,我從客戶端發送數據(您可以檢查客戶端程序)。但是,我認爲客戶端沒有完成讀取第一個文件的數據(一個名爲「copy.txt」的文件確實被創建,但其中沒有數據)。因此,當客戶端沒有完成其第一個文件的讀取部分時,它無法發送第二個文件的數據。那麼,我該如何迴避這種情況呢? – user3245573 2014-09-10 15:46:37

相關問題