三种方式实现异步socket
2009-07-03 11:06
531 查看
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using Wintellect.Threading.AsyncProgModel; namespace ExtensionTest { /* * 没有异常处理 前两种还没有实现持续接收 * AsyncEnumerator来自jeffrey rich的Wintellect */ public class NetWork { private const string ip = "localhost"; private const int port = 10101; private IPEndPoint endPoint; private Socket server; public NetWork() { endPoint = new IPEndPoint(Dns.GetHostEntry(ip).AddressList[0], port); server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); server.Bind(endPoint); server.Listen(10); } public void StartListening() { server.BeginAccept(AcceptCallback, server); } public void StartListeningWithIterator() { AsyncEnumerator asycn = new AsyncEnumerator(); asycn.Execute(this.StartAsync(asycn)); } private void AcceptCallback(IAsyncResult asyncResult) { Socket server = asyncResult.AsyncState as Socket; if (server != null) { Socket receiveSocket = server.EndAccept(asyncResult); byte[] buffer = new byte[256]; receiveSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, new State(receiveSocket, buffer)); // this.StartAsync(receiveSocket); } } private void ReceiveCallback(IAsyncResult asyncResult) { State state = asyncResult.AsyncState as State; if (state != null) { int receBytes = state.Socket.EndReceive(asyncResult); if (receBytes > 0) state.Socket.BeginSend(state.Bytes, 0, receBytes, SocketFlags.None, SendCallback, state.Socket); } } private void SendCallback(IAsyncResult asyncResult) { Socket socket = asyncResult.AsyncState as Socket; if (socket != null) { socket.EndSend(asyncResult); } } private IEnumerator<int> StartAsync(AsyncEnumerator enumerator) { server.BeginAccept(enumerator.End(), null); yield return 1; Socket receiveSocket = server.EndAccept(enumerator.DequeueAsyncResult()); byte[] buffer = new byte[256]; receiveSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, enumerator.End(), null); yield return 1; int receLength = receiveSocket.EndReceive(enumerator.DequeueAsyncResult()); if (receLength > 0) { receiveSocket.BeginSend(buffer, 0, receLength, SocketFlags.None, enumerator.End(), null); yield return 1; receiveSocket.EndSend(enumerator.DequeueAsyncResult()); } else yield break; } private void StartAsync(Socket socket) { AsyncCallback callback = null; byte[] buffer = new byte[256]; callback = receResult => { int receLength = socket.EndReceive(receResult); if (receLength > 0) { socket.BeginSend(buffer, 0, receLength, SocketFlags.None, sendResult => { socket.EndSend(sendResult); socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, callback, null); }, null); } }; socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, callback, null); } private class State { public Socket Socket { get; private set; } public byte[] Bytes { get; private set; } public State(Socket socket, byte[] bytes) { this.Socket = socket; this.Bytes = bytes; } } } }
相关文章推荐
- HTTP 通信, 三种方式XML 解析,并通过 Hander 实现异步消息处理
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序
- JS异步加载的三种实现方式
- ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,ES transport client可以同步调用也可以异步(不过底层的socket必然是异步实现)
- VMware虚拟机的三种网络连接方式以及主机向虚拟机发送文件的实现
- python实现堆排序的三种方式
- JAVA多线程实现的三种方式(转自其他地方)
- Python网络编程使用select实现socket全双工异步通信功能示例
- 二叉树三种遍历方式 递归与非递归实现 总结
- Java基础知识强化之IO流笔记62:三种方式实现键盘录入
- C#CreateGraphics方法的三种实现方式
- Android中实现异步任务机制的方式:Handler、AsyncTask
- dwr实现Reverse Ajax推送技术的三种方式
- android 三种实现水平向滑动方式(ViewPager、ViewFilpper、ViewFlow)的比较
- 三种方式打印杨辉三角形(JAVA实现)
- JavaScript模拟实现封装的三种方式及写法区别
- Android异步任务AsyncTask实现方式
- WebSocket不同版本的三种握手方式以及一个Netty实现JAVA类
- 以异步的方式操作TCP/IP套接字——以异步方式实现简单的聊天室
- 瀑布流布局的三种实现方式