2012-09-21 56 views
2

我正在ASP.NET网站上工作,它需要创建单个套接字并在当前会话的所有页面之间保持连接。我创建并存储了套接字作为会话对象,并且在页面重定向后它仍保持连接状态,但只要发生回发(例如单击按钮),连接就会关闭。即使在回发之后,是否有任何方法保持套接字连接打开,因为要求在整个会话中使用单个连接,并且不能重新连接套接字。如何在回发后保持.NET Socket对象连接打开?

+0

向我们显示您的代码。回传不会关闭套接字。这个插座用于什么? – nunespascal

+0

你在谈论的连接:你是指浏览器和网络服务器之间的连接,还是网络服务器和未提及的第三方之间的连接? –

+0

@MarcGravell - 连接位于Web服务器和另一个服务器之间,从那里通过套接字传输一些数据。 – user1687951

回答

0

会话状态很脆弱;实际上,如果您使用序列化会话状态提供程序(套接字不可序列化),则描述的内容甚至不起作用。

所以:而不是存储在会话中的插座,把插座其他地方 - 可能是同步的字典 - 并且只存储一个关键给它的会话。例如:

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大小写,您还需要添加自己的同步,以防止来自同一会话的两个并发请求使用同一个套接字(完全合法)。

然而,随着其他注意事项:

  • ,你会希望有一些额外的工艺清理下来废弃的会话旧插座,和僵尸插座从看起来健康的会议
  • ,您将需要请求继续回到同一台服务器 - 如果您在群集中,那么“粘性”负载均衡
+0

谢谢,这可以保持套接字连接,但我有另一个问题。发送一个数据包后,我无法再发送一个数据包。发送数据之间是否有默认的等待期,或者是否需要首先发布任何资源? – user1687951

+0

@ user1687951你使用哪个API发送(在Socket上至少有3个)?另外:什么*发生*?它会抛出异常吗?如果是这样:什么例外?它阻止?什么? –

+0

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

相关问题