本例用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通信聊天的更多相关文章

  1. windows下用c实现Socket通信

    原文:windows下用c实现Socket通信 原本以为c是跨平台,所以,c在windows下和linux下的程序应该是类似于Java,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊-- 下面我 ...

  2. Android开发--Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  3. Android进阶(十五)socket通信——聊天室

    想做一个聊天室,花费了将近一天的时间,各种错误.讲解知识点之前,絮叨几句:动手能力还是很重要的,有时看似简单的一个问题,当你真正着手去解决的时候就有可能会遇到各种各样的问题,原因之一就是因为你的知识储 ...

  4. ios开发 Socket通信

    Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...

  5. 成功使Linux服务端和Windows客户端建立socket通信

    一.准备工作 1.一台装有虚拟机的Windows7操作系统,虚拟机中装的是CentOS6.5版本的Linux 2.Windows7已经装有java环境 二.编码 使用java编写socket通信的服务 ...

  6. iOS:socket通信

    ios开发 Socket通信 Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通 ...

  7. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  8. Python简易聊天工具-基于异步Socket通信

    继续学习Python中,最近看书<Python基础教程>中的虚拟茶话会项目,觉得很有意思,自己敲了一遍,受益匪浅,同时记录一下. 主要用到异步socket服务客户端和服务器模块asynco ...

  9. 网络编程-SOCKET开发之----3. socket通信工作流程

    1. TCP的socket通信流程 服务端 1)socket----创建socket对象. 2)bind----绑定本机ip+port. 3)listen----监听来电,若在监听到来电,则建立起连接 ...

随机推荐

  1. ML2 配置 OVS VxLAN - 每天5分钟玩转 OpenStack(146)

    今天我们开始学习 OVS 如何实现 Neutron VxLAN,关于 VxLAN 的概念以及 Linux Bridge 实现,大家可以参考前面相关章节. Open vSwitch 支持 VXLAN 和 ...

  2. iOS 获取公历、农历日期的年月日

    iOS 获取公历.农历日期的年月日 介绍三种方法获取 Date (NSDate) 的年月日. 用 date 表示当前日期.测试日期为公历 2017 年 2 月 5 日,农历丁酉年,鸡年,正月初九. l ...

  3. MongoDB复制集之将现有的单节点服务器转换为复制集

    服务器情况:   现有的单节点 Primary     192.168.126.9:27017   新增的节点    Secondry  192.168.126.8:27017    仲裁节点     ...

  4. npm 不是内部命令

    最近办公室流行给电脑装win10系统,于是在重新装好电脑系统后,再次运行thinkjs项目的时候,就发现了之前做过的项目打不开了,待再确认问题出在哪里的时候,才发现”nodejs以及npm不是内部或者 ...

  5. API内部文件读取

    直接上代码吧 尝试将项目复制后建一个新的项目,结果总是有问题,不过可以把原项目转换为新项目,方法如下: 1.项目右键在android tools 有个 rename application packa ...

  6. windows下vue+webpack前端开发环境搭建及nginx部署

    一.开发环境搭建 1.前端框架一般都依赖nodejs,我们首先要安装node.js.请参考http://www.cnblogs.com/wuac/p/6381819.html. 2.由于许多npm的源 ...

  7. [css 揭秘]:CSS揭秘 技巧(三):背景定位

    我的github地址:https://github.com/FannieGirl/ifannie 源码都在这上面哦! 喜欢的给我一个星吧 背景定位 问题:很多时候,我们想针对容器某个角对背景图片做便宜 ...

  8. [Kafka] - Kafka内核理解:Message

    一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成 header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成 ...

  9. Xcode插件包Alcatraz

    安装命令  curl -fsSL https://raw.github.com/alcatraz/Alcatraz/master/Scripts/install.sh | sh 终于可以了  这个其实 ...

  10. js设计模式--迭代器模式

    迭代器模式: 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示.js中我们经常会封装一个each函数用来实现迭代器. 理解的意思:提供一个方法,去把对象的每一项按 ...