wp socket tcp链接
using System;
using System.Net;
/// <summary>
/// 客户端通过TCP/IP连接服务端的方法,包含连接,发送数据,接收数据功能
/// </summary>
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class LYL_TCP_Client
{
// 定义一个空的Socket对象
Socket socket = null; // 当一个异步操作完成时, 用于通知的事件对象
//创建一个手动线程通知事件,false表示默认是线程阻塞,true表示线程继续,只有线程继续WaitOne()才有意义
static ManualResetEvent clientDone = new ManualResetEvent(false); // 异步操作超过时间定义. 如果在此时间内未接收到回应, 则放弃此操作.
const int TIMEOUT_MILLISECONDS = 5000; // 用于接收数据的缓存数组大小
const int MAX_BUFFER_SIZE = 1024; /// <summary>
/// 通过给定的地址和端口尝试TCP连接
/// </summary>
/// <param name="hostName">主机地址</param>
/// <param name="portNumber">通讯端口</param>
/// <returns>返回一个以字符串形式表示的连接结果</returns>
public string Connect(string hostName, int portNumber)
{
//连接结果,预定义为空
string result = string.Empty; //通过给定的地址和端口创建一个网络终结点
DnsEndPoint hostEntry = new DnsEndPoint(hostName, portNumber); // 给预定义的空的Socket对象赋值
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 创建一个SocketAsyncEventArgs 异步操作对象用于连接请求
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
//设置异步操作的DNS终结点
socketEventArg.RemoteEndPoint = hostEntry; // Inline event handler for the Completed event.
// Note: This event handler was implemented inline in order to make this method self-contained.
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
// 获取连接结果
result = e.SocketError.ToString(); //标识请求已经完成, 不阻塞 UI 线程
clientDone.Set();
}); // 重置clientDone,导致线程阻塞
clientDone.Reset(); // socket异步连接请求
socket.ConnectAsync(socketEventArg); //阻塞UI线程,等待下一个线程,如超过指定时间则认为已经超时并开启UI线程
clientDone.WaitOne(TIMEOUT_MILLISECONDS); //返回连接结果
return result;
} /// <summary>
/// 发送指令数据至服务器
/// </summary>
/// <param name="data">要发送的指令</param>
/// <returns>发送结果,即成功或失败</returns>
public string Send(string data)
{
string response = "Operation Timeout"; // 使用在连接操作初始化的socket对象进行数据发送
if (socket != null)
{
// 创建 SocketAsyncEventArgs 对象、并设置对象属性
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = socket.RemoteEndPoint;
socketEventArg.UserToken = null; // 事件完成监听器
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
response = e.SocketError.ToString(); //不阻塞UI线程
clientDone.Set();
}); // 将需要发送的数据指令送入发送缓冲区
byte[] payload = Encoding.Unicode.GetBytes(data);
socketEventArg.SetBuffer(payload, 0, payload.Length); // 表示事件未完成,导致线程阻塞
clientDone.Reset(); // socket异步连接请求
socket.SendAsync(socketEventArg); // 阻塞UI线程,等待下一个线程,如超过指定时间则认为已经超时并开启UI线程
clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
response = "Socket is not initialized";
} return response;
} public string Receive()
{
string reciveString = "";//服务端返回的整一串字符串,有可能包含有多个包
string oneTimeReciveString = "";//一次接收到的字符串,当有多个数据包的时候,每次只接收一个包 while (true)
{
oneTimeReciveString = OneTimeReceive();
Thread.Sleep(50);//线程等待,避免网络状况不好导致接收不完全
if (oneTimeReciveString.Length > 0)
{
reciveString = reciveString + oneTimeReciveString;
}
else
break;
}
return reciveString;
}
/// <summary>
/// 从服务端接收数据,此方法每次只接收一个数据包
/// </summary>
/// <returns>一个数据包</returns>
public string OneTimeReceive()
{
string response = "Operation Timeout"; if (socket != null)
{
// 创建 SocketAsyncEventArgs 对象、并设置对象属性
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = socket.RemoteEndPoint; // 设置接收数据缓冲区
socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE); // Inline event handler for the Completed event.
// Note: This even handler was implemented inline in order to make
// this method self-contained.
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{ if (e.SocketError == SocketError.Success)
{
// 从接收缓冲区得到数据
response = Encoding.Unicode.GetString(e.Buffer, e.Offset, e.BytesTransferred); //去除缓冲区多余的字节,即当返回数据的长度比缓冲字节数组小的时候,去除掉缓冲自己数组中有用数据外的字符
//数组中默认的字符为'\0'
response = response.Trim('\0');
}
else
{
response = e.SocketError.ToString();
}
clientDone.Set(); }); //表示事件未完成,导致线程阻塞
clientDone.Reset(); //socket异步连接请求
socket.ReceiveAsync(socketEventArg); //阻塞UI线程,等待下一个线程,如超过指定时间则认为已经超时并开启UI线程
clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
response = "Socket is not initialized";
} return response;
} /// <summary>
/// 关闭socket并释放资源
/// </summary>
public void Close()
{
if (socket != null)
{
socket.Close();
}
} }
wp socket tcp链接的更多相关文章
- socket 关于同一条TCP链接数据包到达顺序的问题
转:http://blog.csdn.net/l1008610/article/details/52197602 以前作者也一直以为数据包先发的不一定先到,直到今天才意识这个问题的缺陷,数据包是不一定 ...
- 使用SOCKET TCP
刚刚接触SOCKET编程,网上看了一些资料,发现做些简单的应用还是不难.但是要深入了解SOCKET编程还需要系统的看一些书.一般在进程间通信TCP是一种不错的方式. ---XXX TCP链接是面向流的 ...
- Socket TCP Server一个端口可以有多少个长连接?受到什么影响?linux最大文件句柄数量总结
Socket TCP Server一个端口可以有多少个长连接? 网上答案很多,不知道那个才是正确的 理论上是无限的 16.Linux中,一个端口能够接受tcp链接数量的理论上限是? A.1024 B. ...
- 27.Socket,TCP,UDP,HTTP基本通信原理
Socket,TCP,UDP,HTTP基本通信原理(摘自百度): TCP.UDP,HTTP 底层通信都是通过 socket 套接字实现 网络上不同的计算机,也可以通信,那么就得使用网络套接字(sock ...
- ss is one another utility to investigate sockets(特适合大规模tcp链接)
原创文章,转载请注明: 转载自系统技术非业余研究 本文链接地址: ss is one another utility to investigate sockets(特适合大规模tcp链接) 具体的可以 ...
- iOS Socket/Tcp编程 GCDAsyncSocket的实战(带回调)
很多同学一听到Socket TCP UDP 这几个字眼感觉特别害怕,很怕在工作当中使用,因为他们太底层了.下面我把我在工作中使用Socket类库GCDAsyncSocket进行一次实战 文章中只适用于 ...
- Lib1vent:10链接监听器接受TCP链接
evconnlistener机制提供了监听并接受TCP链接的方法.除非特别注明,本章的所有函数和类型都在event2/listener.h中声明. 一:创建或释放evconnlistener stru ...
- 从Linux源码看Socket(TCP)的bind
从Linux源码看Socket(TCP)的bind 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看下Server ...
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...
随机推荐
- selenium 定位元素可以用多个findElement
selenium 定位元素可以用多个findElement,如driver.findElement(By.id"XXX").findElement(By.linkText(XXX) ...
- java代码用户界面网格布局GridLayout.划分为格子区域
总结:网格布局.很简单,首先要new一个 this.setlayout(new GriedLayout(3,5));里面是行数和列数 package clientFrame; //网格布局练习 i ...
- selenium自动化浏览器后台运行headless模式
通过selenium做WEB自动化的时候,必须要启动浏览器, 浏览器的启动与关闭会影响执行效率. 当我们在自己电脑运行代码时,还会影响做别的事情. 鉴于这种情况,Google针对Chrome浏览器新增 ...
- oracle查看表空间和物理文件大小
查看各表空间的使用情况 select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/102 ...
- CORS跨域资源共享漏洞
CORS漏洞其中已经存在很久了,但是国内了解的人不是很多,文章更是少只有少,漏洞平台也没有此分类. 在DefConChina之后写了一篇算是小科普的文章. 定义CORS,Cross-Origin Re ...
- Tuple、list的区别以及dict和set
元组(Tuple): 定义方法:使用小括号() 使用方法: count:可以统计某个元组段在整个元组中出现的次数 index:可以查询某个元组段在整个元组中的元组号 name_tuple = ('xi ...
- js处理小数加减时精度失真
最近公司业务有用js处理数据加减,但有时候会出现很多位小数:后来发现是js处理小数时精度失真:为了后边不在犯类似错误,笔者觉得有必要记录下处理方法,当然处理方法有很多种,这里笔者找了一种较为简洁的方法 ...
- Python基础学习七 网络编程
主要应用urllib和requests模块 urllib模块返回类型为bytes,需要数据类型转换:requests就方便很多. 例子1:发送post请求 url = 'http://api.nnzh ...
- latex 显示中文
中文支持需要cjk-latex,总得来说中文可以使用GB和GBK两种字体,GBK需要从windows下copy *.ttc或*.ttf, GB字体则在linux下就用. 先说支持GB的中文显示,安装以 ...
- 3-1 Git下载与安装
https://desktop.github.com/