Windows Phone 十七、Socket

Socket 常用类型

StreamSocket:Socket对象

StreamSocketListener:Socket监听对象,适用于服务端

服务端代码

 1     <Grid x:Name="LayoutRoot">
 2
 3         <Grid.RowDefinitions>
 4             <RowDefinition Height="Auto"/>
 5             <RowDefinition Height="*"/>
 6         </Grid.RowDefinitions>
 7
 8         <!-- 标题面板 -->
 9         <StackPanel Grid.Row="0" Margin="19,0,0,0">
10             <TextBlock Text="Socket Chat" Style="{ThemeResource TitleTextBlockStyle}" Margin="0,12,0,0"/>
11             <TextBlock Text="Server" Margin="0,-6.5,0,26.5" Style="{ThemeResource HeaderTextBlockStyle}" CharacterSpacing="{ThemeResource PivotHeaderItemCharacterSpacing}"/>
12         </StackPanel>
13
14         <!--TODO: 应将内容放入以下网格-->
15         <Grid Grid.Row="1" x:Name="ContentRoot" Margin="19,9.5,19,0">
16
17             <Grid.RowDefinitions>
18                 <RowDefinition/>
19                 <RowDefinition Height="auto"/>
20             </Grid.RowDefinitions>
21
22             <ListView x:Name="messageList" Grid.Row="0"/>
23
24             <Grid Grid.Row="1">
25                 <Grid.ColumnDefinitions>
26                     <ColumnDefinition/>
27                     <ColumnDefinition Width="auto"/>
28                 </Grid.ColumnDefinitions>
29
30                 <TextBox x:Name="txtMessage" Grid.Column="0"/>
31                 <Button
32                     x:Name="btnSend"
33                     Grid.Column="1"
34                     Content="Send"
35                     Click="btnSend_Click"/>
36
37             </Grid>
38         </Grid>
39
40     </Grid>
41
42     <!--<Page.BottomAppBar>
43         <CommandBar>
44             <AppBarButton Icon="Send" Label="Send"/>
45         </CommandBar>
46     </Page.BottomAppBar>-->
 1         protected async override void OnNavigatedTo(NavigationEventArgs e)
 2         {
 3             // 建立服务端监听
 4             StreamSocketListener listener = new StreamSocketListener();
 5             listener.ConnectionReceived += listener_ConnectionReceived;
 6             try
 7             {
 8                 await listener.BindServiceNameAsync("10086");
 9                 System.Diagnostics.Debug.WriteLine("服务端启动监听。。。");
10             }
11             catch (Exception ex)
12             {
13                 var status = SocketError.GetStatus(ex.HResult);
14                 System.Diagnostics.Debug.WriteLine("服务端监听失败。。。");
15                 // 退出应用程序(NotRunning)
16                 App.Current.Exit();
17             }
18         }
19         private List<StreamSocket> clients = new List<StreamSocket>();
20         async void listener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
21         {
22             var clientSocket = args.Socket;
23             clients.Add(clientSocket);
24             // 有一个Socket客户端连接上了
25             System.Diagnostics.Debug.WriteLine("有人来了。。。" + clientSocket.Information.RemoteAddress);
26
27             DataReader reader = new DataReader(clientSocket.InputStream);
28             while (true)
29             {
30                 // 不断接收客户端传过来的数据
31
32                 #region 读取数据中数据头(数据的大小)
33
34                 var length = await reader.LoadAsync(sizeof(uint));
35                 if (length != sizeof(uint))
36                 {
37                     // 客户端发送过来的数据不合法
38                     // 客户端断开连接
39                     System.Diagnostics.Debug.WriteLine(string.Format("客户端{0}断开连接", clientSocket.Information.RemoteAddress));
40                     break;
41                 }
42                 // 客户端发送过来的数据是合法数据
43                 // 读取真实数据长度
44                 var messageLength = reader.ReadUInt32();
45
46                 #endregion
47
48                 #region 根据数据大小创建缓冲区读取真实数据内容
49                 // 根据真实长度创建内容数据缓冲
50                 var messageLength2 = await reader.LoadAsync(messageLength);
51
52                 if (messageLength2 != messageLength)
53                 {
54                     // 客户端发送过来的数据不合法
55                     // 客户端断开连接
56                     System.Diagnostics.Debug.WriteLine(string.Format("客户端{0}断开连接", clientSocket.Information.RemoteAddress));
57                     break;
58                 }
59
60                 var message = reader.ReadString(messageLength2);
61
62                 #endregion
63                 // 客户端发送过来的数据是合法数据
64                 //var length = reader.ReadUInt32();
65
66                 // 不再是UI线程执行以下代码
67                 await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
68                  {
69                      // 该方法会被主线程执行
70                      messageList.Items.Add(string.Format("{1}说:{0}", message, clientSocket.Information.RemoteAddress));
71                  });
72                 //var result = await reader.LoadAsync();
73             }
74         }
75
76         private async void btnSend_Click(object sender, RoutedEventArgs e)
77         {
78             foreach (var item in clients)
79             {
80                 // 发送数据消息
81                 // 先拿到当前建立完连接的Socket
82                 var message = txtMessage.Text;
83
84                 DataWriter writer = new DataWriter(item.OutputStream);
85                 // 先往发送流中写入数据大小
86                 writer.WriteUInt32(writer.MeasureString(message));
87                 // 再将数据写入发送流
88                 writer.WriteString(message);
89                 // 将数据提交到服务端
90                 await writer.StoreAsync();
91                 await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
92                     {
93                         messageList.Items.Add(string.Format("我说:{0}", message));
94                     });
95             }
96         }

