Windows Phone 十七、Socket
StreamSocket:Socket对象
StreamSocketListener:Socket监听对象,适用于服务端
服务端代码
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- 标题面板 -->
<StackPanel Grid.Row="0" Margin="19,0,0,0">
<TextBlock Text="Socket Chat" Style="{ThemeResource TitleTextBlockStyle}" Margin="0,12,0,0"/>
<TextBlock Text="Server" Margin="0,-6.5,0,26.5" Style="{ThemeResource HeaderTextBlockStyle}" CharacterSpacing="{ThemeResource PivotHeaderItemCharacterSpacing}"/>
</StackPanel>
<!--TODO: 应将内容放入以下网格-->
<Grid Grid.Row="1" x:Name="ContentRoot" Margin="19,9.5,19,0">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<ListView x:Name="messageList" Grid.Row="0"/>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="txtMessage" Grid.Column="0"/>
<Button
x:Name="btnSend"
Grid.Column="1"
Content="Send"
Click="btnSend_Click"/>
</Grid>
</Grid>
</Grid>
<!--<Page.BottomAppBar>
<CommandBar>
<AppBarButton Icon="Send" Label="Send"/>
</CommandBar>
</Page.BottomAppBar>-->
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
// 建立服务端监听
StreamSocketListener listener = new StreamSocketListener();
listener.ConnectionReceived += listener_ConnectionReceived;
try
{
await listener.BindServiceNameAsync("");
System.Diagnostics.Debug.WriteLine("服务端启动监听。。。");
}
catch (Exception ex)
{
var status = SocketError.GetStatus(ex.HResult);
System.Diagnostics.Debug.WriteLine("服务端监听失败。。。");
// 退出应用程序(NotRunning)
App.Current.Exit();
}
}
private List<StreamSocket> clients = new List<StreamSocket>();
async void listener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
var clientSocket = args.Socket;
clients.Add(clientSocket);
// 有一个Socket客户端连接上了
System.Diagnostics.Debug.WriteLine("有人来了。。。" + clientSocket.Information.RemoteAddress); DataReader reader = new DataReader(clientSocket.InputStream);
while (true)
{
// 不断接收客户端传过来的数据 #region 读取数据中数据头(数据的大小) var length = await reader.LoadAsync(sizeof(uint));
if (length != sizeof(uint))
{
// 客户端发送过来的数据不合法
// 客户端断开连接
System.Diagnostics.Debug.WriteLine(string.Format("客户端{0}断开连接", clientSocket.Information.RemoteAddress));
break;
}
// 客户端发送过来的数据是合法数据
// 读取真实数据长度
var messageLength = reader.ReadUInt32(); #endregion #region 根据数据大小创建缓冲区读取真实数据内容
// 根据真实长度创建内容数据缓冲
var messageLength2 = await reader.LoadAsync(messageLength); if (messageLength2 != messageLength)
{
// 客户端发送过来的数据不合法
// 客户端断开连接
System.Diagnostics.Debug.WriteLine(string.Format("客户端{0}断开连接", clientSocket.Information.RemoteAddress));
break;
} var message = reader.ReadString(messageLength2); #endregion
// 客户端发送过来的数据是合法数据
//var length = reader.ReadUInt32(); // 不再是UI线程执行以下代码
await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
// 该方法会被主线程执行
messageList.Items.Add(string.Format("{1}说:{0}", message, clientSocket.Information.RemoteAddress));
});
//var result = await reader.LoadAsync();
}
} private async void btnSend_Click(object sender, RoutedEventArgs e)
{
foreach (var item in clients)
{
// 发送数据消息
// 先拿到当前建立完连接的Socket
var message = txtMessage.Text; DataWriter writer = new DataWriter(item.OutputStream);
// 先往发送流中写入数据大小
writer.WriteUInt32(writer.MeasureString(message));
// 再将数据写入发送流
writer.WriteString(message);
// 将数据提交到服务端
await writer.StoreAsync();
await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
messageList.Items.Add(string.Format("我说:{0}", message));
});
}
}
客户端代码
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- 标题面板 -->
<StackPanel Grid.Row="0" Margin="19,0,0,0">
<TextBlock Text="Socket Chat" Style="{ThemeResource TitleTextBlockStyle}" Margin="0,12,0,0"/>
<TextBlock Text="Client" Margin="0,-6.5,0,26.5" Style="{ThemeResource HeaderTextBlockStyle}" CharacterSpacing="{ThemeResource PivotHeaderItemCharacterSpacing}"/>
</StackPanel>
<!--TODO: 应将内容放入以下网格-->
<Grid Grid.Row="1" x:Name="ContentRoot" Margin="19,9.5,19,0">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<ListView x:Name="messageList" Grid.Row="0"/>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="txtMessage" Grid.Column="0"/>
<Button
x:Name="btnSend"
Grid.Column="1"
Content="Send"
Click="btnSend_Click"/>
</Grid>
</Grid>
</Grid>
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
string ip = "127.0.0.1";
int port = ;
HostName host = new HostName(ip);
// 建立Socket连接
socket = new StreamSocket();
try
{
await socket.ConnectAsync(host, port.ToString()); DataReader reader = new DataReader(socket.InputStream); while (true)
{
// 不断接收客户端传过来的数据 #region 读取数据中数据头(数据的大小) var length = await reader.LoadAsync(sizeof(uint));
if (length != sizeof(uint))
{
// 客户端发送过来的数据不合法
// 客户端断开连接
System.Diagnostics.Debug.WriteLine(string.Format("客户端{0}断开连接", socket.Information.RemoteAddress));
break;
}
// 客户端发送过来的数据是合法数据
// 读取真实数据长度
var messageLength = reader.ReadUInt32(); #endregion #region 根据数据大小创建缓冲区读取真实数据内容
// 根据真实长度创建内容数据缓冲
var messageLength2 = await reader.LoadAsync(messageLength); if (messageLength2 != messageLength)
{
// 客户端发送过来的数据不合法
// 客户端断开连接
System.Diagnostics.Debug.WriteLine(string.Format("客户端{0}断开连接", socket.Information.RemoteAddress));
break;
} var message = reader.ReadString(messageLength2); #endregion
// 客户端发送过来的数据是合法数据
//var length = reader.ReadUInt32(); // 不再是UI线程执行以下代码
await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
// 该方法会被主线程执行
messageList.Items.Add(string.Format("{1}说:{0}", message, socket.Information.RemoteAddress));
});
//var result = await reader.LoadAsync();
}
}
catch (Exception ex)
{
//
var status = SocketError.GetStatus(ex.HResult);
System.Diagnostics.Debug.WriteLine("建立连接失败" + status);
App.Current.Exit();
}
} private async void btnSend_Click(object sender, RoutedEventArgs e)
{
// 发送数据消息
// 先拿到当前建立完连接的Socket
var message = txtMessage.Text; DataWriter writer = new DataWriter(socket.OutputStream);
// 先往发送流中写入数据大小
writer.WriteUInt32(writer.MeasureString(message));
// 再将数据写入发送流
writer.WriteString(message);
// 将数据提交到服务端
await writer.StoreAsync();
await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
messageList.Items.Add(string.Format("我说:{0}", message));
});
}
Windows Phone 十七、Socket的更多相关文章
- windows下的socket网络编程
windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...
- windows下的socket网络编程(入门级)
windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- Java进阶(四十七)Socket通信
Java进阶(四十七)Socket通信 今天讲解一个 Hello Word 级别的 Java Socket 通信的例子.具体通讯过程如下: 先启动Server端,进入一个死循环以便一直监听某端口是 ...
- 基于C++简单Windows API的socket编程(阻塞模式)
1. 概述:简单的基于Windows API的socket点对点聊天程序,为了方便初学者,本文代码均采用阻塞原理编写. 2. 代码样例 Server.cpp(服务端) #include <cst ...
- Windows下通过socket进行字符串和文件传输
今天在windows平台下,通过socket实现了简单的文件传输.通过实现这一功能,了解基本的windows网络编程和相关函数的使用方法. 在windows平台上进行网络编程,首先都需要调用函数WSA ...
- 一个简单的Windows下的socket程序
服务器端代码server.cpp: #include <stdio.h> #include <WinSock2.h> #pragma comment(lib,"ws2 ...
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- 成功使Linux服务端和Windows客户端建立socket通信
一.准备工作 1.一台装有虚拟机的Windows7操作系统,虚拟机中装的是CentOS6.5版本的Linux 2.Windows7已经装有java环境 二.编码 使用java编写socket通信的服务 ...
随机推荐
- pointers on c (day 1,chapter3)
第3章 数据 c中,仅有4中基本数据类型——整型.浮点型.指针和聚合类型(如数组和结构等). 整型:字符.短整型和长整型,它们都分为有符号(signed)和无符号(unsigned). short i ...
- uri不能处理结尾为点的url的问题
最近需要和某公司进行接口对接,发现用WebClient获取URL结尾带.的资源,会出404错误.但是用IE还有其它浏览器访问此资源,还能找到它.很神奇. 于是,我百度了,找到的一堆都是说此url不规范 ...
- PHP操作字符串 截取指定长度字符 移除字符串两侧 左侧 右侧指定字符 或空白字符 替换字符
trim() trim() 函数移除字符串两侧的空白字符或其他预定义字符. <?php $str = "Hello World!"; echo $str . "&l ...
- django manytomany
转载:http://my.oschina.net/u/572994/blog/105280 例如有如下模型 models.py ? 1 2 3 4 5 6 7 from django.db impor ...
- 详解Js中文件读取机制
前言,文件读取是提高应用体验度的必须接口,应用场景中需求很频繁. Js处理文件读取,由于处于安全方面的考虑,在2000年以前,都是以“<input type="file"&g ...
- asdfsadfs
# -*- coding:utf8 -*- import os import jieba.posseg as pseg # -*- coding:utf8 -*- import os def spl ...
- php操作数据库的简单示例
放假期间自己又写了几个简单的网页,但在服务器中打开时和在网站上打开时不一样,在服务器中打开的出现了错误,字体比一般的腰大好多,页面也相应地变大了,一些块即使用了浮动和clear浮动还是被遮住了,我只好 ...
- Linux下搭建Windows KMS服务器
这几天微软发布了Windows 10 RedStone 1 Build 14390, 于是我第一时间下载进行了试用.和之前那种不激活也没有任何异样不同,现在的版本如果不激活有些功能就受限了,比如你无法 ...
- 《UML大战需求分析》阅读笔记03
活动图是用来表达流程的最常见的一种图.活动图与我们之前熟知的流程图相似.而活动图基础语法包含:初始状态.结束状态.活动.状态和合并一般活动图就有一个开始状态.进行活动图绘制的时候需要从总体上规划好业务 ...
- JVM原理讲解和调优
一.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现 ...