c# Socket通信异步TCP
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading; namespace ConsoleApplication2
{
public class StateObject
{
public Socket newsocket = null;
public const int bufferSize = ;
public byte[] buffer=new byte[bufferSize];
public StringBuilder sb = new StringBuilder(); }
public class AsynchronousClient
{
private const int port = ;
private static ManualResetEvent connectDone = new ManualResetEvent(false);
private static ManualResetEvent sendDone = new ManualResetEvent(false);
private static ManualResetEvent ReceiveDone = new ManualResetEvent(false);
private static String response = String.Empty; public static void StartClient()
{
try
{
IPAddress ipAddress = IPAddress.Parse("192.168.20.215");
IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
//生成一个TCP/IP socket
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//与目标终端连接
client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);
//等待,直到连接程序完成。在ConnectCallback中适当位置有connecDone.Set()语句
connectDone.WaitOne();
byte[] b = new byte[] { 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x30, 0x00, 0x04 };
//发送数据
Send(client, b);
sendDone.WaitOne();
Receive(client);
ReceiveDone.WaitOne();
Console.WriteLine("Response{0}", response);
client.Shutdown(SocketShutdown.Both);
//Release the socket
client.Close();
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
public static void ConnectCallback(IAsyncResult ar)
{
try
{
//从state对象获取Socket
Socket client = (Socket)ar.AsyncState;
//完成连接
client.EndConnect(ar);
Console.WriteLine("Socket connected to {0}", client.RemoteEndPoint.ToString());
connectDone.Set();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
} }
private static void Receive(Socket client)
{
try
{
//构造容器state
StateObject state = new StateObject();
state.newsocket = client;
//从远程目标接收数据
client.BeginReceive(state.buffer,,StateObject.bufferSize,,new AsyncCallback(ReceiveCallback),state);
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
}
private static void ReceiveCallback(IAsyncResult ar)
{
try
{
//从输入参数异步state对象中获取state和socket对象
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.newsocket;
int bytesRead = client.EndReceive(ar);
if (bytesRead > )
{
//有数据存储
state.sb.Append(BitConverter.ToString(state.buffer, , bytesRead));
//继续读取
client.BeginReceive(state.buffer, , StateObject.bufferSize, , new AsyncCallback(ReceiveCallback), state);
}
else
{
//所有数据读取完毕
if (state.sb.Length > )
{
response = state.sb.ToString();
}
//所有数据读取完毕的指示信号
ReceiveDone.Set();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
private static void Send(Socket client, byte[] b)
{
//格式转换
byte[] byteData = b;
//开始发送数据到远程设备
client.BeginSend(byteData,,byteData.Length,,new AsyncCallback(SendCallback),client);
}
private static void SendCallback(IAsyncResult ar)
{
try
{
//从state对象中获取socket
Socket client = (Socket)ar.AsyncState;
//完成数据发送
int bytesSend = client.EndSend(ar);
Console.WriteLine("Send {0} bytes to sever",bytesSend);
//指示数据已经发送完成,主线程继续
sendDone.Set();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
public static int Main(string[] args)
{
StartClient();
return ;
}
}
}
c# Socket通信异步TCP的更多相关文章
- Android中Socket通信之TCP与UDP传输原理
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
- [转]vb socket通信(TCP/UDP)一对一、多对一
VB Socket编程(Winsock控件创建TCP/IP客户机/服务器程序) Winsock控件建立在TCP.UDP协议的基础上,完成与远程计算机的通信.即使对TCP/IP不太熟悉的用户,使用 ...
- [转]SOCKET通信中TCP、UDP数据包大小的确定
TCP.UDP数据包大小的确定 UDP和TCP协议利用端口号实现多项应用同时发送和接收数据.数据通过源端口发送出去,通过目标端口接收.有的网络应用只能使用预留或注册的静态端口:而另外一些网络应用则可以 ...
- Go语言中Socket通信之Tcp客户端
1.用法: (1)定义远程IP地址.使用net.ResolveTCPAddr()方法,定义一个TCP地址,做为目标连接地址. (2)调用net.DialTCP("tcp",nil, ...
- .net平台下C#socket通信(上)
在开始介绍socket前先补充补充基础知识,在此基础上理解网络通信才会顺理成章,当然有基础的可以跳过去了.都是废话,进入正题. TCP/IP:Transmission Control Protocol ...
- 网络编程:Http通信与Socket通信
http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note 网络编程:Http通信与Socket通信 ...
- C#socket通信1
.net平台下C#socket通信(上) 完全是基础,新手可以随意看看,大牛可以关闭浏览页了,哈哈. 在开始介绍socket前先补充补充基础知识,在此基础上理解网络通信才会顺理成章,当然有基础的可以跳 ...
- Java基础知识强化之网络编程笔记02:Socket通信原理图解
1. Socket (1)Socket套接字 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字 (2)Socket原理机制: • 通信两端都有Socket. • 网 ...
- 异步tcp通信——APM.Core 服务端概述
为什么使用异步 异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池.就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理.异步操作执行时,会将操作丢给 ...
随机推荐
- Linux - 主机的细部权限规划:ACL 的使用
ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限配置.ACL 可 ...
- Which SQL statement is the trump card to the senior software developer
Which SQL statement is the trump card to the senior software developer MA Genfeng ...
- rails小重构:将图片加入产品Model之二
在前面我们重构了product中图片的实现,但是还是有一些小问题.比如用户如果上传一个非图片格式的文件时的验证情况. 我们之前是将图片格式验证代码放在Picture类中: validates_form ...
- python下实现二叉堆以及堆排序
python下实现二叉堆以及堆排序 堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序.堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势. 堆分为大头堆和小头堆 ...
- html5中新增的非主体结构的元素
html5中出了新增了article.section.nav.aside.time主要结构元素外,还增加了一些表示逻辑结构或附加信息的非主体结构元素. 一.header元素 header元素是一种具有 ...
- 数据库scheme设计(9.4 小结)
通过这一章的内容,希望能够让大家明白一个道理,“数据库系统的性能不是优化出来的,更多的是设计出来的”.数据库Schema 的设计并不如很多人想象的那样只是一个简单的对象对应实现,而是一个系统工程.要想 ...
- lua函数随记
在大多数Lua语法分析中可以获得这些标准Lua函数. 无可争辩, 我们可以查阅Lua网站, 但是一些少了的函数被Blizzard进行了调整. 下面列出了所有Lua函数. WoW API中的Lua注意在 ...
- Greenplum测试部署笔记
按照官方Readme文档在Ubunut16.04上成功编译安装Greenplum最新代码(now:2017-11-12 21:40) 按照文档安装的过程中主要出现两个问题: 1.Root用户安装会卡在 ...
- subclipse下svn: E200015: authentication cancelled问题的解决
今天要把新建的一个项目要share到一个Ubuntu下SVN服务上,总是让我不断的重复输入密码,实在是太要命了,点取消就报错如标题,Google了一下,最后在后面参考那篇帖子的启发下,到SVN配置里面 ...
- add-apt-repository出Exception问题
参考:http://blog.sina.com.cn/s/blog_5388923c0100nu8h.html 症状: xxxx@xxxxx:~$ sudo add-apt-repository pp ...