windows phone 8.1开发:socket通信聊天
本例用WPF程序做服务器端,windows phone程序做客户端。我们使用基于UDP协议的Socket通信。更多关于socket信息请查看:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket(v=vs.110).aspx
我们使用DatagramSocket类完成UDP通信功能。
具体代码如下:(前台代码就不帖出来了,下面只给出后台代码和一些注释。完整源代码会在论坛发出来,地址在文章最后。)
socket通信聊天windows phone 客户端
public sealed partial class MainPage : Page
{
// DatagramSocket 支持使用 UDP 数据报套接的网络通信
DatagramSocket udpSocket = null;
//定义本地端口号
const string LOCAL_PORT = “″;
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
} bool isUdpSocketInitializzed = false; //表示是否初始化过
//若要接收 DatagramSocket 对象上的数据,应用程序必须将 MessageReceived 事件分配给事件
//处理程序,然后调用 BindEndpointAsync 或 BindServiceNameAsync 方法将 DatagramSocket
//绑定到本地服务名或 UDP 端口上。ConnectAsync 方法还会导致绑定操作。
//写入由一个 GetOutputStreamAsync 方法返回的流也将会导致绑定操作。
//然后 DatagramSocket 可以接收数据报。
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
if (!isUdpSocketInitializzed)
{
udpSocket = new DatagramSocket();
//定义在DatagramSocket对象上接受消息的事件
udpSocket.MessageReceived += udpSocket_MessageReceived;
//启动DatagramSocket本地服务名的绑定操作
await udpSocket.BindServiceNameAsync(LOCAL_PORT);
// 标志初始已完成
isUdpSocketInitializzed = true;
}
} async void udpSocket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
//获取DatagramSocket,以获取从DatagramSocket对象上的的远程网络目标接受到的传入数据
var reader = args.GetDataReader();
// 数据长度
uint len = reader.UnconsumedBufferLength;
// 读取内容
string message = reader.ReadString(len);
// 获取主机的IP地址和端口号
string host = string.Format(“{}:{}”, args.RemoteAddress.DisplayName, args.RemotePort);
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
lbMessages.Items.Add(“来自” + host + “的消息:\n” + message);
});
} private async void btnSend_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(txtToSend.Text) || string.IsNullOrWhiteSpace(txtRemoteIP.Text) || string.IsNullOrWhiteSpace(txtRemotePort.Text))
{
return;
}
// 获取输出流的引用
HostName remoteHost = new HostName(txtRemoteIP.Text);
IOutputStream outStream = await udpSocket.GetOutputStreamAsync(remoteHost, txtRemotePort.Text);
// 发送消息
DataWriter writer = new DataWriter(outStream);
//设置字符编码
writer.UnicodeEncoding = UnicodeEncoding.Utf8;
//将字符串值写入输出流
writer.WriteString(txtToSend.Text);
// 提交数据
await writer.StoreAsync();
//释放
writer.DetachStream();
writer.Dispose();
tbMessage.Text = “已发送。”;
txtToSend.Text = “”;
}
socket通信聊天WPF服务器端:
public partial class MainWindow : Window
{
UdpClient udpClnt = null;
const int LOCAL_PORT = ;//本地端口
CancellationTokenSource cancelSrc = null;
public MainWindow()
{
InitializeComponent();
this.Closing += (a, b) =>
{
if (udpClnt != null)
{
try
{
udpClnt.Close();
}
catch (SocketException sex)
{
System.Diagnostics.Debug.WriteLine(sex.Message);
}
}
};
}
private async void DoReceiveMsg()
{
while (!cancelSrc.IsCancellationRequested)
{
try
{
var result = await udpClnt.ReceiveAsync();
// 远程主面信息
string host = string.Format(“{}:{}”, result.RemoteEndPoint.Address.ToString(), result.RemoteEndPoint.Port);
// 读取消息
string msg = Encoding.UTF8.GetString(result.Buffer);
// 显示接到的信息
await Dispatcher.BeginInvoke(new Action(
() =>
{
this.lbMessages.Items.Add(“来自” + host + “的消息:\n” + msg);
}
));
}
catch
{
continue;
}
}
} private void btnEnableRecv_Click(object sender, RoutedEventArgs e)
{
CheckUdpClient(); // 开始异步接收消息
cancelSrc = new CancellationTokenSource();
Task runTask = new Task(new Action(DoReceiveMsg), cancelSrc.Token);
try
{
runTask.Start();//启动后台任务
tbMessage.Text = “后台接收已开启。”;
btnEnableRecv.IsEnabled = false;
btnDisableRecv.IsEnabled = true;
}
catch (TaskCanceledException)
{
tbMessage.Text = “后台接收任务已取消。”;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
} /// <summary>
/// 检测UdpClient对象是否已创建
/// </summary>
private void CheckUdpClient()
{
if (udpClnt == null) udpClnt = new UdpClient(LOCAL_PORT);
} private void btnDisableRecv_Click(object sender, RoutedEventArgs e)
{
// 取消后台任务
if (cancelSrc != null)
{
cancelSrc.Cancel();
btnEnableRecv.IsEnabled = true;
btnDisableRecv.IsEnabled = false;
tbMessage.Text = “已取消后台接收消息。”;
}
} private async void btnSend_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(txtToSend.Text))
{
return;
}
CheckUdpClient();
// 验证是否设置远程地址和端口
IPAddress ip;
int remotePort;
if (!IPAddress.TryParse(txtRemoteIP.Text,out ip))
{
MessageBox.Show(“请输入远程IP地址。”); return;
}
if (!int.TryParse(txtRemotePort.Text, out remotePort))
{
MessageBox.Show(“请输入远程端口号。”); return;
}
// 验证输入的端口号是否合法
if (remotePort < IPEndPoint.MinPort || remotePort > IPEndPoint.MaxPort)
{
MessageBox.Show(string.Format(“端口号的有效范围在{}到{}。”, IPEndPoint.MinPort, IPEndPoint.MaxPort));
return;
}
// 开始发送消息
byte[] buffer = Encoding.UTF8.GetBytes(txtToSend.Text);
// 创建远程终结点
IPEndPoint remote = new IPEndPoint(ip, remotePort);
object contentTemp = btnSend.Content;
try
{
btnSend.Content = “正在发送”;
btnSend.IsEnabled = false;
await udpClnt.SendAsync(buffer, buffer.Length, remote);
txtToSend.Clear();
tbMessage.Text = “已发送。”;
}
catch (Exception ex)
{
tbMessage.Text = “消息发送失败。”;
System.Diagnostics.Debug.WriteLine(ex.Message);
}
finally
{
// 发送完毕
btnSend.Content = contentTemp;
btnSend.IsEnabled = true;
}
}
小梦 windows phone 8.1开发:socket通信聊天源代码下载:点我下载哦
windows phone 8.1开发:socket通信聊天的更多相关文章
- windows下用c实现Socket通信
原文:windows下用c实现Socket通信 原本以为c是跨平台,所以,c在windows下和linux下的程序应该是类似于Java,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊-- 下面我 ...
- Android开发--Socket通信
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
- Android进阶(十五)socket通信——聊天室
想做一个聊天室,花费了将近一天的时间,各种错误.讲解知识点之前,絮叨几句:动手能力还是很重要的,有时看似简单的一个问题,当你真正着手去解决的时候就有可能会遇到各种各样的问题,原因之一就是因为你的知识储 ...
- ios开发 Socket通信
Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...
- 成功使Linux服务端和Windows客户端建立socket通信
一.准备工作 1.一台装有虚拟机的Windows7操作系统,虚拟机中装的是CentOS6.5版本的Linux 2.Windows7已经装有java环境 二.编码 使用java编写socket通信的服务 ...
- iOS:socket通信
ios开发 Socket通信 Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通 ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- Python简易聊天工具-基于异步Socket通信
继续学习Python中,最近看书<Python基础教程>中的虚拟茶话会项目,觉得很有意思,自己敲了一遍,受益匪浅,同时记录一下. 主要用到异步socket服务客户端和服务器模块asynco ...
- 网络编程-SOCKET开发之----3. socket通信工作流程
1. TCP的socket通信流程 服务端 1)socket----创建socket对象. 2)bind----绑定本机ip+port. 3)listen----监听来电,若在监听到来电,则建立起连接 ...
随机推荐
- PL/SQL基本概念
首先明确PL/SQL主要作用作用: SQL语言适合管理关系型数据库但是它无法满足更复杂的数据处理,所以产生PLSQL.PLSQL用户创建存储过程.函数.触发器.包及用户自定义的函数. 特点: PLSQ ...
- 分析下为什么spring 整合mybatis后为啥用不上session缓存
因为一直用spring整合了mybatis,所以很少用到mybatis的session缓存. 习惯是本地缓存自己用map写或者引入第三方的本地缓存框架ehcache,Guava 所以提出来纠结下 实验 ...
- Ext Js详解指南
什么是Ext JS 走进Ext的世界 Ext JS是一款富客户端开发框架它基于javascript.HTML和CSS开发而成,无需安装任何插件即可在常用浏览器中创建出绚丽的页面效果. 个人总结Ext ...
- Top命名的一些简单用法
1. Top命令的显示 top 2. 按(Shift + O)是为了选择列进行排序.例如:按a是为了通过PID进行排序.然后按任意键返回主窗口. 3. 显示特定用户的进程. top -u hadoop ...
- 锋利的jQuery中的事件与动画
奋夜的奋斗 ---- 事件与动画 ---- 来自地狱的战镰 小小的单词难不倒我们哦!!!!!!! bind:绑定 unbind:接触绑定 toggle:栓牢 fadeou ...
- 读书笔记 effective c++ Item 22 将数据成员声明成private
我们首先看一下为什么数据成员不应该是public的,然后我们将会看到应用在public数据成员上的论证同样适用于protected成员.最后够得出结论:数据成员应该是private的. 1. 为什么数 ...
- 从CMOS到触发器(二)
PS:可以转载,转载请标明出处:http://www.cnblogs.com/IClearner/ 前面说了CMOS器件,现在就接着来聊聊锁存器跟触发器吧,下面是这次博文要介绍的主要内容: ·双稳态器 ...
- HTML文档及标签介绍
HTML标签 HTML 标记标签通常被称为 HTML 标签 (HTML tag). HTML标签是由尖括号包含的关键词,比如<html> HTML标签通常是成对出现的,比如<body ...
- Servlet探秘
学习servlet,最重要的就是理解servlet下面四个点: 1.了解Servlet API的常用接口和类 2.掌握Servlet的生命周期 3.掌握Servlet的部署和配置 4.会 ...
- UI设计需具备的几大素质
近年来,IT产业对于高端技术人才需求加大,特别是北上广和知名企业对人才需求更为迫切,UI设计人员的正在接受UI培训的学员都赢认识到UI设计在未来要求将越来越高,交互设计越来越新颖也将对用户更加友好,兄 ...