2013-01-17 46 views
-1

我正在嘗試使用TCP/IP將文件從一臺計算機傳輸到另一臺計算機。我已經用java編寫了代碼,如下所示。但是,代碼不起作用,並且在使用多個catch塊之後,我發現這是由於'SocketException'造成的。誰能告訴我如何解決這個問題?這裏是我的代碼 -Java中的SocketException:通過TCP/IP傳輸文件

的TcpClient

import java.net.*; 

進口java.io. ; import java.util。;

公共類的TcpClient {

public static void main (String args[]) 
    { 
    try 
    { 
     Socket sock = new Socket("localhost", 6839); 
     InputStream is = null; 
     FileOutputStream out = null; 
     boolean doesntexist=false; 
     String filename = "D:\\"+"Test"+".pdf"; 
     System.out.println("Here!"); 
     File newplaylist = new File(filename); 
     doesntexist = newplaylist.createNewFile(); 

     if(!doesntexist) 
     { 
      newplaylist.delete(); 
      newplaylist.createNewFile(); 
     } 


     byte[] mybytearray = new byte[1024]; 

     is = sock.getInputStream(); 
           // Create a new file output stream. 
     out = new FileOutputStream(newplaylist); 

     int count; 
     while ((count = is.read(mybytearray)) >= 0) { 
      out.write(mybytearray, 0, count); 
     } 
     out.close(); 
     is.close(); 
     sock.close(); 
    }  
     catch(SocketException e) 
     { 
     System.out.println("Socket exception"); 
     } 
     catch(ProtocolException e) 
     { 
      System.out.println("Protocol exception"); 
     } 
     catch(IOException ds) 
     { 
      ; 
     } 
    } 

}

TCPSERVER

import java.util.*; 
import java.io.*; 
import java.net.*; 
import java.nio.channels.*; 

class Fileserver 
{ 
    public static void main(String args[]) throws IOException 
    { 
    ServerSocket server = new ServerSocket(6839); 
    File myFile = new File("E:\\file1.pdf"); 
    FileInputStream file = null; 
    OutputStream os = null; 
    Socket sock=null; 

    sock = server.accept(); 

    try 
    { 

     byte[] mybytearray = new byte[1024]; 
     file = new FileInputStream(myFile); 
     os = sock.getOutputStream(); 


     int count; 
     while ((count = file.read(mybytearray)) >= 0) { 
      os.write(mybytearray, 0, count); 

     } 

     os.flush(); 
    } 


     catch(IOException e) 
     { 
      System.out.println("No file"); 
     } 
     catch(IllegalBlockingModeException ea) 
     { 
      System.out.println("blah!"); 
     } 

    finally 
    { 
     System.out.println("hello"); 
     file.close(); 
     os.close(); 
     sock.close(); 

     System.out.println("Socket closed"); 
    } 

    } 

}

+0

請勿編寫自己的錯誤消息。使用例外中的那個。*從不*忽略IOException。 – EJP

回答

1

你的代碼是扔掉所有的有用的診斷信息,其中,W生病弄清楚什麼是真正的問題是不可能的。 (而且完全無視IOException這樣近於犯罪!)

的方式來解決這個問題,做到以下幾點:

  • 修改方案,輸出異常消息和堆棧跟蹤時,一個意外發生異常。
  • 運行程序。
  • 如果/當他們失敗時,檢查診斷並確定他們的意思......或將它們添加到問題中,以便我們可以幫助您。

連接超時通常表明有在網絡層面某種問題。例如,您嘗試連接的計算機已經死亡(或不存在),數據包未正確路由,或者被防火牆丟棄。

但在這種情況下,問題在於您(顯然)試圖使用"localhost"與另一臺計算機進行通信。這根本行不通。 "localhost"名稱通常會解析爲回送子網上的地址;例如127.0.0.1。環迴流量永遠不會離開它發送來的機器...因此,您只能使用"localhost"連接到這臺機器。

(可能發生的一點是,由於沒有任何內容正在監聽連接到指定端口的此機器,因此打開連接的TCP數據包將被丟棄,最終,客戶端TCP-IP堆棧超時連接嘗試和Java套接字庫會引發您所看到的異常。)

解決方法是用您要與之通話的計算機的DNS名稱或IP地址替換"localhost"

+0

打印堆棧跟蹤後,這是在信息I的Get- java.net.ConnectException:連接超時:在java.net.DualStackPlainSocketImpl.connect0(本機方法) \t連接 \t在java.net.DualStackPlainSocketImpl.socketConnect( DualStackPlainSocketImpl.java:69) \t java.net.ConnectException:連接超時:連接 \t在java.net.DualStackPlainSocketImpl.connect0(本機方法) \t在java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69) \t at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:337) –

+0

I re將它放在客戶端代碼中我的服務器的IP地址。但是,我仍然遇到同樣的問題。它曾經工作過一次,我能夠傳輸文件,但從那時起它已經超時。感謝您幫助我... –

+0

在這種情況下,您應該查看網絡配置。這不是一個真正的編程問題。 –