using System;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Collections.Generic;
using MultiDup;
namespace BattleRoom
{
internal class Program
{
const int port = 6006; // 端口号(用来监听客户端连接的)
static void Main(string[] args)
{
selfTest();
Console.WriteLine("开启监听......");
Console.WriteLine("ctrl + c 退出程序......");
InitServerPeer();
Task.Run(WatchConnecting).Wait(); // 开启监听线程
}
///
/// 初始化服务器间socket
///
async static void InitServerPeer()
{
var port = 6005; // 连接本机的大厅服务端口
var endPoint = new IPEndPoint(IPAddress.Loopback, port);
//var endPoint = new IPEndPoint(IPAddress.Parse("192.168.10.17"), port);
var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
await client.ConnectAsync(endPoint);
}
catch (Exception ee)
{
Debug.WriteLine(ee.Message);
}
RoomManager.Instance.ServerPeer = new ServerPeer(client); // 给管理器的服务器间socket赋值
RoomManager.Instance.ServerPeer.OnSocketDisconnected += () => { InitServerPeer(); };
}
static void selfTest()
{
var rdb = Redis.Ins.GetDatabase(0);
Debug.Assert(rdb.StringSet("test", "wanggang" + DateTime.Now.ToString("yyyyMMddHHmmss")), "Redis读写失败!");
}
///
/// 监听客户端发来的请求
///
async static Task WatchConnecting()
{
IPAddress ip = IPAddress.Any;
IPEndPoint ipe = new IPEndPoint(ip, port); //将IP地址和端口号绑定到网络节点point上
//定义一个套接字用于监听客户端发来的消息,包含三个参数(IP4寻址协议,流式连接,Tcp协议)
Socket SocketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocketWatch.Bind(ipe); // 监听绑定的网络节点
SocketWatch.Listen(20); // 将套接字的监听队列长度限制为20
while (true) // 持续不断监听客户端发来的请求
{
Socket connection;
try
{
connection = await SocketWatch.AcceptAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); // 提示套接字监听异常
break;
}
RoomManager.Instance.OnNewPeerConnected(new Peer(connection)); // 有新客户端连入
}
SocketWatch.Close(); // 结束监听socket
}
}
}