服务端代码:
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
public class SocketHelper
{
//客户端连接
public Action<string> AcceptAction;
//断开连接
public Action<string> DisconnectAction;
//接收数据
public Action<byte[]> ReveiveDataAction;
public struct ClientList
{
public string IP;
public int Port;
}
private string server;
private int port;
private byte[] recvDataBuffer = new byte[1024];
public List<ClientList> clientList = new List<ClientList>();
public SocketHelper(string server, int port)
{
this.server = server;
this.port = port;
}
/// <summary>
/// 开启监听
/// </summary>
public void StartListen()
{
Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(server), port);
socketServer.Bind(ipep);
socketServer.Listen(0);
socketServer.BeginAccept(AcceptCallBack, socketServer);
}
public void AcceptCallBack(IAsyncResult iar)
{
Socket socket = iar.AsyncState as Socket;
Socket client = socket.EndAccept(iar);
string ip = ((IPEndPoint)client.RemoteEndPoint).Address.ToString();
int port = ((IPEndPoint)client.RemoteEndPoint).Port;
//添加客户端
ClientList cl = new ClientList();
cl.IP = ip;
cl.Port = port;
clientList.Add(cl);
if (AcceptAction != null)
AcceptAction("客户端:" + ip + " 端口:" + port + "连接成功");
//接收数据
client.BeginReceive(recvDataBuffer, 0, recvDataBuffer.Length, SocketFlags.None, ReceiveCallBack,
client);
//等待下一次连接
socket.BeginAccept(AcceptCallBack, socket);
}
public void ReceiveCallBack(IAsyncResult iar)
{
Socket socket = iar.AsyncState as Socket;
int recvSize = socket.EndReceive(iar);
if (recvSize > 0)
{
byte[] b = new byte[recvSize];
Array.Copy(recvDataBuffer, 0, b, 0, recvSize);
if (ReveiveDataAction != null) ReveiveDataAction(b);//处理收到的数据
//接收数据
socket.BeginReceive(recvDataBuffer, 0, recvDataBuffer.Length, SocketFlags.None, ReceiveCallBack,
socket);
}
else
{
string ip = ((IPEndPoint)socket.RemoteEndPoint).Address.ToString();
int port = ((IPEndPoint)socket.RemoteEndPoint).Port;
//断开后移除
clientList.RemoveAll(temp => temp.IP.Contains(ip) && temp.Port == port);
if (DisconnectAction != null)
DisconnectAction("客户端:" + ip + " 端口:" + port + "断开连接");
}
}
}
调用:
private SocketHelper sh;
private void button1_Click(object sender, EventArgs e)
{
button1.Text = "已打开";
sh = new SocketHelper("10.0.0.5", 5599);
sh.AcceptAction = Sh_AcceptAction; //注册连接
sh.ReveiveDataAction = Sh_ReveiveDataAction; //注册接收
sh.DisconnectAction = Sh_DisconnectAction;
sh.StartListen(); //开启服务
}
private void Sh_DisconnectAction(string s)
{
this.Invoke((EventHandler) delegate { textBox1.AppendText(s + Environment.NewLine); });
ClientNum();
}
private void Sh_AcceptAction(string s)
{
this.Invoke((EventHandler) delegate { textBox1.AppendText(s + Environment.NewLine); });
ClientNum();
}
private void Sh_ReveiveDataAction(byte[] b)
{
string data = Encoding.Default.GetString(b);
this.Invoke((EventHandler) delegate { textBox1.AppendText(data + Environment.NewLine); });
}
private void ClientNum()
{
this.Invoke((EventHandler)delegate
{
textBox2.Text = string.Empty;
textBox2.AppendText("当前连接的有:" + Environment.NewLine);
});
foreach (var temp in sh.clientList)
{
this.Invoke((EventHandler)delegate
{
textBox2.AppendText(temp.IP + " " + temp.Port + Environment.NewLine);
});
}
}