2015-11-07 51 views
0

我正在做對嗎?當我嘗試在我的計算機環回地址上運行此操作時,出現「連接重置」錯誤。使用Java進行網絡編程

public class DateTimeClient { 
public static void main(String[] args) throws IOException { 
    int port = Integer.parseInt(args[0]); 
    String host = args[1]; 
    try { 
     System.out.println("Connecting....\n"); 
     Socket socket = new Socket(host, port); 
     PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader reader = new BufferedReader(
       new InputStreamReader(socket.getInputStream())); 
     System.out.println("Date: " + reader.read()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 


public class DateTimeServer { 
public static void main(String[] args) { 
    int portNum = Integer.parseInt(args[0]); 
    try { 
     ServerSocket socket = new ServerSocket(portNum); 
     Socket client = socket.accept(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       client.getInputStream())); 
     PrintWriter writer = new PrintWriter(client.getOutputStream()); 
     Date date = new Date(); 
     writer.print(date.toString()); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

我搶端口上運行,該端口連接到服務器和主機的主要方法的參數,創建套接字和使用的BufferedReader和PrintWriter的。我非常仔細地跟蹤了Oracle的教程,所以我不確定我在哪裏犯了一個錯誤。

+0

爲什麼你的'PrintWriter writer'在服務器中使用不同的構造函數進行初始化,而不是客戶端中使用的構造函數? – Pshemo

回答

4

@EJP是正確的,但我認爲實際的問題是服務器端不關閉或沖洗writer。當服務器退出時,TCP/IP連接會被關閉(由服務器端OS),而沒有任何數據寫入套接字。客戶端JVM看到重置連接並引發異常。

解決方案:在服務器端正確關閉流,客戶端應該看到數據。 (Flushing也可以......但是如果你忽略了在所有情況下都關閉流,你可能會面臨服務器端文件描述符泄漏的問題,因此關閉是最好的解決方案。)

+0

客戶端JVM沒有看到關閉的套接字。它看到*重置連接*並引發異常。重置可能是由於對方沒有關閉套接字,而是Windows重新設置它,或者重新設置它,或者三四個其他的東西。 – EJP

+0

謝謝,關閉了爲我工作的插座。 – hydrozoah

+0

@EJP - 這就是我的意思... –

2

你只讀一個字符,而不是日期。嘗試發送和接收一條線。