2012-04-13 49 views
0

我有客戶端服務器應用程序 - C++上的客戶端(在AIX上運行,使用庫)和Java上的服務器(在Win和AIX上運行,使用java.net。)。應用 結構是接下來
服務器從輸入streanclien-server應用程序。總是打開套接字

//... 
while (true) 
     { 
      final Socket s = ss.accept(); 
      pool.execute(new Service(s)); 
     } 
// .. 

Service.class中獲取字節和發送字節otputstream。 並關閉插座S

Cleint

SendMessage(msg) 
{ 
// ... 
    const int socketFD = OpenSocket(); 
// send bytes 
// receive bytes 
    close(socketFD); 
} 

問題是下一步:我可以在客戶端一旦開放套接字 發送消息,接收消息,並在一段時間後發送新mesage 和收到新消息。 沒有重新打開插座?

回答

2

當然可以。但是,服務器應該理解預計會有多條消息,並且不應在客戶端關閉連接之前終止服務。你的實現的問題是,服務是一個Runnable而不是一個線程。如果它會循環接收消息,它將保持它正在運行的線程。如果您使用FixedThreadPool,則可能會導致所有池線程耗盡並且下一個Service將等到之前的客戶端斷開連接時發生。使用CachedThreadPool可以避免這種情況,但結果是,使用的線程數等於客戶端的數量。如果您有足夠的主內存(每個線程使用大約0.5 Mb),這不是問題。如果你想節省內存,你可以使用異步網絡庫,如Apache Netty。 Java 7實現了異步通道。

https://github.com/rfqu/df4j是一個輕量級的數據流庫,它包含一個Java7異步網絡設施的包裝,使它們更易於使用。

0

是的。除了HTTP大多數協議使用持久連接(SMTP,POP3,FTP,ICQ,......)

相關問題