using System;
namespace Server
{
class Program
{
private static string ipv4Str = "192.168.0.0";
private static int portInt = 2000;
private static int MaxClientConnectNum = 100;
static void Main(string[] args)
{
StartServer startServer = new StartServer(ipv4Str, portInt, MaxClientConnectNum);
startServer.Play();
Console.ReadKey();
}
}
}
using System;
using System.Text;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Linq;
namespace Server
{
class StartServer
{
private string ipv4Str;
private int portInt;
private int MaxClientConnectNum;
private Socket serverSocket;
private HashSet<Socket> connectSockets;
public StartServer(string ipv4Str, int portInt, int MaxClientConnectNum)
{
this.ipv4Str = ipv4Str;
this.portInt = portInt;
this.MaxClientConnectNum = MaxClientConnectNum;
}
~StartServer()
{
CloseAllSocket();
}
public void Play()
{
InitServerSocket();
Thread thread = new Thread(ConnectClientsSocket);
thread.Start();
}
private void InitServerSocket()
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress iPAddress = IPAddress.Parse(ipv4Str);
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, portInt);
serverSocket.Bind(iPEndPoint);
serverSocket.Listen(MaxClientConnectNum);
Console.WriteLine("服务器" + serverSocket.LocalEndPoint + "已启动!");
connectSockets = new HashSet<Socket>();
}
private void ConnectClientsSocket()
{
while (true)
{
Socket connectSocket = serverSocket.Accept();
connectSockets.Add(connectSocket);
Console.WriteLine(connectSocket.RemoteEndPoint + "客户端已在");
Console.Write(connectSocket.LocalEndPoint + "服务器上线!");
Thread thread = new Thread(ReceiveClientData);
thread.Start(connectSocket);
}
}
private void ReceiveClientData(object obj)
{
Socket connectSocket = (Socket)obj;
byte[] messageByte = new byte[connectSocket.ReceiveBufferSize];
while (true)
{
int length = connectSocket.Receive(messageByte);
if (length == 0)
{
Console.WriteLine(connectSocket.RemoteEndPoint + "客户端已从" + connectSocket.LocalEndPoint + "服务器下线!");
break;
}
string messageStr = Encoding.UTF8.GetString(messageByte, 0, length);
Console.WriteLine("从" + connectSocket.RemoteEndPoint + "客户端收到的数据:" + messageStr);
JudgeMessageKind(messageStr, connectSocket);
}
connectSocket.Close();
connectSockets.Remove(connectSocket);
}
private void JudgeMessageKind(string messageStr, Socket connectSocket)
{
if (messageStr.Contains("|"))
{
string[] message = messageStr.Split("|");
if (int.TryParse(message[0], out int id))
{
if (connectSockets.ElementAt(id) != null)
{
SendDataToClient(connectSockets.ElementAt(id), Encoding.UTF8.GetBytes(message[1]));
}
else
{
SendDataToClient(connectSocket, Encoding.UTF8.GetBytes("没有对应id"));
}
}
else
{
switch (message[0])
{
case "message_info_1":
SendDataToClient(connectSocket, Encoding.UTF8.GetBytes("第一种消息的数据"));
break;
case "message_info_2":
SendDataToClient(connectSocket, Encoding.UTF8.GetBytes("第二种消息的数据"));
break;
default:
SendDataToClient(connectSocket, Encoding.UTF8.GetBytes("没有该消息的处理函数"));
break;
}
}
}
else
{
SendDataToClient(connectSocket, Encoding.UTF8.GetBytes(messageStr));
}
}
private void SendDataToClient(Socket connectSocket, byte[] messageByte)
{
StringBuilder stringBuilder = new StringBuilder();
foreach (var item in connectSockets)
{
stringBuilder.Append(item.RemoteEndPoint + "\n");
}
byte[] commonMessage = Encoding.UTF8.GetBytes("客户端已上线个数为:" + connectSockets.Count + "\n上线的客户端如以下所示:\n" + stringBuilder);
foreach (var item in connectSockets)
{
try
{
item.Send(commonMessage);
}
catch
{
Console.WriteLine(item.RemoteEndPoint + "客户端已断开连接,无法发送数据到该客户端!");
}
}
try
{
connectSocket.Send(messageByte);
Console.WriteLine("发回" + connectSocket.RemoteEndPoint + "客户端的数据:" + Encoding.UTF8.GetString(messageByte));
}
catch
{
Console.WriteLine(connectSocket.RemoteEndPoint + "客户端已断开连接,无法发送数据到该客户端!");
}
}
private void CloseAllSocket()
{
foreach (var item in connectSockets)
{
item.Close();
}
connectSockets.Clear();
}
}
}