简单的c# TCP通讯(TcpListener)

C# 的TCP Socket (同步方式)

C# 的TCP Socket (异步方式)

C# 的tcp Socket设置自定义超时时间

C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

服务器端:

  1. public static ManualResetEvent allDone = new ManualResetEvent(false);
  2.  
  3. IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
  4. Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  5.  
  6. listener.Bind(localEndPoint);
  7. listener.Listen();
  8. while (true)
  9. {
  10. allDone.Reset();
  11. listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
  12. allDone.WaitOne();
  13. }
  1. public static void AcceptCallback(IAsyncResult ar)
  2. {
  3. try
  4. {
  5. if (IsListening)
  6. {
  7. allDone.Set();
  8. Socket listener = (Socket)ar.AsyncState;
  9. Socket handler = listener.EndAccept(ar);
  10. StateObject state = new StateObject();
  11. state.workSocket = handler;
  12. handler.BeginReceive(state.headbuffer, , StateObject.HeadBufferSize, ,
  13. new AsyncCallback(ReceiveHead), state);
  14. }
  15. }
  16. catch (System.Exception ex)
  17. {
  18. log.ErrorFormat("AcceptCallback异常,原因:{0}", ex.Message);
  19. }
  20. }
  21.  
  22. private static void ReceiveHead(IAsyncResult ar)
  23. {
  24. try
  25. {
  26. StateObject state = (StateObject)ar.AsyncState;
  27. Socket handler = state.workSocket;
  28. int bytesRead = handler.EndReceive(ar);
  29.  
  30. uint length = ByteTouint(state.headbuffer, , );
  31. state.length = (int)length - state.headbuffer.Length;
  32. state.bodybuffer = new byte[length - state.headbuffer.Length];
  33. handler.BeginReceive(state.bodybuffer, , state.bodybuffer.Length, ,
  34. new AsyncCallback(ReadCallback), state);
  35. }
  36. catch (System.Exception ex)
  37. {
  38. log.ErrorFormat("ReceiveHead异常,原因:{0}", ex.Message + ex.StackTrace);
  39. }
  40. }
  1. public static void ReadCallback(IAsyncResult ar)
  2. {
  3. StateObject state = (StateObject)ar.AsyncState;
  4. Socket handler = state.workSocket;
  5.  
  6. int bytesRead = handler.EndReceive(ar);
  7. //接收的字节在state.bodybuffer里,下面开始处理
  8.  
  9. }

已知接收长度的话可以把ReceiveHead函数去掉,直接进入ReadCallback里。

加入ReceiveHead是因为协议一般在开头几个固定的字节里有后面数据包的长度,所以先接收头,再根据解析出的数据包长度接收后面的。

  1. StateObject定义如下,可以不要headbuffer HeadBufferSize
  1. public class StateObject
  2. {
  3. public Socket workSocket = null;
  4. public const int HeadBufferSize = ;
  5.  
  6. public byte[] headbuffer = new byte[HeadBufferSize];
  7. public byte[] bodybuffer;
  8. public int length;
  9. }

客户端发送数据  C# 的TCP Socket (同步方式)

C# 的TCP Socket (异步方式)的更多相关文章

  1. C# 的TCP Socket (同步方式)

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  2. C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼

    异步 相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下 ...

  3. ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,ES transport client可以同步调用也可以异步(不过底层的socket必然是异步实现)

    ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用! 因此,ES tra ...

  4. C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  5. C# 的tcp Socket设置自定义超时时间

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  6. C# Socket编程(5)使用TCP Socket

    TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer) ...

  7. socket异步编程--libevent的使用

    使用 libevent 和 libev 提高网络应用性能 http://www.ibm.com/developerworks/cn/aix/library/au-libev/ libevent实现ht ...

  8. 再次回首 TCP Socket服务器编程

    转载:http://www.cnblogs.com/zc22/archive/2010/06/27/1766007.html ------------------ 前言 --------------- ...

  9. [转] socket异步编程--libevent的使用

    这篇文章介绍下libevent在socket异步编程中的应用.在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的 ...

随机推荐

  1. AEAI HR_v1.5.2升级说明,开源人力资源管理系统

    1.升级说明 本次AEAI HR升级内容主要是针对数通畅联推出AEAI ECP企业云联平台而升级的,其中对AEAI HR的各模块进行扩展,同时增加了移动门户版功能及为AEAI ECP提供数据服务接口. ...

  2. Percona TokuDB

    Percona TokuDB Percona TokuDB 1.     TokuDB说明 2.     TokuDB安装 3.     使用TokuDB 3.1 快速插入和富索引 3.2 聚集sec ...

  3. [iOS]ReactiveCocoa安装方法

    1. 替换Ruby镜像 我们想要使用CocoaPods来安装ReactiveCocoa.由于OS X上的Ruby镜像被墙了,感谢淘宝为我们提供了国内访问镜像. $ gem sources --remo ...

  4. 取消chrome浏览器下input和textarea的默认样式;html5默认input内容清除“×”按钮去除办法

    取消chrome浏览器下input和textarea的默认样式: outline:none;/*清空chrome中input的外边框*/ html5默认input内容清除“×”按钮去除办法: inpu ...

  5. 项目自动化建构工具gradle 入门4——javaWeb在浏览器中显示helloWorld

    在java应用中,其实做的最多的还是java web应用.所以现在我们做的就是用gradle构建一个简单的web项目,简单点,直接上代码吧. 1.进入目录D:\work\gradle\web,新建文件 ...

  6. 使用maven给spring项目打可直接运行的jar包(配置文件内置外置的打法)

    从网上看过许多打jar包的例子,大多是将配置文件打进jar包的.经过本人一番研究,终于搞清楚了怎样将jar包的配置文件外置. 废话不说,直接上spring的pom.xml的配置文件. <proj ...

  7. 【译】什么是 web 框架?

    Web 应用框架,或者简单的说是“Web 框架”,其实是建立 web 应用的一种方式.从简单的博客系统到复杂的富 AJAX 应用,web 上每个页面都是通过写代码来生成的.我发现很多人都热衷于学习 w ...

  8. canvas arcTo()用法详解

    CanvasRenderingContext2D对象的方法arcTo()的用法. arcTo(x1, y1, x2, y2, radius) arcTo()方法将利用当前端点.端点1(x1,y1)和端 ...

  9. 那些年我们学过的构造函数(构造方法,C#)

    构造函数也称构造方法,在面向对象中称为构造方法,在面向过程中称为构造函数;C#是面向对象的语言,所以以下都称为构造方法, OK,下面我们先看一下什么是构造函数 class Dog { //创建一个狗类 ...

  10. CPU中断和轮询

    轮询顾名思义,CPU不停的询问,CPU很忙. 中断和轮询不同,是硬件上的,就像一个开关被按下了,没有什么东西在不停的询问开关有没有被按下,开关只是被按下了,就通电了,通电了就会发声一些事情. 可以看看 ...