客户端代码

 1     <Grid x:Name="LayoutRoot">
 2
 3         <Grid.RowDefinitions>
 4             <RowDefinition Height="Auto"/>
 5             <RowDefinition Height="*"/>
 6         </Grid.RowDefinitions>
 7
 8         <!-- 标题面板 -->
 9         <StackPanel Grid.Row="0" Margin="19,0,0,0">
10             <TextBlock Text="Socket Chat" Style="{ThemeResource TitleTextBlockStyle}" Margin="0,12,0,0"/>
11             <TextBlock Text="Client" Margin="0,-6.5,0,26.5" Style="{ThemeResource HeaderTextBlockStyle}" CharacterSpacing="{ThemeResource PivotHeaderItemCharacterSpacing}"/>
12         </StackPanel>
13
14         <!--TODO: 应将内容放入以下网格-->
15         <Grid Grid.Row="1" x:Name="ContentRoot" Margin="19,9.5,19,0">
16
17             <Grid.RowDefinitions>
18                 <RowDefinition/>
19                 <RowDefinition Height="auto"/>
20             </Grid.RowDefinitions>
21
22             <ListView x:Name="messageList" Grid.Row="0"/>
23
24             <Grid Grid.Row="1">
25                 <Grid.ColumnDefinitions>
26                     <ColumnDefinition/>
27                     <ColumnDefinition Width="auto"/>
28                 </Grid.ColumnDefinitions>
29
30                 <TextBox x:Name="txtMessage" Grid.Column="0"/>
31                 <Button
32                     x:Name="btnSend"
33                     Grid.Column="1"
34                     Content="Send"
35                     Click="btnSend_Click"/>
36
37             </Grid>
38         </Grid>
39
40     </Grid>
 1         protected async override void OnNavigatedTo(NavigationEventArgs e)
 2         {
 3             string ip = "127.0.0.1";
 4             int port = 10086;
 5             HostName host = new HostName(ip);
 6             // 建立Socket连接
 7             socket = new StreamSocket();
 8             try
 9             {
10                 await socket.ConnectAsync(host, port.ToString());
11
12                 DataReader reader = new DataReader(socket.InputStream);
13
14                 while (true)
15                 {
16                     // 不断接收客户端传过来的数据
17
18                     #region 读取数据中数据头(数据的大小)
19
20                     var length = await reader.LoadAsync(sizeof(uint));
21                     if (length != sizeof(uint))
22                     {
23                         // 客户端发送过来的数据不合法
24                         // 客户端断开连接
25                         System.Diagnostics.Debug.WriteLine(string.Format("客户端{0}断开连接", socket.Information.RemoteAddress));
26                         break;
27                     }
28                     // 客户端发送过来的数据是合法数据
29                     // 读取真实数据长度
30                     var messageLength = reader.ReadUInt32();
31
32                     #endregion
33
34                     #region 根据数据大小创建缓冲区读取真实数据内容
35                     // 根据真实长度创建内容数据缓冲
36                     var messageLength2 = await reader.LoadAsync(messageLength);
37
38                     if (messageLength2 != messageLength)
39                     {
40                         // 客户端发送过来的数据不合法
41                         // 客户端断开连接
42                         System.Diagnostics.Debug.WriteLine(string.Format("客户端{0}断开连接", socket.Information.RemoteAddress));
43                         break;
44                     }
45
46                     var message = reader.ReadString(messageLength2);
47
48                     #endregion
49                     // 客户端发送过来的数据是合法数据
50                     //var length = reader.ReadUInt32();
51
52                     // 不再是UI线程执行以下代码
53                     await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
54                     {
55                         // 该方法会被主线程执行
56                         messageList.Items.Add(string.Format("{1}说:{0}", message, socket.Information.RemoteAddress));
57                     });
58                     //var result = await reader.LoadAsync();
59                 }
60             }
61             catch (Exception ex)
62             {
63                 // 1102202
64                 var status = SocketError.GetStatus(ex.HResult);
65                 System.Diagnostics.Debug.WriteLine("建立连接失败" + status);
66                 App.Current.Exit();
67             }
68         }
69
70         private async void btnSend_Click(object sender, RoutedEventArgs e)
71         {
72             // 发送数据消息
73             // 先拿到当前建立完连接的Socket
74             var message = txtMessage.Text;
75
76             DataWriter writer = new DataWriter(socket.OutputStream);
77             // 先往发送流中写入数据大小
78             writer.WriteUInt32(writer.MeasureString(message));
79             // 再将数据写入发送流
80             writer.WriteString(message);
81             // 将数据提交到服务端
82             await writer.StoreAsync();
83             await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
84                 {
85                     messageList.Items.Add(string.Format("我说:{0}", message));
86                 });
87         }
时间: 2025-01-04 11:07:18

