Windows Phone 7 下 Socket(TCP) 与 PC 通讯

Windows Phone 7 下 Socket(TCP) 与 PC 通讯,使用 WP7 模拟器与 PC 上的 Simple TCP 服务进行通讯。

TCP 客户端主要实现 Socket 连接的建立、数据的发送与接收和关闭已经建立的 Socket。

  1 using System;
  2 using System.Net;
  3 using System.Windows;
  4 using System.Windows.Controls;
  5 using System.Windows.Documents;
  6 using System.Windows.Ink;
  7 using System.Windows.Input;
  8 using System.Windows.Media;
  9 using System.Windows.Media.Animation;
 10 using System.Windows.Shapes;
 11
 12 // 手动增加的
 13 using System.Net.Sockets;
 14 using System.Threading;
 15 using System.Text;
 16
 17 namespace SocketClientTest
 18 {
 19     public class SocketClient
 20     {
 21         Socket socket = null;
 22
 23         // 当一个异步操作完成时, 用于通知的事件对象
 24         static ManualResetEvent socketDone = new ManualResetEvent(false);
 25
 26         // 异步操作超过时间定义. 如果在此时间内未接收到回应, 则放弃此操作.
 27         const int TIMEOUT_MILLISECONDS = 5000;
 28
 29         // 最大接收缓冲
 30         const int MAX_BUFFER_SIZE = 2048;
 31
 32         // Socket 连接到指定端口的服务器
 33         // hostName 服务器名称
 34         // portNumber 连接端口
 35         // 返回值: 连接结果返回的字符串
 36         public string Connect(string hostName, int portNumber)
 37         {
 38             string result = string.Empty;
 39
 40             // 创建 DnsEndPoint. 服务器的端口传入此方法
 41             DnsEndPoint hostEntry = new DnsEndPoint(hostName, portNumber);
 42
 43             socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 44
 45             // 创建一个 SocketAsyncEventArgs 对象用于连接请求
 46             SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
 47             socketEventArg.RemoteEndPoint = hostEntry;
 48
 49             // Inline event handler for the Completed event.
 50             // Note: This event handler was implemented inline in order to make this method self-contained.
 51             socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
 52                     {
 53                         result = e.SocketError.ToString();
 54                         // 标识请求已经完成, 不阻塞 UI 线程
 55                         socketDone.Set();
 56                     }
 57                 );
 58
 59             socketDone.Reset();
 60             socket.ConnectAsync(socketEventArg);
 61             socketDone.WaitOne(TIMEOUT_MILLISECONDS);
 62
 63             return result;
 64         }
 65
 66         public string Send(string data)
 67         {
 68             string response = "Operation Timeout";
 69
 70             if (socket != null)
 71             {
 72                 // 创建 SocketAsyncEventArgs 对象、并设置对象属性
 73                 SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
 74                 socketEventArg.RemoteEndPoint = socket.RemoteEndPoint;
 75                 socketEventArg.UserToken = null;
 76
 77                 socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
 78                         {
 79                             response = e.SocketError.ToString();
 80                             socketDone.Set();
 81                         }
 82                     );
 83
 84                 // 将需要发送的数据送入发送缓冲区
 85                 byte[] payload = Encoding.UTF8.GetBytes(data);
 86                 socketEventArg.SetBuffer(payload, 0, payload.Length);
 87
 88                 socketDone.Reset();
 89                 socket.SendAsync(socketEventArg);
 90                 socketDone.WaitOne(TIMEOUT_MILLISECONDS);
 91             }
 92             else
 93             {
 94                 response = "Socket is not initialized";
 95             }
 96
 97             return response;
 98         }
 99
100         public string Receive()
101         {
102             string response = "Operation Timeout";
103
104             if (socket != null)
105             {
106                 SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
107                 socketEventArg.RemoteEndPoint = socket.RemoteEndPoint;
108                 socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
109
110                 socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
111                         {
112                             if (e.SocketError == SocketError.Success)
113                             {
114                                 // 从接收缓冲区得到数据
115                                 response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
116                                 response = response.Trim(‘\0‘);
117                             }
118                             else
119                             {
120                                 response = e.SocketError.ToString();
121                             }
122
123                             socketDone.Set();
124                         }
125                     );
126
127                 socketDone.Reset();
128                 socket.ReceiveAsync(socketEventArg);
129                 socketDone.WaitOne(TIMEOUT_MILLISECONDS);
130             }
131             else
132             {
133                 response = "Socket is not initialized";
134             }
135
136             return response;
137         }
138
139         /// <summary>
140         /// Closes the Socket connection and releases all associated resources
141         /// </summary>
142         public void Close()
143         {
144             if (socket != null)
145             {
146                 socket.Close();
147             }
148         }
149     }
150 }  

