110,534
社区成员
发帖
与我相关
我的任务
分享
private void OnIOCompleted(object sender, SocketAsyncEventArgs e)
{
// Determine which type of operation just completed and call the associated handler.
switch (e.LastOperation)
{
case SocketAsyncOperation.Receive:
this.ProcessReceive(e);
break;
case SocketAsyncOperation.Send:
this.ProcessSend(e);
break;
default:
throw new ArgumentException("The last operation completed on the socket was not a receive or send");
}
}
private void ProcessReceive(SocketAsyncEventArgs e)
{
// Check if the remote host closed the connection.
if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
{
Socket s = e.UserToken as Socket;
Int32 bytesTransferred = e.BytesTransferred;
// Get the message received from the listener.
String received = Encoding.ASCII.GetString(e.Buffer, e.Offset, bytesTransferred);
// Increment the count of the total bytes receive by the server.
Interlocked.Add(ref this.totalBytesRead, bytesTransferred);
Console.WriteLine("Received: {0}\"{1}\". The server has read a total of {2} bytes.", s.RemoteEndPoint, received, this.totalBytesRead);
}
else
{
this.CloseClientSocket(e);
}
}
/// <summary>
/// 处理接收数据
/// </summary>
/// <param name="receiveArgs"></param>
protected void processReceive(SocketAsyncEventArgs receiveArgs)
{
var user = receiveArgs.UserToken as UserToken;
// 只有当有数据且正常连接的时候才处理
if (receiveArgs.BytesTransferred > 0 && receiveArgs.SocketError == SocketError.Success)
{
// 截取收到的数据包
byte datas = new byte;
Array.Copy(receiveArgs.Buffer, receiveArgs.Offset, datas, 0, receiveArgs.BytesTransferred);
// 触发外部事件
triggerOnReceived(user, datas);
// 继续接收下个数据包
startReceive(user.Socket, receiveArgs);
}
else
{
loger.WriteLine("Socket Receive SocketError: " + receiveArgs.SocketError);
closeSocket(user);
}
}
private void _server_OnReceived(UserToken user, byte[] bytes)
{
var puser = _users[user.Id];
var packetMg = puser.PacketManager;
// 追加字节流数据包
packetMg.Push(bytes);
// 弹出一个业务数据包
var packet = packetMg.PopPacket();
while (packet != null)
{
triggerOnReceivePacket(puser, packet);
packet = packetMg.PopPacket();
}
}
/// <summary>
/// 客户端Socket对象类
/// </summary>
public class ClientInfo
{
public byte[] Buffer { get; set; }
public ByteQueue Queue { get; set; }
public Socket Socket { get; set; }
}