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 服务端概述
为什么使用异步 异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池.就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理.异步操作执行时,会将操作丢给 ...
随机推荐
- OAF中的MASTER-DETAIL关系
在日常开发中,我们经常会遇到头行结构,并且要求打开界面,行是隐藏的,点击头上的"显示"按钮,才要求头对应的行信息全部显示出来,这样,我们就用到了Master-Detail结构. 下 ...
- DH密钥交换非对称加密
迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange,简称"D–H") 是一种安全协议. 它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起 ...
- Detours修改段属性漏洞
v:* { } o:* { } w:* { } .shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-botto ...
- ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)
===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...
- Linux文件与目录的默认权限与隐藏权限 - umask, chattr, lsattr, SUID, SGID, SBIT, file
文件默认权限:umask [root@www ~]# umask 0022 <==与一般权限有关的是后面三个数字! [root@www ~]# umask -S u=rwx,g=rx,o=rx ...
- Gradle 1.12用户指南翻译——第四十二章. Announce插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- C++笔记十七:C语言中 “冒牌货”const和const符号表
在.c文件中有程序: int main() { int const a = 10; a=20; printf("a=%d\n",a); return 0; } 编译就知道C语言 ...
- 2018国赛 - Writeup(待补充)
10.0.0.55 Writeup Web 0x01 easyweb 解题思路 题目很脑洞 用户名admin 密码123456进去可得到flag(密码现在换了) 解题脚本 无 Reverse 0x02 ...
- vue2.0 — 移动端的输入框实时检索更新列表
我们都是行走在这世界的孤独者 - 暖暖 最近在做vue2.0的项目遇到一个移动端实事检索搜索更新列表的效果,但用户在搜索框输入客户的电话或姓名的时候,客户列表内容会做相应的更新,下面给大家看下图~· ...
- python---生成器、迭代器
# -*- coding:utf-8 -*- # LC # 列表生成式 def func(x): print(x) return 2*x print([ func(i) for i in range( ...