使用socket在native 和metroAP之间进行通信

 最近才开始看C# 中socket的部分,花了点时间学习,总算对socket 基于tcp协议的链接方式有了点点了解,记录下来:

native和metro AP 建立链接的话,使用native当服务器,metro做client

native端使用C# 创建server。

//使用异步的方式建立监听:

       // Socket client;
        Socket server;    
        SocketAsyncEventArgs sockAsyncEvent = new SocketAsyncEventArgs();
        private void startServer()
        {
           
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Bind(new IPEndPoint(IPAddress.Any, int.Parse("22552")));
            server.Listen(1);
            sockAsyncEvent.Completed += new EventHandler<SocketAsyncEventArgs>(ProcessAccept);  
            server.AcceptAsync(sockAsyncEvent);
           
        }

//当链接建立之后会调用以下函数:

       // AsyncCallback       
        void ProcessAccept(object sender, SocketAsyncEventArgs e)
        {         
            Socket client = e.AcceptSocket;
            e.AcceptSocket = null;

            int bufferSize = 4;         
            var args = new SocketAsyncEventArgs();
            args.Completed += new EventHandler<SocketAsyncEventArgs>(OnIOCompleted);//使用异步的方法进行接受数据

            args.SetBuffer(new byte[bufferSize], 0, bufferSize);
            args.AcceptSocket = client;
            if (!client.ReceiveAsync(args)) 
                this.ProcessReceive(args);            
            server.AcceptAsync(sockAsyncEvent);              

        }
       
        void OnIOCompleted(object sender, SocketAsyncEventArgs e) //当接受到数据之后会调用以下函数
        {
            switch (e.LastOperation)
            {
                case SocketAsyncOperation.Receive:
                    this.ProcessReceive(e);
                    break;
                case SocketAsyncOperation.Send:
                    this.ProcessSend(e);
                    break;
                default:
                    throw new ArgumentException("The last operation completed on the socket was not a receive or send");
            }
          
        }

         void ProcessReceive(SocketAsyncEventArgs e)
         {
             Socket client = e.AcceptSocket;
             if (e.BytesTransferred > 0)
             {
                 if (e.SocketError == SocketError.Success)
                 {
                     byte flag = e.Buffer[0];

                     if (flag == 0xff)
                     {
                         Byte[] sendBuffer = Encoding.ASCII.GetBytes("I have receiver the request " + flag);
                         Byte[] sendlen = BitConverter.GetBytes(sendBuffer.Length);
                         e.AcceptSocket.Send(sendlen);
                         e.AcceptSocket.Send(sendBuffer);
                     }
                     if (flag == 0xfe)
                     {                   
                         // Code                        
                         Byte[] getStringLen = new Byte[4];
                         int received = e.AcceptSocket.Receive(getStringLen);// get length of the string

                         int len = BitConverter.ToInt32(getStringLen, 0);                      
                         Byte[] getStringData = new Byte[len];
                         received = e.AcceptSocket.Receive(getStringData);    //get the real data of the string           
                         //                
             
                       
                     }

                     e.AcceptSocket.ReceiveAsync(e);
                 }
               
             }
             else
             {
                 //receive 0 byte;  maybe socket is closed
                 int x = 0;
                 e.AcceptSocket.Shutdown(SocketShutdown.Both);
                 e.AcceptSocket.Close();

             }           
         }

metro 主要是使用streamsocket 以下建立链接并接收数据

        private async void GetLargeData()
        {      
               HostName host = new HostName("127.0.0.1");
               streamsocket = new StreamSocket();
               try
               {
                   await streamsocket.ConnectAsync(host, "22552", SocketProtectionLevel.PlainSocket);
                   Byte[] flag = new Byte[4];
                   flag[0] = 0xff;
               
                   sendData(flag);

                   DataReader serverReader = new Windows.Storage.Streams.DataReader(streamsocket.InputStream);
                   await serverReader.LoadAsync(4);

                   serverReader.ReadBytes(flag);
                   int len = BitConverter.ToInt32(flag,0);

                   byte[] content = new byte[len];         
                  await serverReader.LoadAsync((uint)len);
                  serverReader.ReadBytes(content);
                  Byte value = content[len - 1];
                  string sss = System.Text.Encoding.UTF8.GetString(content, 0, len);
             }
             catch (Exception e)
             {
                 int x = 0;
             }
               // getDataValue(len);
        }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值