Windows Phone 十七、Socket的相关文章

windows下的socket网络编程(入门级)

windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先写了个简单的winSocket网路通信的例子,以便以后用到的时候有个参考. windows下使用winsock编程与linux/unix的区别在于windows下需要先有一个初始化的操作,结束的时候需要一个清理的操作.还有windows下编译的时候需要连接ws32_lib库. 大致过程如下 1.初始

winsock教程- windows下的socket编程(c语言实现)

winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下代码片段只能运行在windows下.windows API中的socket编程部分叫做winsock. 你电脑上做出的任何网络通信背后基本上都有socket,它是一个网络的基本组成部分.举个例子说当你在浏览器键入www.google.com的时候,socket连接到google.com并且取回那个页面然后才

windows 与 Linux SOCKET通讯

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 windows client 端口 // Def_win_client_socket_test.cpp :

windows下的socket网络编程

windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先写了个简单的winSocket网路通信的例子,以便以后用到的时候有个参考. windows下使用winsock编程与linux/unix的区别在于windows下需要先有一个初始化的操作,结束的时候需要一个清理的操作.还有windows下编译的时候需要连接ws

一个复杂的Windows下的socket程序

上节演示了 Linux 下的 socket 程序,这节来看一下 Windows 下的 socket 程序.异样,server.cpp 为效劳器端代码,client 为客户端代码.效劳器端代码 server.cpp: #include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll int main(){ //初始化 DLL WSADATA ws

一个简单的Windows下的socket程序

服务器端代码server.cpp: 1 #include <stdio.h> 2 #include <WinSock2.h> 3 #pragma comment(lib,"ws2_32.lib") //加载ws2_32.dll 4 5 int main() 6 { 7 //初始化DLL 8 /************************************************************************/ 9 /*调用WSASta

Linux下TCP网络编程与基于Windows下C#socket编程间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clos

Linux下TCP网络编程与基于Windows下C#socket编程之间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入 数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clo

Windows下基于socket多线程并发通信的实现

本文介绍了在Windows 操作系统下基于TCP/IP 协议Socket 套接口的通信机制以及多线程编程知识与技巧,并给出多线程方式实现多用户与服务端(C/S)并发通信模型的详细算法,最后展现了用C++编写的多用户与服务器通信的应用实例并附有程序. 关键词:Windows:套接字:多线程:并发服务器: Socket 是建立在传输层协议(主要是TCP 和UDP)上的一种套接字规范,最初由美国加州Berkley 大学提出,为UNIX 系统开发的网络通信接口,它定义了两台计算机之间通信的规范,sock