我正在ASP.NET網站上工作,它需要創建單個套接字並在當前會話的所有頁面之間保持連接。我創建並存儲了套接字作爲會話對象,並且在頁面重定向後它仍保持連接狀態,但只要發生回發(例如單擊按鈕),連接就會關閉。即使在回發之後,是否有任何方法保持套接字連接打開,因爲要求在整個會話中使用單個連接,並且不能重新連接套接字。如何在回發後保持.NET Socket對象連接打開?
回答
會話狀態很脆弱;實際上,如果您使用序列化會話狀態提供程序(套接字不可序列化),則描述的內容甚至不起作用。
所以:而不是存儲在會話中的插座,把插座其他地方 - 可能是同步的字典 - 並且只存儲一個關鍵給它的會話。例如:
public static class SocketStore
{
static readonly Dictionary<string, Socket> socketStore
= new Dictionary<string, Socket>();
public static string Add(Socket socket)
{
if(socket == null) throw new ArgumentNullException("socket");
string newKey = Guid.NewGuid().ToString();
lock(socketStore) {
socketStore.Add(newKey, socket);
}
return newKey;
}
public static Socket Get(string key)
{
if (string.IsNullOrEmpty(key)) throw new ArgumentNullException("key");
Socket result;
lock (socketStore)
{
if (!socketStore.TryGetValue(key, out result)) result = null;
}
return result;
}
}
在使用,如果你沒有一個插座(/鍵),請創建您的連接,它Add
存儲,然後存儲在會話的關鍵。提取時,您必須處理null
大小寫,您還需要添加自己的同步,以防止來自同一會話的兩個併發請求使用同一個套接字(完全合法)。
然而,隨着其他注意事項:
- ,你會希望有一些額外的工藝清理下來廢棄的會話舊插座,和殭屍插座從看起來健康的會議
- ,您將需要請求繼續回到同一臺服務器 - 如果您在羣集中,那麼「粘性」負載均衡
謝謝,這可以保持套接字連接,但我有另一個問題。發送一個數據包後,我無法再發送一個數據包。發送數據之間是否有默認的等待期,或者是否需要首先發布任何資源? – user1687951
@ user1687951你使用哪個API發送(在Socket上至少有3個)?另外:什麼*發生*?它會拋出異常嗎?如果是這樣:什麼例外?它阻止?什麼? –
我正在使用System.Net.Socket類的Send(byte [] buffer,SocketFlags socketFlags)方法。它被阻止,我沒有得到任何異常。以下是代碼:public string send(string data) byte [] buffer = Encoding.UTF8.GetBytes(data +「\ r \ n」); int byteCount = socket.Send(buffer,SocketFlags.None); } – user1687951
- 1. gmail如何保持打開連接?
- 2. 保持mysql連接打開
- 3. 在MVC回發後保持jquery對話框打開
- 4. 在jdbc中用mysql連接連接後如何保持結果打開?
- 5. 保持客戶端對象模型連接打開
- 6. jQuery:如何保持一個對話框打開後發生asp.net回發
- 7. 保持SYSDBA連接在C++中打開
- 8. 在類對象中保持HTTPClientConnection打開
- 9. 在客戶端關閉後保持Socket服務器打開
- 10. xmlhttprequest在請求處理後是否保持連接打開?
- 11. Python ssh - 在腳本終止後保持連接打開
- 12. Trigger.io保持longpoll連接在後臺打開
- 13. Java套接字:如何在發送文件後保持套接字「打開」?
- 14. 保持數據庫連接打開?
- 15. 快速保持連接打開?
- 16. iOS:保持Http連接打開
- 17. 蜻蜓8.1保持連接打開
- 18. 保持打開的連接TCP/IP
- 19. 如何在Socket長連接中保持CPU使用率較低
- 20. 從網絡斷開連接時保持Oracle連接打開
- 21. 保持TCP連接打開,直到斷開連接Android
- 22. 即使在斷開連接()後,Android BLE BluetoothGatt對象仍保持連接狀態並觸發onCharacteristicChanged()
- 23. 如何在使用Ruby-Amqp時保持AMQP連接打開?
- 24. 如何在進行HTTP隧道時保持連接打開
- 25. 如何保持在Bash中打開的MySQL連接
- 26. C#應該在連接池中保持打開連接
- 27. 關閉VBA後,Textstream對象在Excel中保持打開狀態
- 28. 如何在發送後在OPEN中保持websocket連接狀態?
- 29. 如何保持Socket輸出流打開並多次寫入
- 30. 如何保持一個套接字連接開放將消息發送來回
向我們顯示您的代碼。回傳不會關閉套接字。這個插座用於什麼? – nunespascal
你在談論的連接:你是指瀏覽器和網絡服務器之間的連接,還是網絡服務器和未提及的第三方之間的連接? –
@MarcGravell - 連接位於Web服務器和另一個服務器之間,從那裏通過套接字傳輸一些數據。 – user1687951