2011-03-31 63 views
2

我在使用Java中的套接字時遇到了一些問題。我正在創建一個不斷需要將數據發送到服務器的應用程序。數據通過客戶端的套接字發送。我正在使用以下代碼:如何在Java中使用套接字

serverAddr = InetAddress.getByName(ipAddress); 

while(send) 
{ 
    soc=new Socket(serverAddr,8210); 
    outStream=soc.getOutputStream(); 
    outStream.write(data); 
    outStream.close(); 
} 

上述代碼工作正常,沒有問題。 這裏我在每個循環中創建一個Socket的新對象,我認爲這不是一個好的實現方法。如何使用一個Socket將數據發送到服務器? (我不希望創建在每一個循環的新對象)

這裏是我寫在C#服務器的代碼:

while (true) 
{ 
    Socket s = listener.AcceptSocket(); 
    NetworkStream ns = new NetworkStream(s); 
    int d; 
    while ((d = ns.ReadByte()) >= 0) 
    { 
     //Process data here 
    } 
    s.Close(); 
} 

而且我需要在服務器端做什麼修改?

感謝

+1

在單個流上發送多條消息,並在多個流上發送1條消息之間存在一些根本區別;特別是您的「過程數據在這裏」需要能夠正確區分不同的消息。你可能已經有這個覆蓋了...我只是提到它是徹底的 – 2011-03-31 07:12:35

+0

@Marc,在這種情況下消息是分開的,因爲他爲每個消息打開一個新的套接字。非常低效,但它確實分解了郵件;) – 2011-03-31 07:15:15

+0

@Peter - exactly;如果他切換到一個套接字,則會發生變化。根據消息格式的不同,*可能會很好,或者*可能需要調整 - 例如每條消息的長度前綴 – 2011-03-31 07:18:36

回答

2

請記住,創建一個新的Socket對象也將創造新的TCP連接。如果您想使用單個連接,請保留輸出流。您需要考慮清理異常,並且如果兩者之間存在暫時的網絡故障,您可能還需要在此附加一層進行恢復。

serverAddr = InetAddress.getByName(ipAddress); 


soc=new Socket(serverAddr,8210); 
try { 
    outStream=soc.getOutputStream(); 
    while(send) 
    { 
     outStream.write(data); 
    } 
    outStream.close(); 
} finally { 
    soc.close(); 
} 

對於服務器端:你的代碼基本上是正確的,但你還需要考慮清理(用using),和馬克·Gravell指出的那樣,你需要確保你能當發現消息邊界正在使用單個TCP連接。

+0

謝謝,它只是幫助我找到一個正確的方式... :) – 2011-03-31 08:33:56