156 lines
7.9 KiB
C#
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();
|
|
}
|
|
|
|
|
|
}
|
|
} |