服务器:
class Server
{
List<Socket> userList = new List<Socket>();
Socket socket;
public Server(string ip, int port)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//为服务器创建Socket,
IPAddress ipAdd;
if (!IPAddress.TryParse(ip, out ipAdd))//将ip转换成IP地址格式放到ipAdd里
{
Console.WriteLine("地址有误,创建服务器失败");
}
IPEndPoint ipAndPo = new IPEndPoint(ipAdd, port);//获得IP和端口号
socket.Bind(ipAndPo);//绑定IP和端口号并关联
Console.WriteLine("服务器创建成功");
socket.Listen(0);//建立监听,0表示可连接的客户端数,0的时候表示无限
Console.WriteLine("等待用户连接。。。。。");
}
public void Start()
{
Thread t1 = new Thread(AcceptUsers);
t1.Start();
this.SendMessage();
}
/// <summary>
/// 客户端连接方法
/// </summary>
public void AcceptUsers()
{
while (true)
{
Socket user = socket.Accept();//为新的连接创建Socket
userList.Add(user);//将新的连接放入List
Thread t2 = new Thread(ReceiveMessage);//为新的连接开启新的线程
Console.WriteLine("客户端{0}连接", t2.ManagedThreadId);
t2.Start(user);
}
}
/// <summary>
/// 发送消息
/// </summary>
public void SendMessage()
{
while (true)
{
if (userList.Count > 0)
{
string str = Console.ReadLine();
byte[] brr = Encoding.Default.GetBytes(str);
for (int i = 0; i < userList.Count; i++)
{
try
{
userList[i].Send(brr);
}
catch (Exception)
{
userList.RemoveAt(i);
i--;
}
}
}
}
}
/// <summary>
/// 接收消息并群发
/// </summary>
/// <param name="user"></param>
public void ReceiveMessage(object user)
{
while (true)
{
byte[] brr = new byte[1024 * 100];
int num;
string str;
try
{
num = ((Socket)user).Receive(brr);
str = Encoding.Default.GetString(brr, 0, num);
Console.WriteLine("客户端{0}:{1}", Thread.CurrentThread.ManagedThreadId, str);
}
catch (Exception)
{
Console.WriteLine("客户端{0}下线", Thread.CurrentThread.ManagedThreadId);
Thread.CurrentThread.Abort();
return;
}
str = "客户端" + Thread.CurrentThread.ManagedThreadId.ToString()+":" + str;
brr = Encoding.Default.GetBytes(str);
for (int i = 0; i < userList.Count; i++)
{
try
{
userList[i].Send(brr);
}
catch (Exception)
{
userList.RemoveAt(i);
i--;
}
}
}
}
}
客户端:
class Client
{
Socket socket;
bool isConnect = false;
public Client(string ip,int port)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立socket
IPAddress ipAdd = IPAddress.Parse(ip);
IPEndPoint ipAndPo = new IPEndPoint(ipAdd, port);
try
{
socket.Connect(ipAndPo);
Console.WriteLine("连接服务器");
}
catch (Exception)
{
Console.WriteLine("服务器连接失败");
}
}
public void Start()
{
Thread t = new Thread(SendMessage);
t.Start();
ReceiveMessage();
}
public void SendMessage()
{
while (isConnect)
{
string str = Console.ReadLine();
try
{
byte[] brr = Encoding.Default.GetBytes(str);
socket.Send(brr);
}
catch (Exception)
{
Console.WriteLine("与服务器断开");
Thread.CurrentThread.Abort();
return;
}
}
}
public void ReceiveMessage()
{
while (isConnect)
{
byte[] brr = new byte[1024 * 100];
try
{
int num = socket.Receive(brr);
string str = Encoding.Default.GetString(brr, 0, num);
Console.WriteLine("---" + str);
}
catch (Exception)
{
Console.WriteLine("与服务器断开");
//Thread.CurrentThread.Abort();
return;
}
}
}
}