⑴ 如何干凈的實現Android/java Socket 長連接通信
在遠標實現過:socket模擬網頁的報文連接某個網站,創建tcp的socket後,當我socket.connect後,如果在5到7秒鍾不socket.send,那麼這個鏈接就失效了。 請問如何長時間的保持這個鏈接
這是在伺服器端的設置的,客戶端沒法設置,可以發送心跳包。
socket.connect後,每3-4秒用socket.send發送一位元組數據(內容隨便),然後觀查這個連接是否保持。
lientSocket=serverSocket.accept();
OutputStream os = clientSocket.getOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(os);
oos.writeObject(al);
oos.flush();
oos.close()//socket會關閉
實現:
長連接的維持,是要客戶端程序,定時向服務端程序,發送一個維持連接包的。
如果,長時間未發送維持連接包,服務端程序將斷開連接。
客戶端:
通過持有Client對象,可以隨時(使用sendObject方法)發送Object給服務端。
如果keepAliveDelay毫秒(程序中是2秒)內未發送任何數據,則,自動發送一個KeepAlive對象給服務端,
用於維持連接。
由於,我們向服務端,可以發送很多不同的對象,服務端也可以返回不同的對象。
所以,對於返回對象的處理,要編寫具體的ObjectAction實現類進行處理。
通過Client.addActionMap方法進行添加。這樣,程序會回調處理。
服務端:
由於客戶端會定時(keepAliveDelay毫秒)發送維持連接的信息過來,所以,服務端要有一個檢測機制。
即當服務端receiveTimeDelay毫秒(程序中是3秒)內未接收任何數據,則,自動斷開與客戶端的連接。
ActionMapping的原理與客戶端相似(相同)。
通過添加相應的ObjectAction實現類,可以實現不同對象的響應、應答過程。
⑵ java怎麼實現長連接
應該是HTTP連接吧,HTTP連接本身的request/response模式設計就是短鏈接的,即伺服器端響應之後斷開連接。
若要做長連接,在沒有具體業務的情況下,最基礎的就是建立java.net.Socket連接,自己制定協議來控制斷開。伺服器端的實現老的有標准IO(java.net.*),新的有NIO(java.nio.*)。有具體業務時可以考慮一些成熟的協議來實現,如XMPP等。
⑶ java Socket 短連接和長連接的區別
所謂長連接,指在一個TCP連接上可以連續發送多個數據包,在TCP連接保持期間,如果沒有數據包發送,需要雙方發檢測包以維持此連接,一般需要自己做在線維持。
短連接是指通信雙方有數據交互時,就建立一個TCP連接,數據發送完成後,則斷開此TCP連接,一般銀行都使用短連接。
比如http的,只是連接、請求、關閉,過程時間較短,伺服器若是一段時間內沒有收到請求即可關閉連接。
其實長連接是相對於通常的短連接而說的,也就是長時間保持客戶端與服務端的連接狀態。
長連接與短連接的操作過程:
通常的短連接操作步驟是:
連接→數據傳輸→關閉連接;
而長連接通常就是:
連接→數據傳輸→保持連接(心跳)→數據傳輸→保持連接(心跳)→……→關閉連接;
這就要求長連接在沒有數據通信時,定時發送數據包(心跳),以維持連接狀態,短連接在沒有數據傳輸時直接關閉就行了.
⑷ java socket 長連接 客戶端
首先說長連接和短連接
短連接:在獲得tcp連接之後發送數據,然後關閉連接
長連接:獲得tcp連接之後,有數據則發送數據,無數據發送則定時發送數據包,保持連接狀態.
長短只是相對的
你的需求應該在取得socket連接之後建立輸入輸出流,在輸入流得到相應數據之後就可以關閉連接了
⑸ 如何用java實現HTTP長連接
咱的理解:
當應用程序讀取完響應體內容後或者調用 close() 關閉了URLConnection.getInputStream()返回的流,
JDK中的HTTP協議句柄將關閉連接,並將連接放到連接緩存中。下次獲取URLConnection示例,並獲取InputStream流時,會再次使用之前打開的TCP連接。
也就是說:
public static String sendPost(String url, String param) { String result = ""; try { URL httpurl = new URL(url); HttpURLConnection httpConn = (HttpURLConnection) httpurl.openConnection(); httpConn.setDoOutput(true); httpConn.setDoInput(true); PrintWriter out = new PrintWriter(httpConn.getOutputStream()); out.print(param); out.flush(); out.close(); BufferedReader in = new BufferedReader(new InputStreamReader(httpConn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } in.close(); } catch (Exception e) { System.out.println("沒有結果!" + e); } return result; }
咱在間隔較短的時間內調用上面的方法(連接的地址不一樣,但還是同一個伺服器同一個項目),用的是同一個TCP連接。咱這么理解對嗎?不對的話請具體講講。謝謝。
⑹ 請教大神,java socket介面,TCP長連接,怎麼解析和發送一種協議格式數據包
建議你下載我的java版本至尊聊天程序源碼下去參考。在CSDN或網路上找吧。
協議完全自己來定製,數據以位元組發送,以什麼開始,什麼結束,中間分幾段,都可由你自己來定,接收時,就按你定的規則來解析並還原。比如:我要的協議格式為
:>10:3:5:content:<
:>表示一條消息的開始。
10表示總消息長度(只是個代數,有可能不是10,需要你在發送前計算)
:為分隔符
3為頭消息長度,也可能不是3
5表示後面的消息內容長度,甚至還可以定製,是否有圖片,從多少位置開始是圖片的數據。
:<表示結束標志
沒有人限制你的協議。
關鍵一點:你在收取的時候,一定要注意數據可能會粘包,這個問題很頭疼的。因為一般都是多線程模式。這需要你自己來處理它。一言難清。可以參考我的聊天程序。
⑺ 有個Java 項目,通過Socket Tcp長連接通信方式向伺服器發送消息。
你這消息頭、消息體的結構格式都定下來了,總長度就是固定的啊?消息體的長度不是一共2+2+4+1=9個位元組么?消息格式肯定要按照服務端的要求進行發送,明顯服務端不是java的程序。。但是java里是沒有Unsigned Integer這種數據類型的(java的stream操作里提供了一些unsigned的方法,或者自己寫方法來生成對應的位元組格式),你可以按照他的要求,使用位元組數組封裝好,然後發送。
針對這個示例消息,你可以:
創建一個長度為9的位元組數組。把「9」變成byte放入前兩個位元組(前兩個位元組數據應該為:0x00, 0x09。這是第一個欄位,長度),後面的欄位數據以此類推。一個欄位一個欄位處理成伺服器要求的格式。
然後把位元組流發送給服務端。