win8 metro socket

  1 private async void btnListen_Click(object sender, RoutedEventArgs e)
  2         {
  3             try
  4             {
  5                 _listener = new StreamSocketListener();
  6 
  7                 //_listener.Control.QualityOfService = SocketQualityOfService.Normal;
  8 
  9                 _listener.ConnectionReceived += _listener_ConnectionReceived;
 10                 await _listener.BindEndpointAsync(_localHostName, _localServerName);
 11                 btnListen.IsEnabled = false;
 12                 btnStopListen.IsEnabled = true;
 13             }
 14             catch (Exception ex)
 15             {
 16                 var status = SocketError.GetStatus(ex.HResult);
 17             }
 18         }
 19 
 20         private DataReader reader;
 21 
 22         /// <summary>
 23         /// 处理接入的请求
 24         /// </summary>
 25         /// <param name="sender"></param>
 26         /// <param name="args"></param>
 27         void _listener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
 28         {
 29             reader = new DataReader(args.Socket.InputStream);
 30             ReceiveStringLoop(reader, args.Socket);
 31             //ReceiveDataLoop(_reader,args.Socket);
 32         }
 33 
 34         /// <summary>
 35         /// 循环处理数据
 36         /// </summary>
 37         /// <param name="reader"></param>
 38         /// <param name="socket"></param>
 39         private void ReceiveStringLoop(DataReader reader, StreamSocket socket)
 40         {
 41             try
 42             {
 43                 reader.LoadAsync(sizeof(uint)).AsTask().ContinueWith((result) =>
 44                   {
 45                       uint size = (uint)result.Result;
 46 
 47                       if (size < sizeof(uint))
 48                       {
 49                           // The underlying socket was closed before we were able to read the whole data.
 50                           return;
 51                       }
 52 
 53                       uint stringLength = reader.ReadUInt32();
 54                       reader.LoadAsync((uint)stringLength).AsTask().ContinueWith((strLength) =>
 55                       {
 56                           string msg = reader.ReadString(reader.UnconsumedBufferLength);
 57                           ShowMessage(msg);
 58                       });
 59                   }).ContinueWith((e) =>
 60                   {
 61                       //这里注意要新new一个DataReader对象
 62                       ReceiveStringLoop(new DataReader(socket.InputStream), socket);
 63                   });
 64             }
 65             catch (Exception ex)
 66             {
 67                 SocketErrorStatus status = SocketError.GetStatus(ex.HResult);
 68             }
 69         }
 70 
 71         private async void ReceiveDataLoop(DataReader reader, StreamSocket streamSocket)
 72         {
 73             try
 74             {
 75                 await _reader.LoadAsync(sizeof(uint));
 76                 uint size = _reader.ReadUInt32();
 77                 await _reader.LoadAsync(size);
 78                 //byte[] data = new byte[size];
 79                 //reader.ReadBytes(data);
 80                 string msg = _reader.ReadString(reader.UnconsumedBufferLength);
 81                 ShowMessage(msg);
 82                 ReceiveDataLoop(_reader, streamSocket);
 83             }
 84             catch (Exception ex)
 85             {
 86             
 87             }
 88         }
 89 
 90         private void btnStopListen_Click(object sender, RoutedEventArgs e)
 91         {
 92             try
 93             {
 94                 _listener.Dispose();
 95                 // reader.Dispose();
 96                 btnListen.IsEnabled = true;
 97                 btnStopListen.IsEnabled = false;
 98             }
 99             catch (Exception ex)
100             {
101                 var status = SocketError.GetStatus(ex.HResult);
102             }
103         }
104 
105         /// <summary>
106         /// 开始连接服务器
107         /// </summary>
108         /// <param name="sender"></param>
109         /// <param name="e"></param>
110         private async void btnConnect_Click(object sender, RoutedEventArgs e)
111         {
112             try
113             {
114                 _client = new StreamSocket();
115 
116                 _client.Control.KeepAlive = true;
117                 _client.Control.NoDelay = true;
118                 _client.Control.QualityOfService = SocketQualityOfService.Normal;
119 
120                 await _client.ConnectAsync(_localHostName, _localServerName);
121 
122                 btnConnect.IsEnabled =false;
123                 btnDisconnect.IsEnabled = true;
124             }
125             catch (Exception ex)
126             {
127                 SocketErrorStatus status = SocketError.GetStatus(ex.HResult);
128             }
129         }
130 
131         /// <summary>
132         /// 开始发送
133         /// </summary>
134         /// <param name="sender"></param>
135         /// <param name="e"></param>
136         private async void btnSend_Click(object sender, RoutedEventArgs e)
137         {
138             try
139             {
140                 string sendMsg = tbInputMsg.Text.Trim();
141                 int strLength = sendMsg.Length;
142 
143                 DataWriter writer = new DataWriter(_client.OutputStream);
144 
145                 //注意一定要先发送要发送数据的长度
146                 writer.WriteInt32(strLength);
147                 writer.WriteString(sendMsg);
148                 await writer.StoreAsync();
149 
150                 await _client.OutputStream.FlushAsync();
151 
152                 tbSendMsg.Text += ("Send-->: " + tbInputMsg.Text + Environment.NewLine);
153                 tbInputMsg.Text = string.Empty;
154                 ////await _client.OutputStream.WriteAsync(GetBufferFromString(strLength.ToString()));
155                 //await _client.OutputStream.WriteAsync(GetBufferFromString(tbInputMsg.Text.Trim()));
156                 //await _client.OutputStream.FlushAsync();
157             }
158             catch (Exception ex)
159             {
160                 SocketErrorStatus status = SocketError.GetStatus(ex.HResult);
161             }
162         }
163 
164         /// <summary>
165         /// 断开连接
166         /// </summary>
167         /// <param name="sender"></param>
168         /// <param name="e"></param>
169         private void btnDisconnect_Click(object sender, RoutedEventArgs e)
170         {
171             try
172             {
173                 _client.Dispose();
174 
175                 btnConnect.IsEnabled = true;
176                 btnDisconnect.IsEnabled = false;
177             }
178             catch (Exception ex)
179             {
180                 SocketErrorStatus status = SocketError.GetStatus(ex.HResult);
181             }
182         }

 

posted @ 2012-05-14 11:21  无尽空虚  阅读(869)  评论(0)    收藏  举报