WRJServer/GameServer/Program.cs

156 lines
7.9 KiB
C#

using NetMQ;
using NetMQ.Sockets;
using System;
using System.Collections.Concurrent;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace GameServer
{
internal class Program
{
private static ConcurrentDictionary<string, TcpClient> clients = new ConcurrentDictionary<string, TcpClient>();
public static SubscriberSocket ToClientSubscriber;
public static PublisherSocket ToClientPublisher;
static void Main(string[] args)
{
Task.Run(RunServer);
ToClientPublisher = new PublisherSocket();
ToClientPublisher.Bind("tcp://*:8888");
}
static async Task RunServer()
{
int port = 12345;
TcpListener listener = new TcpListener(IPAddress.Any, port);
listener.Start();
Console.WriteLine($"Server listening on port {port}");
while (true)
{
TcpClient client = await listener.AcceptTcpClientAsync();
_ = HandleClientAsync(client);
}
}
static async Task HandleClientAsync(TcpClient client)
{
using (NetworkStream stream = client.GetStream())
{
string clientAddress = client.Client.RemoteEndPoint.ToString();
clients.TryAdd(clientAddress, client);
var user = User.Create(client, stream);
Console.WriteLine($"Client connected: {clientAddress}");
byte[] buffer = new byte[4096];
byte[] response = null;
int bytesRead;
while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
string data = Encoding.UTF8.GetString(buffer, 0, bytesRead);
//Console.WriteLine($"Received from {clientAddress}: {data}");
string[] commands = data.Split(" ");
if (commands.Length > 0)
{
switch (commands[0])
{
case "test":
Console.WriteLine($"测试 {commands[1]}");
break;
case "regist"://注册临时身份
user.Regist(commands[1]);
Console.WriteLine($"注册 {commands[1]}");
break;
case "getusers"://获取用户列表
response = Encoding.UTF8.GetBytes(string.Format("getusers {0}", User.GetUsers(user.userId)));
await stream.WriteAsync(response, 0, response.Length);
break;
case "createroom"://创建房间
Console.WriteLine($"创建房间 {commands[1]}");
var room = Room.Create(commands[1], user.userId);
response = Encoding.UTF8.GetBytes(string.Format("createroom {0},{1},{2}", room.roomId, room.roomname, room.creater));
ToClientSubscriber.Subscribe(room.roomId.ToString());
Console.WriteLine("订阅:" + room.roomId.ToString());
await stream.WriteAsync(response, 0, response.Length);
break;
case "getrooms"://获取所有房间
response = Encoding.UTF8.GetBytes(string.Format("getrooms {0}", Room.GetRooms()));
await stream.WriteAsync(response, 0, response.Length);
break;
case "getownrooms"://获取自己创建的房间
response = Encoding.UTF8.GetBytes(string.Format("getownrooms {0}", Room.GetRooms(user.userId)));
await stream.WriteAsync(response, 0, response.Length);
break;
case "joinroom"://加入房间
string join = Room.JoinRoom(user, ulong.Parse(commands[1]));
if (!string.IsNullOrWhiteSpace(join))
{
response = Encoding.UTF8.GetBytes(string.Format("joinroom {0}", join));
await stream.WriteAsync(response, 0, response.Length);
}
break;
case "getroomusers"://获取所在房间的用户
response = Encoding.UTF8.GetBytes(string.Format("getroomusers {0}", User.GetUsers(user.userId, user.roomId)));
await stream.WriteAsync(response, 0, response.Length);
break;
case "joins"://批量加入房间
List<User> users = Room.BatchJoinRoom(ulong.Parse(commands[1]));
for (int i = 0; i < users.Count; i++)
{
User.Send2User(users[i].userId, string.Format("send2user joins"));
}
//response = Encoding.UTF8.GetBytes(string.Format("joins {0}", joins));
//await stream.WriteAsync(response, 0, response.Length);
break;
case "leaveroom"://离开房间
string leave = Room.LeaveRoom(user);
if (!string.IsNullOrWhiteSpace(leave))
{
response = Encoding.UTF8.GetBytes(string.Format("leaveroom {0}", leave));
await stream.WriteAsync(response, 0, response.Length);
}
Console.WriteLine($"离开房间 {leave}");
break;
case "closeroom"://关闭房间
string close = Room.CloseRoom(ulong.Parse(commands[1]));
if (!string.IsNullOrWhiteSpace(close))
{
response = Encoding.UTF8.GetBytes(string.Format("closeroom {0}", close));
ToClientSubscriber.Unsubscribe(close);
Console.WriteLine("退订:" + close);
await stream.WriteAsync(response, 0, response.Length);
}
break;
case "send2user"://对用户说
User.Send2User(ulong.Parse(commands[1]), string.Format("send2user {0}", commands[2]));
break;
case "send2room"://对房间说
User.Send2Room(user.userId, user.roomId, string.Format("send2room {0}", commands[1]));
Console.WriteLine($"send2room {commands[1]}");
break;
case "send2world"://对世界说
User.Send2World(user, string.Format("send2world {0}", commands[1]));
break;
case "player"://对player说
User.Send2Player(user.userId, user.roomId, string.Format("player {0}", commands[1]));
break;
}
}
}
clients.TryRemove(clientAddress, out _);
user.OffLine();
Console.WriteLine($"Client disconnected: {clientAddress}");
}
client.Close();
}
}
}