2015-12-21 34 views
0

在服务器/客户端应用程序中,是否使用定时器来检查每个客户端是否连接了内存?通过定时器处理套接字连接状态是否好?

例如一个Socket服务器接受一个客户机Socket并将其添加到列表,然后经由循环检查在列表中的每个客户端,如果没有连接然后从List<>取出并触发一个事件的定时器..但是,尽管这种方式听起来很难,特别是计时器的间隔是1秒...如果有1000个客户端连接,计时器是否可以在1秒内检查它们?还是应该让它变大?

我关心我的应用程序使用的内存,并在1秒中检查许多客户的定时器功能。这是一种真正的方式吗?先谢谢了。

+1

没有任何代码很难给出具体的建议(因此评论和不回答),但没有 - 我会说这不好。相反,使用事件断开时引发的事件,并准备好处理断开的客户端的异常。 –

+0

我没有使用代码,因为问题会很长,无法回答,加上我的问题非常具体,谢谢你的回答,我认为,但是使用事件和处理异常并不比这种方式准确,对吗? – suw61678

+0

如果有的话,它们更准确,尤其是处理异常。比方说,你有一个连接的客户端,你的计时器检查并看到他们连接。然后他们断开。您仍然认为它们已连接,并尝试在定时器的下一个循环之前发送消息。例外 - 无论如何需要处理它。 –

回答

1

不,这不是一个好主意,因为它已经实现了这样的机制,同时在Timeout发送操作和接收操作,也就是说如果你设置10秒的接收超时,请拨打Receive并没有到来的时候,它已经将抛出一个异常,通知你,你想用定时器做...

0

我最后一次创建像你所描述的一个服务器/客户端应用程序,我创建了优先级设置BelowNormal一个新的线程。

与定时器的唯一的事情是,他们(可能)UI线程意味着你的形式将变得反应迟钝或laggy内执行。

然后我基本上是连续循环的线程里面做/ While循环,直到应用程序关闭。快速投入Threading.Thread.Sleep(100)并且性能将会很好。

在循环中,我会检查传入的连接请求,并像你说的,把它们添加到列表等等,那么你也可以处理与每个连接的客户端通信也因为它会影响轻微。

Private Sub StartSocketsServer() 
    Try 
     Dim oThread As New Threading.Thread(AddressOf StartSocketsServer_Threaded) 
     With oThread 
      .Name = "Socket Server" 
      .Priority = Threading.ThreadPriority.BelowNormal 
      .IsBackground = True 
      .Start() 
     End With 
    Catch ex As Exception 
     'Handle exception 
    End Try 
End Sub 

Private Sub StartSocketsServer_Threaded() 
    Try 
     Do 
      'Perform all of your sockets here in a threaded environment. 


      Threading.Thread.Sleep(1000) '1 sec 

     Loop Until Me.IsDisposed 

    Catch ex As Exception 
     'Handle thread safe exceptions here 
    End Try 
End Sub