本例用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. MySQL插入数据中文乱码问题的解决

    一.使用语句 show variables like 'character%'; 来查看当前数据库的相关编码集. 1.启动cmd,登录mysql ①cd C:\Program Files\MySQL\ ...

  2. W3Cschool学习笔记——XHTML基础教程

    XHTML 是更严格更纯净的 HTML 代码. XHTML 是什么? XHTML 指可扩展超文本标签语言(EXtensible HyperText Markup Language). XHTML 的目 ...

  3. C++编程练习(15)----“排序算法 之 归并排序“

    归并排序 归并排序(Merging Sort)的原理: 假设初始序列含有 n 个记录,则可以看成是 n 个有序的子序列,每个子序列的长度为1,然后两两归并,得到 [n/2] ([ x ] 表示不小于 ...

  4. Openstack容器项目之Magnum

    本文以Newton版本为例. 1.Magnum简介 Magnum项目通过Openstack API能够在Openstack中创建基于容器的服务,但它本身并不直接对容器进行操作,而是通过Kubernet ...

  5. Python开发项目:大型模拟战争游戏(外星人入侵)

    外星人入侵 游戏概述: 现在准备用python开始搞一个大型游戏,模拟未来战争,地球人狙击外星人大战(其实就是小蜜蜂游戏2333),玩家控制一个飞船,用子弹歼灭屏幕上空的外星飞船:项目用到了Pygam ...

  6. Android注解学习(2)

    最近考试周没什么时间写,回归正题.前面的一次简单的讲了关于注解的的基础部分,这一次分析xutils注解封装的源码(奉上github源码). 补充下:xUtils 2.x对Android 6.0兼容不是 ...

  7. Yarn init 命令在 Git Bash 中打开时的错误

    最近一直在学习一些新的知识,ES5.ES6.Vue等,当然,作为程序,英文的阅读和听写能力也是要去学习的. 最近慕课网上的qbaty大神出了两套视频,分别是webpack和yarn,本着不断学习的精神 ...

  8. git文件夹下项目更改ip地址小结

    在我们开发的过程中,经常切换项目IP地址是很正常的,之前弄过一次,没有记住,现在简单的总结下: 找到要切换IP地址的项目,点击鼠标右键,弹出下图: 打开该项目的路径后,双击打开该项目,具体参考自己项目 ...

  9. 今天遇到的面试题for(j=0,i=0;j<6,i<10;j++,i++) { k=i+j; } k 值最后是多少?

    for(j=0,i=0;j<6,i<10;j++,i++) { k=i+j; } k 值最后是多少? <script type="text/javascript" ...

  10. <input/>标签在 苹果浏览器中 默认的有圆角

    解决方法: input{ border-radius:0; -webkit-border-radius:0; }