using SteedNet.AppCommon;
using SteedNet.NetworkCommEngine;
using SteedNet.NetworkCommEngine.Protocol;
using SteedNet.NetworkCommEngine.Sockets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SteedNet_Server
{
class Program
{
static void Main(string[] args)
{
new MyServer().Start();
}
}
/// <summary>
/// 服务器类
/// </summary>
class MyServer
{
private int m_ConnCount = 0;
private readonly object m_lock = newobject();
/// <summary>
/// 启动服务。
/// </summary>
public void Start()
{
ISocketListener listener = newSocketListener();
// 接收数据大小
listener.Settings.SocketSettings.RecvBufferSize = 2048;
// 网络事件处理委托设置
listener.EventHandlers.OnConnected= this.Server_OnConnected;
listener.EventHandlers.OnDisconnected = this.Server_OnDisconnected;
listener.EventHandlers.OnReceived =this.Server_OnReceived;
listener.EventHandlers.OnSend =this.Server_OnSend;
ushort port = 8085;
IResult result =listener.Serve(port);
if (result.Error !=ErrorResults.None)
{
Console.WriteLine("服务启动失败。端口:{0}",port);
return;
}
else
{
Console.WriteLine("服务启动。端口:{0}",port);
}
Console.WriteLine("按任意键结束程序。");
Console.ReadKey();
listener.Close();
}
private voidServer_OnConnected(ISocketContext _SocketContext, IResult r)
{
// 增加一个数据包验证过滤器
// ProtocolResolver:过滤器使用的数据解析器,构造参数1:协议头标签,构造参数2:协议尾标签
_SocketContext.AddBufferFilter(newValidationProtocolFilter(new ProtocolResolver(10000, 20000)));
// 增加一个连接计数(不是必须的)
Interlocked.Increment(refm_ConnCount);
// 打印连接数
Console.WriteLine(string.Format("[{0}] 新增一个连接,连接总数:{1}。",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), m_ConnCount));
}
private voidServer_OnReceived(ISocketContext _SocketContext, IReadDataBuffer ioBuffer,IResult r)
{
// 如果接收到数据长度不是0,则处理
if (ioBuffer.NumBytes != 0)
{
//----------------------------- 读取数据 ----------------------------
// 标准协议处理
IProtocol protocol = newStandardProtocol(ioBuffer);
int clientID =protocol.ReadInt32(); // 读一个整数
int msgNum =protocol.ReadInt32(); // 读一个整数
string message = protocol.ReadString();// 读一个字符串
// 打印消息
Console.WriteLine("[{0}] 收到客户端数据:\r\n客户端ID:{1}\r\n消息编号:{2}\r\n消息内容:{3}",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), clientID, msgNum,message);
// ----------------------------- 结束读取-----------------------------
// ------------------------- 发送数据到服务器-------------------------
// 可写数据缓冲区
WriteDataBuffer dataBuffer =new WriteDataBuffer();
// 标准数据包
IProtocol protocolWrite = newStandardProtocol(dataBuffer);
protocolWrite.WriteInt32(msgNum+ 1); // 写入一个整数,假设是消息编号
protocolWrite.WriteString("我是服务器,这是字符串数据。");
_SocketContext.SendAsync(dataBuffer);
//----------------------------- 结束发送 -----------------------------
}
}
private voidServer_OnSend(ISocketContext _SocketContext, IWriteDataBuffer ioBuffer, IResultr)
{
Console.WriteLine("[{0}] 数据发送完成。",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
private voidServer_OnDisconnected(ISocketContext _SocketContext, IResult r)
{
//lock (m_lock)
{
Interlocked.Decrement(ref m_ConnCount);
Console.WriteLine(string.Format("[{0}] 有一个连接断开,剩余连接数:{1}。", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),m_ConnCount));
}
}
}
}