对 TCP 客户端的使用如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Net;
  5 using System.Windows;
  6 using System.Windows.Controls;
  7 using System.Windows.Documents;
  8 using System.Windows.Input;
  9 using System.Windows.Media;
 10 using System.Windows.Media.Animation;
 11 using System.Windows.Shapes;
 12 using Microsoft.Phone.Controls;
 13
 14 /*
 15  * 可以运行在 Windows Phone 7 模拟器上与 PC 进行 Socket 通讯。从 Simple TCP 服务获取相应的回应。
 16 */
 17
 18 namespace SocketClientTest
 19 {
 20     public partial class MainPage : PhoneApplicationPage
 21     {
 22         const int ECHO_PORT = 7;  // 回应端口: 配合 PC 系统的 Simple TCP 服务使用,回应接收到的字符串
 23         const int QOTD_PORT = 17; // 当日语录端口:  配合 PC 系统的 Simple TCP 服务使用
 24
 25         // 构造函数
 26         public MainPage()
 27         {
 28             InitializeComponent();
 29
 30             txtRemoteHost.Text = "yonghang-pc";       // 计算机名:可以从 桌面->计算名->属性中查看到
 31             txtInput.Text = "Test socket 测试";       // 发送的字符串
 32         }
 33
 34         private void btnEcho_Click(object sender, RoutedEventArgs e)
 35         {
 36             // 清空 log
 37             ClearLog();
 38
 39             // 确认输入是否有效
 40             if (ValidateRemoteHostInput() && ValidateEditEchoInput())
 41             {
 42                 // 初始化 SocketClient 实例
 43                 SocketClient client = new SocketClient();
 44
 45                 // 开始连接 Echo Server
 46                 Log(String.Format("Connecting to server ‘{0}‘ over port {1} (echo) ...", txtRemoteHost.Text, ECHO_PORT), true);
 47                 string result = client.Connect(txtRemoteHost.Text, ECHO_PORT);
 48                 Log(result, false);
 49
 50                 // 发送字符串到 Echo Server
 51                 Log(String.Format("Sending ‘{0}‘ to server ...", txtInput.Text), true);
 52                 result = client.Send(txtInput.Text);
 53                 Log(result, false);
 54
 55                 // 接收来自 Echo Server 的回应
 56                 Log("Requesting Receive ...", true);
 57                 result = client.Receive();
 58                 Log(result, false);
 59
 60                 // 关闭 Socket 连接
 61                 client.Close();
 62             }
 63
 64         }
 65
 66         // 获取当日语录
 67         private void btnGetQuote_Click(object sender, RoutedEventArgs e)
 68         {
 69             ClearLog();
 70
 71             if (ValidateRemoteHostInput())
 72             {
 73                 SocketClient client = new SocketClient();
 74
 75                 Log(String.Format("Connecting to server ‘{0}‘ over port {1} (Quote of the Day) ...", txtRemoteHost.Text, QOTD_PORT), true);
 76                 string result = client.Connect(txtRemoteHost.Text, QOTD_PORT);
 77                 Log(result, false);
 78
 79                 Log("Requesting Receive ...", true);
 80                 result = client.Receive();
 81                 Log(result, false);
 82
 83                 client.Close();
 84             }
 85         }
 86
 87         // 判断是否有输入
 88         private bool ValidateEditEchoInput()
 89         {
 90             if (String.IsNullOrWhiteSpace(txtInput.Text))
 91             {
 92                 MessageBox.Show("Please enter string to send.");
 93                 return false;
 94             }
 95
 96             return true;
 97         }
 98
 99         // 判断是否有输入
100         private bool ValidateRemoteHostInput()
101         {
102             if (String.IsNullOrWhiteSpace(txtRemoteHost.Text))
103             {
104                 MessageBox.Show("Please enter host name!");
105                 return false;
106             }
107
108             return true;
109         }
110
111        // 在 TextBox 中输出测试信息
112         private void Log(string message, bool isOutgoing)
113         {
114             string direction = (isOutgoing) ? ">> " : "<< ";
115             txtOutput.Text += Environment.NewLine + direction + message;
116         }
117
118         // 清空测试信息
119         private void ClearLog()
120         {
121             txtOutput.Text = String.Empty;
122         }
123     }
124 }  
时间: 2024-10-24 17:52:07

