直接上代码,看完你就懂了。
public class Socketer
{
/// <summary>
/// Server
/// </summary>
/// <param name="serverport">ServerPort</param>
public Socketer(int serverport)
{
Initilize_Bind(serverport);
Socket_host.Listen(1);
Socket_host.BeginAccept(ar =>
{
//这里要注意我这里上面只监听了一个连接,而下面这句也只是简答地吧原来的Socket给覆盖了,如果你要改成多客户端的话需要增加一个列表,
// 并且对列表中的Socket对象分别进行相应的操作
Socket_host = Socket_host.EndAccept(ar);
Recive();
}, null);
}
//IPAddress _HostIP;
//public IPAddress HostIP { get { return _HostIP; } }
/// <summary>
/// Client
/// </summary>
/// <param name="clientport">ClientPort</param>
/// <param name="serverport">ServerPort</param>
public Socketer(int clientport, int serverport)
{
Initilize_Bind(clientport);
Socket_host.BeginConnect(new IPEndPoint(IPAddress.Loopback, serverport), ar =>
{
Socket_host.EndConnect(ar);
Recive();
}, null);
}
private void Initilize_Bind(int hostport)
{
Socket_host = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//_HostIP = ;
Socket_host.Bind(new IPEndPoint(IPAddress.Any, hostport));
}
public Socket Socket_host;
//public List<Socket> Clients = new List<Socket>();
private byte[] Buffer_Recive = new byte[256];
private virtual void Recive()
{
if (Socket_host.Connected)
{
Array.Clear(Buffer_Recive, 0, Buffer_Recive.Length);
Socket_host.BeginReceive(Buffer_Recive, 0, Buffer_Recive.Length, SocketFlags.None, ar =>
{
int getsize= Socket_host.EndReceive(ar);
if (GetMsg != null)
{
//GetMsg.Invoke(Encoding.UTF8.GetString(Buffer_Recive, 0, getsize));
//GetMsg.Method.Invoke(null, new object[]{ Encoding.UTF8.GetString(Buffer_Recive, 0, getsize)});
GetMsg(Encoding.UTF8.GetString(Buffer_Recive, 0, getsize));
//GetMsg.BeginInvoke(,null,null);
}
Recive();
}, null);
}
}
public event GetResult GetMsg;
public virtual void Send(string msg)
{
if (Socket_host.Connected)
{
byte[] sendbuffer = Encoding.UTF8.GetBytes(msg);
Socket_host.BeginSend(sendbuffer, 0, sendbuffer.Length, SocketFlags.None, ar =>
{
Socket_host.EndSend(ar);
}, null);
}
}
}
public delegate void GetResult(string msg);
//小菜
另说一下,不知道为什么,写文章时,代码块 删除不掉,烦死人了
服务器端和客户端使用同一段代码创建,是不是很简单,很easy?
Socketer Server = new Socketer(9999);
Socketer Client = new Socketer(9998, 9999);
Server.GetMsg += new GetResult(Server_GetMsg);
Client.GetMsg += new GetResult(Client_GetMsg);
然后你就send吧...都不需要Recive了...
哎,编辑的时候还不能局部选中文字,这编辑器太烂了....估计就只有速度还可以这个优势了...