sunyke 发表于 2015-5-21 09:52:43

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         ///
23         /// 处理接入的请求
24         ///
25         ///
26         ///
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         ///
35         /// 循环处理数据
36         ///
37         ///
38         ///
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;
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         ///
106         /// 开始连接服务器
107         ///
108         ///
109         ///
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         ///
132         /// 开始发送
133         ///
134         ///
135         ///
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         ///
165         /// 断开连接
166         ///
167         ///
168         ///
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         }
  
页: [1]
查看完整版本: win8 metro socket