SixiBroadcast/UDPServer/ServerListen.cs

107 lines
3.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace UDPServer
{
class ServerListen
{
UdpClient client;
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);
Dictionary<string, IPEndPoint> userinfo = new Dictionary<string, IPEndPoint>();
public ServerListen(int port)
{
client = new UdpClient(new IPEndPoint(IPAddress.Any, port));
//启动客户端监听
Thread t = new Thread(new ThreadStart(ClientThread));
t.Start();
Console.WriteLine("请输入指令 或者 /help 查看帮助");
while (true)
{
string msg = Console.ReadLine();
if (msg.StartsWith("/"))
{
switch (msg.Substring(1))
{
case "help":
Console.WriteLine("/list 查看在线人员");
Console.WriteLine("/broadcast 发送公告");
break;
case "list":
Console.Write("当前在线(" + userinfo.Keys.Count + "): ");
foreach (var item in userinfo)
{
Console.Write(item.Key + " ");
}
break;
case "broadcast":
if (msg.IndexOf(' ') > 0)
BroadcastMsg(msg.Substring(msg.IndexOf(' ')));
else
Console.WriteLine("请输入公告内容!");
break;
default:
Console.WriteLine("未知命令 请输入指令 或者 /help 查看帮助");
break;
}
}
}
}
public void sendMsg(string username, string msg)
{
Console.WriteLine("发送给用户: " + username + " 消息: " + msg);
byte[] buf = Encoding.UTF8.GetBytes(msg);
client.Send(buf, buf.Length, userinfo[username]);
}
private void BroadcastMsg(string msg)
{
foreach (var item in userinfo)
{
sendMsg(item.Key, msg);
}
}
private void ClientThread()
{
try
{
Console.WriteLine("服务器开始监听...");
while (true)
{
byte[] buf = client.Receive(ref endpoint);
string msg = Encoding.UTF8.GetString(buf);
string[] info = msg.Split(' ');
if (info.Length == 3)
{
string user = info[0];
string ip = info[1];
int port = int.Parse(info[2]);
IPEndPoint addr = new IPEndPoint(IPAddress.Parse(ip), port);
if (userinfo.ContainsKey(user))
{
userinfo[user] = addr;
Console.WriteLine("用户: " + user + " 更新数据 IP: " + ip + " 端口: " + port);
}
else
{
userinfo.Add(user, addr);
Console.WriteLine("用户: " + user + " 登录服务器 IP: " + ip + " 端口: " + port + "当前在线: " + userinfo.Keys.Count);
}
}
}
}
catch (Exception)
{
client.Close();
}
}
}
}