你是不是对异步Socket 很迷惑? 看完本文的一小类 你就知道大体该做什么,怎么做了....

1 篇文章 0 订阅
1 篇文章 0 订阅

直接上代码,看完你就懂了。

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了...

哎,编辑的时候还不能局部选中文字,这编辑器太烂了....估计就只有速度还可以这个优势了...


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值