Windows Phone 7 下 Socket(TCP) 与 PC 通讯的相关文章

LWIP裸机环境下实现TCP与UDP通讯

前面移植了LWIP,并且简单的实用了DHCP的功能,今天来使用一下实际的数据通讯的功能 首先是实现TCP客户端,我先上代码 #ifndef __TCP_CLIENT_H_ #define __TCP_CLIENT_H_ #include "network.h" //连接状态 enum tcp_client_states { ES_NONE = 0, ES_RECEIVED, //接收到了数据 ES_CLOSING //连接关闭 }; //TCP服务器状态 struct tcp_clie

windows下重新安装TCP/IP协议栈

一.windows重装TCP/IP协议     前两天在windows下安装开发环境的时候,把系统的TCP/IP协议栈给搞跪了,导致系统无法ping localhost.无法在程序中创建socket等....于是对windows 7(64bit)下的TCP/IP协议栈进行了重装.尝试了很多方法,发现一个可以使用的: (1)删除注册表键值     开始——运行——regedit,找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Wins

Windows下基于TCP协议的大文件传输(流形式)

简单实现TCP下的大文件高效传输 在TCP下进行大文件传输,不像小文件那样直接打包个BUFFER发送出去,因为文件比较大可能是1G,2G或更大,第一效率问题,第二TCP粘包问题.针对服务端的设计来说就更需要严紧些.下面介绍简单地实现大文件在TCP的传输应用. 粘包出现原因:在流传输中出现,UDP不会出现粘包,因为它有消息边界(参考Windows 网络编程) 1 发送端需要等缓冲区满才发送出去,造成粘包 2 接收方不及时接收缓冲区的包,造成多个包接收 解决办法: 为了避免粘包现象,可采取以下几种措

Windows系统下的TCP参数优化

1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用.特定数据包以及超时等,具体状态如下所示: CLOSED:初始状态,表示没有任何连接. LISTEN:Server端的某个Socket正在监听来自远方的TCP端口的连接请求. SYN_SENT:发送连接请求后等待确认信息.当客户端Socket进行Connect连接时,会首先发送SYN包,随即进入SYN_SENT状态,然后等待Server端发送三次握手中的第2个包.

【转】Windows Socket TCP/UDP

Windows Socket编程,发现这篇文章不错,就拿过来分享下,转载地址:http://www.cnblogs.com/fantasy-blog/archive/2013/04/21/3033935.html SOCKET网络编程 (WINDOWS SOCKET) 1.前言 网上看了很多Socket的资料,将理解的知识总结下,详细介绍下VC下windows sockets编程,并结合服务器和客户端的两个实例(TCP/UDP)讲解下. 2.SOCKET相关原理 在网络编程中最常用的方案便是Cl

网络通信协议下的 TCP(三次握手,四次挥手) 和 UDP socket 套接字

osi七层模型 互联网的核心就是由一堆协议组成,协议就是标准,标准就是大家都认可的,所有人都按照这个来,这样大家都能够互相了解,互相深入了~~~比如全世界人通信的标准是英语 五层通信流程: tcp协议:(TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为192.3.4.16 而端口号为80,那么得到的套接字为192.3.4.16:80.) 当应用程序希望通过 TCP 与另一个应用程序

socket在windows下和linux下的区别

windows到Linux代码移植遇到的问题 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2.网络 ------ 转载 & 修改(待整理) socket相关程序从windows移植到linux下需要注意的 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h 错误处理:errno.h 2)初始化 windows下需要用WSAStartup linux下不需要 3)关

Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码

主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: [cpp] view plaincopyprint? #include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <string.h> #ifdef _WIN32   ///

netstat统计的tcp连接数与?proc?pid?fd下socket类型fd数量不一致的分析

最近,线上一个应用,发现socket数缓慢增长,并且不回收,超过警告线之后,被运维监控自动重启了. 首先到zabbix上观察JVM历史记录,发现JVM-Perm space最近两周没有数据,猜测是程序从JDK7切换到JDK8了.问过开发人员之后,程序已经很久没有重启了,最近才重新发布的.而在这期间,线上的Java运行环境已经从JDK7升级到JDK8了. 因为jdk8里没有Perm space了,换成了Metaspace. ###netstat到线上服务器上,用netstat来统计进程的conne