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 服务端概述
为什么使用异步 异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池.就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理.异步操作执行时,会将操作丢给 ...
随机推荐
- ListView 与ContextMenu的关联管理
<span style="font-family: Arial, Helvetica, sans-serif;">package com.example.listvie ...
- LeetCode之旅(20)-Power of Three
题目: Given an integer, write a function to determine if it is a power of three. Follow up: Could you ...
- leetCode(62)-Reverse Integer
题目: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 clic ...
- javascript操作select元素一例
熟悉一下js对select元素的操作,html页面中建立一个form,其中包含一个select元素和submit按钮. 当选择select中某一项时改变其文字,当select中所有项的文字都改变后,重 ...
- ruby中顶层定义的方法究竟放在哪里?
ruby中顶层(top level)中定义的方法放在main中,证明如下: self.private_methods(false) #IN TOP LEVEL 那么methods方法究竟是在哪定义的, ...
- CRM客户关系管理系统(十)
第十章.kingadmin+admin+actions功能开发 10.1. django admin的action 可以自己写个函数执行批量操作 crm/admin.py 后台admin actio ...
- MapReduce编程模型详解(基于Windows平台Eclipse)
本文基于Windows平台Eclipse,以使用MapReduce编程模型统计文本文件中相同单词的个数来详述了整个编程流程及需要注意的地方.不当之处还请留言指出. 前期准备 hadoop集群的搭建 编 ...
- Tomcat的缺省是多少,怎么修改
Tomcat的缺省端口号是8080. 修改Tomcat端口号: 1.找到Tomcat目录下的conf文件夹 2.进入conf文件夹里面找到server.xml文件 3.打开server.xml文件 ...
- IE中调试JS的一款很好的工具
附件是 IE中调试JS的一款很好用的工具,欢迎下载使用. 具体使用方法为: 1.先安装Companion.JS文件(install.exe). 2.安装Microsoft Script Debu ...
- Unsupported major.minor version 51.0 错误解决方案
jdk1.6工程中使用外部jar包中类出现:Unsupported major.minor version 51.0原因分析:出现上述错误是因为:外部jar包使用jdk1.7(jdk7)编译,而使用此 ...