我正在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