C# 的服务器向之前登陆的时候保存的客户端Socket发送数据的时候报错了

报错:The operation is not allowed on non-connected sockets.
问题是这样的,制作添加好友模块时,遇到了一个问题,就是在登录的时候,服务端会通过ID绑定那个Socket:


//目前在线的客户端字典,与ID绑定
Dictionary<int, Socket> DicOnlineClients;

绑定:

 //向目前在线的客户端列表添加这个客户端
DicOnlineClients.Add(playerID, packet._peer);

然后发送好友请求的时候会通过这个ID发到与这个ID绑定的Socket上,前提是这个客户端没有离线

 //获取此ID的Socket
Socket socket;
if (DicOnlineClients.TryGetValue(FriendID,out socket))
{
    _server.Send(SendStream, socket);
}

但是问题出在,在Send的时候,报错了 The operation is not allowed on non-connected sockets.
可是我客户端的socket明明是在线的啊
请大神帮忙解答下。或者有没有其他的方法,用于向指定的客户端发送数据的,我这里用的是通过玩家ID辨识

http://stackoverflow.com/questions/4170301/operation-not-allowed-on-non-connected-sockets-c-sharp-4-0
https://www.codeproject.com/questions/189660/operation-not-allowed-on-non-connected-sockets
https://bytes.com/topic/asp-net/answers/875948-socket-exception-operation-not-allowed-non-connected-sockets
https://forums.asp.net/t/1476689.aspx?Socket+Exception+is+The+operation+is+not+allowed+on+non+connected+sockets+

send 返回并不表示数据发送成功,它只表示数据被拷贝到了发送缓冲区,下面将有协议栈来完成物理传输过程。
当协议栈在发送数据时,发送缓冲区是锁定的,这时在往里面拷贝数据是不成功的;
也就是说,在发送数据时,在send是会失败的。所以每次send都需要检查返回值。
就是你发送太快了 等对方接收了 你的send就会成功了 所以为了效率 你至少用下select、event等等这些简单的模式...