1.我现在定义了一个全局的变量,用来存储当前在线的客户端
/// <summary>
/// 当前所有在线客户端
/// </summary>
internal IDictionary<string, MySocketAsyncEventArgs> ClientList;2.现在有个定时器定时去发送数据给这些客户端
/// <summary>
/// 定时轮询
/// </summary>
/// <param name="myObject"></param>
/// <param name="myEventArgs"></param>
internal void Timer_Elapsed(Object myObject, System.Timers.ElapsedEventArgs myEventArgs)
{
string[] keys = readWritePool.OnlineUID;
for (int i = 0; i < keys.Length; i++)
{
if (!string.IsNullOrEmpty(keys[i])&&readWritePool.ClientList.ContainsKey(keys[i]))
{
MySocketAsyncEventArgs e = readWritePool.ClientList[keys[i]];
if (e.IsAlive)
{
Byte[] sendBuffer = Encoding.Default.GetBytes("Hello World!");
Socket s = e.UserToken as Socket;
SendData(s, sendBuffer);
}
}
}
}3.另外主线程时刻去侦听客户端,如果客户端断开,立马从ClientList删除
private void CloseClientSocket(string uid)
{
if (uid == string.Empty || uid == "")
return;
SocketAsyncEventArgsWithId saeaw = readWritePool.FindByUID(uid);
if (saeaw == null)
return;
Socket s = saeaw.ReceiveSAEA.UserToken as Socket;
try
{
s.Shutdown(SocketShutdown.Both);
}
catch (Exception)
{
//客户端已经关闭
}
this.semaphoreAcceptedClients.Release();
Interlocked.Decrement(ref this.numConnections);
this.readWritePool.Push(saeaw);
}现在就有个问题了,假如3将某个客户端A从ClientList删除了,并且关闭了Socket连接,但是2中还没有及时更新,导致其访问的还是旧数据,所以当给A发送数据时就立马报错,因为这时候A已经断开了,请问我如何保证2中在执行发送的时候始终是在线的客户端呢?
/// <summary>
/// 当前所有在线客户端
/// </summary>
internal IDictionary<string, MySocketAsyncEventArgs> ClientList;2.现在有个定时器定时去发送数据给这些客户端
/// <summary>
/// 定时轮询
/// </summary>
/// <param name="myObject"></param>
/// <param name="myEventArgs"></param>
internal void Timer_Elapsed(Object myObject, System.Timers.ElapsedEventArgs myEventArgs)
{
string[] keys = readWritePool.OnlineUID;
for (int i = 0; i < keys.Length; i++)
{
if (!string.IsNullOrEmpty(keys[i])&&readWritePool.ClientList.ContainsKey(keys[i]))
{
MySocketAsyncEventArgs e = readWritePool.ClientList[keys[i]];
if (e.IsAlive)
{
Byte[] sendBuffer = Encoding.Default.GetBytes("Hello World!");
Socket s = e.UserToken as Socket;
SendData(s, sendBuffer);
}
}
}
}3.另外主线程时刻去侦听客户端,如果客户端断开,立马从ClientList删除
private void CloseClientSocket(string uid)
{
if (uid == string.Empty || uid == "")
return;
SocketAsyncEventArgsWithId saeaw = readWritePool.FindByUID(uid);
if (saeaw == null)
return;
Socket s = saeaw.ReceiveSAEA.UserToken as Socket;
try
{
s.Shutdown(SocketShutdown.Both);
}
catch (Exception)
{
//客户端已经关闭
}
this.semaphoreAcceptedClients.Release();
Interlocked.Decrement(ref this.numConnections);
this.readWritePool.Push(saeaw);
}现在就有个问题了,假如3将某个客户端A从ClientList删除了,并且关闭了Socket连接,但是2中还没有及时更新,导致其访问的还是旧数据,所以当给A发送数据时就立马报错,因为这时候A已经断开了,请问我如何保证2中在执行发送的时候始终是在线的客户端呢?
解决方案 »
- 浮动窗体问题
- C# 热键 WinAPI 请高手指教?我想在线程中接收热键消息,不创Win窗体。请帮忙!!!
- 一道面试题,哪位大哥会做呀?我没有分了。。。
- 没有可用的错误信息: DB_SEC_E_AUTH_FAILED(0x80040E4D)。 这个错误是怎么回事?
- 当 DataSet 内容更新后,如何重新绑定控件值
- 高手们这个你们会吗?!帮我解决了散100分
- 一个属性根据另一个属性来操作,对象异步属性
- 多用户输入保存问题
- 来看看这个题,求程序。感谢!
- 怎么调试c#小程序段!!!!!!!----在线等!!!
- 在VS2008中窗口继承后,DataGridView不能在设计器中修改属性?
- sql语句有问题,急!
public bool Active
{
get
{
lock (syncActive)
{
return active;
}
}
set
{
lock (syncActive)
{
active = value;
}
} }
在3中关闭客户端连接前设置Active=false;
在2中发送数据前判断该客户端的Active是否为true;
/// <summary>
/// 发送数据包
/// </summary>
/// <param name="sock"></param>
/// <param name="data"></param>
public void SendData(Socket sock, byte[] data,MySocketAsyncEventArgs e)
{
if (e.IsAlive)
{
sock.BeginSend(data, 0, data.Length, SocketFlags.None, AsynCallBack, sock);
}
} /// <summary>
///
/// </summary>
/// <param name="result"></param>
void AsynCallBack(IAsyncResult result)
{
try
{
Socket sock = result.AsyncState as Socket; if (sock != null)
{
sock.EndSend(result);
}
}
catch
{
}这是判断是否用的属性 private bool isAlive = false; object syncActive = new object(); /// <summary>
/// 是否可用
/// </summary>
public bool IsAlive
{
get
{
lock (syncActive)
{
return isAlive;
}
}
set
{
lock (syncActive)
{
isAlive = value;
}
}
}但是还会报错哦