服务器端:
static List<Client> clients = new List<Client>();
/// <summary>
/// 广播消息
/// </summary>
/// <param name="message"></param>
public static void BroadcastMessage(string message)
{
var notCnnected=new List<Client>();
foreach (var client in clients)
{
if (client.Connected)
{
client.SendMessage(message);
}
else
{
notCnnected.Add(client);
}
}
foreach (var temp in notCnnected)
{
clients.Remove(temp);
}
}
static void Main(string[] args)
{
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
tcpServer.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7899));
tcpServer.Listen(100);
Console.WriteLine("开始监听!");
while (true)
{
Socket tcpClient = tcpServer.Accept();
Console.WriteLine("一个客户端已经连接!");
Client client = new Client(tcpClient);//把与客户端通信的逻辑(收发消息)放到Client里面进行处理
clients.Add(client);
}
}
服务器端还需要一个类用来处理和客户端通信的逻辑(收发消 class Client
{
private Socket clientSocket;
private Thread t;
private byte[] data = new byte[1024];
public bool Connected { get { return clientSocket.Connected; } }
public Client(Socket clientSocket)
{
this.clientSocket = clientSocket;
//启动一个线程处理客户端的数据接收
t = new Thread(ReceiveMessage);
t.Start();
}
public void SendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
}
private void ReceiveMessage()
{
//一直接受客户端的数据
while (true)
{
if (clientSocket.Poll(10,SelectMode.SelectRead))
{
clientSocket.Close();
break;
}
int length=clientSocket.Receive(data);
string message = Encoding.UTF8.GetString(data,0,length);
//TODO:服务器端接收到数据的时候分发到客户端
//广播这个消息
Program.BroadcastMessage(message);
}
}
}:
static void Main(string[] args)
{
Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse("127.0.0.1");
EndPoint point = new IPEndPoint(ip, 7899);
tcpClient.Connect(point);
Thread t = new Thread(ReceiveMessage);
t.Start(tcpClient);
while (true)
{
string message = Console.ReadLine();
if (message == "q")
{
tcpClient.Close();
break;
}
byte[] data = Encoding.UTF8.GetBytes(message);
tcpClient.Send(data);
}
//tcpClient.Shutdown(SocketShutdown.Both);
}
static void ReceiveMessage(object s)
{
while (true)
{
byte[] data = new byte[1024];
int length = (s as Socket).Receive(data);
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine(message);
}
}