服務(wù)器模塊
sever部分
server2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace ConsoleApp8
{
class Sever2
{
private Socket serverSocket;
private List<Socket> clientList;//存儲(chǔ)連進(jìn)來的客戶端
//構(gòu)造函數(shù)
public Sever2()
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientList = new List<Socket>();//連一個(gè)客戶端往里面加一個(gè)
}
//啟動(dòng)函數(shù)
public void Start()
{
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 12305));
serverSocket.Listen(10);
Console.WriteLine("服務(wù)器啟動(dòng)成功!");
Thread threadAccept = new Thread(Accept);
threadAccept.IsBackground = true;
threadAccept.Start();
}
private void Accept()
{
//接收客戶端的方法,會(huì)掛起當(dāng)前線程
Socket client = serverSocket.Accept();
IPEndPoint ipPoint = client.RemoteEndPoint as IPEndPoint;
Console.WriteLine($"{ipPoint.Address} [{ipPoint.Port}]連接成功!");
clientList.Add(client);
Thread threadReceive = new Thread(Receive);
threadReceive.IsBackground = true;
threadReceive.Start(client);
Accept();
}
private void Receive(object obj)
{
Socket client =obj as Socket;
IPEndPoint ipPoint = client.RemoteEndPoint as IPEndPoint;
try
{
byte[] msg = new byte[1024];
int msgLen = client.Receive(msg);
String msgStr = $"{ipPoint.Address}[{ipPoint.Port}] 說: {Encoding.UTF8.GetString(msg, 0, msgLen)}";
Console.WriteLine(msgStr);
Broadcast(client, msgStr);
//服務(wù)器往客戶端發(fā)消息
//client.Send(Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(msg, 0, msgLen) + "-樓上說的對(duì)"));
Receive(client);//尾遞歸
}
catch
{
string catchStr = $"{ipPoint.Address}[{ipPoint.Port}]斷開";
Console.WriteLine(catchStr);
Broadcast(client, catchStr);
clientList.Remove(client);
}
}
private void Broadcast(Socket clientOther, string msg)
{
foreach(var item in clientList)
{
if(item==clientOther)
{
//同一客戶端,無需響應(yīng)
}
else
{
item.Send(Encoding.UTF8.GetBytes(msg));
}
}
}
}
}
主程序部分
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp8
{
class Program
{
static void Main(string[] args)
{
Sever2 sever2 = new Sever2();
sever2.Start();
Console.ReadKey();
}
}
}
客戶端模塊
client部分
ClientSocket.cs
using System;
using System.Text;
using System.Net.Sockets;
using System.Threading;
namespace Client2
{
class ClientSocket
{
private Socket clientSocket;
public ClientSocket()
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//構(gòu)造函數(shù)
}
public void Connect(string ip, int port)
{
clientSocket.Connect(ip,port);
Console.WriteLine("連接服務(wù)器成功!");
Thread ReceiveThread = new Thread(Receive);
ReceiveThread.IsBackground = true;
ReceiveThread.Start();
}
private void Receive()
{
try
{
byte[] msg = new byte[1024];
int msgLen = clientSocket.Receive(msg);
Console.WriteLine($"{Encoding.UTF8.GetString(msg, 0, msgLen)}");
Receive();
}
catch
{
Console.WriteLine("服務(wù)器斷開");
}
}
public void send(string msg)
{
clientSocket.Send(Encoding.UTF8.GetBytes(msg));
}
}
}
主程序部分
Program.cs
using System;
namespace Client2
{
class Program
{
static void Main(string[] args)
{
ClientSocket client2 = new ClientSocket();
client2.Connect("127.0.0.1", 12305);
Console.WriteLine("請(qǐng)輸入要發(fā)送的內(nèi)容,輸入quit退出");
string msg = Console.ReadLine();
while(msg!="quit")
{
client2.send(msg);
msg = Console.ReadLine();
}
Console.ReadKey();
}
}
}
結(jié)果

Snipaste_2019-11-29_17-25-13.png