Quick Search


Tibetan singing bowl music,sound healing, remove negative energy.

528hz solfreggio music -  Attract Wealth and Abundance, Manifest Money and Increase Luck



 
Your forum announcement here!

  Free Advertising Forums | Free Advertising Board | Post Free Ads Forum | Free Advertising Forums Directory | Best Free Advertising Methods | Advertising Forums > Free Advertising Forums Directory > Miscellaneous Forums

Miscellaneous Forums This is a list of any forum that has a free advertising section but doesnt fit into the categories above.

Reply
 
Thread Tools Search this Thread Display Modes
Old 06-22-2011, 11:17 AM   #1
Iamali5na62
 
Posts: n/a
Default C#异步的Socket通信(重构局域网聊天小工具) - Create

五一在家看了一会儿<重构手册>, 想拿以前写的代码尝试着改进改进, 想起去年暑假写的局域网聊天小工具, 现在看自己那时写的代码已经不堪入目, 最不可思议的当属用了"多线程"处理网络请求, 现在觉得应该使用异步方法.
主要设计
简要说明
上图左边部分表示的是客户端的过程, 右边部分表示的是服务端的过程. 客户端相比服务端在建立连接之前步骤稍微少一些, 成功建立连接后客户端和服务端都有一个CommunicateSocket负责与对方通信, 如发送消息, 接收消息, 发送文件, 接收文件等.
服务端, 声明ServerSocket, 绑定(Bind)一个IP并指定这个IP的通信端口, 比如是127.0.0.1:9050, ServerSocket可以监听来自多个IP发送的连接请求, 监听(Listen)方法的参数可以设置允许的最多连接请求个数. 然后调用异步接受请求的方法(BeginAccept), 如果接受到某个客户端发来连接请求, 这时定义一个新的CommunicateSocket专门负责与这个客户端通信. 然后可以通过CommunicateSocket.BeginSend()方法给客户端发送数 据, CommunicateSocket.BeginReceive()可以接收客户端发来的数据.
客户端, 有一个CommunicateSocket, 并绑定一个IP以及一个未被占用的端口, 定义IPEndPoint serverIP表示服务端Socket的IP和端口, 这样才可以进行端口对端口之间的通信, 接下来就可以尝试CommunicateSocket.BeginConnect(serve rIP), 连接成功之后就可以发送和接收数据了, CommunicateSocket.BeginSend(), CommunicateSocket.BeginReceive().
有些异步方法有两种实现方式, 如BeginAccept()和AcceptAsync(), 这两个方法有什么区别呢? 以Begin 和End 开头的方法是以 APM(Asynchronous Programming Model)设计方法实现的异步操作,dr. dre monster beats headphones, 以Async 结尾的方法是利用称为 EAP (Event-based Asynchronous Pattern) 的设计方法实现的异步操作.
代码部分
1. SocketFunc类SocketFunc是一个抽象类, 服务端和客户端只有建立连接的方法不同, 其它都相同, 所以把相同的部分放到这个类中.public abstract class SocketFunc //不管是服务端还是客户端, 建立连接后用这个Socket进行通信 public Socket communicateSocket = null; //服务端和客户端建立连接的方式稍有不同, 子类会重载 public abstract void Access(string IP, System.Action AccessAciton); //发送消息的函数 public void Send(string message) if (communicateSocket.Connected == false) throw new Exception("还没有建立连接, 不能发送消息"); Byte[] msg = Encoding.UTF8.GetBytes(message); communicateSocket.BeginSend(msg,0, msg.Length, SocketFlags.None, ar => {}, null); //接受消息的函数 public void Receive(System.Action<string> ReceiveAction) //如果消息超过1024个字节, 收到的消息会分为(总字节长度/1024 +1)条显示 Byte[] msg = new byte[1024]; //异步的接受消息 communicateSocket.BeginReceive(msg, 0, msg.Length, SocketFlags.None, ar => { //对方断开连接时, 这里抛出Socket Exception //An existing connection was forcibly closed by the remote host communicateSocket.EndReceive(ar); ReceiveAction(Encoding.UTF8.GetString(msg).Trim('\ 0'Receive(ReceiveAction); }, null);
2. ServerSocket:SocketFunc类
继承自SocketFunc类, 类中重载了Access方法.public class ServerSocket:SocketFunc //服务端重载Access函数 public override void Access(string IP, System.Action AccessAciton) Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //本机预使用的IP和端口 IPEndPoint serverIP = new IPEndPoint(IPAddress.Any, 9050); //绑定服务端设置的IP serverSocket.Bind(serverIP); //设置监听个数 serverSocket.Listen(1); //异步接收连接请求 serverSocket.BeginAccept(ar => base.communicateSocket = serverSocket.EndAccept(ar); AccessAciton(); }, null);
3. ClientSocket:SocketFunc类
继承自SocketFunc类, 类中重载了Access方法.public class ClientSocket:SocketFunc //客户端重载Access函数 public override void Access(string IP, System.Action AccessAciton) base.communicateSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); base.communicateSocket.Bind(new IPEndPoint(IPAddress.Any, 9051));//服务器的IP和端口 IPEndPoint serverIP; try serverIP = new IPEndPoint(IPAddress.Parse(IP), 9050); catch throw new Exception(String.Format("{0}不是一个有效的IP地址!", IP));//客户端只用来向指定的服务器发送信息,不需要绑定本机的IP和端口,不需要监听 try base.communicateSocket.BeginConnect(serverIP, ar => AccessAciton(); }, null); catch throw new Exception(string.Format("尝试连接{0}不成功!", IP));
程序截图
源码下载
Create Chen http://technology.cnblogs.com 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议 Create Chen Create Chen Create Chen Create Chen john23.net Create Chen Create Chen Create Chen 分析称Android应用数量8月将超苹果App Store 传iOS 5将支持无线固件升级 网秦IPO开盘价11.5美元 开盘2分钟破发 EA收购澳大利亚游戏工作室Firemint Google Analytics 现在支持分析网页加载速度 Entity Framework 4.1 推荐英文教程 反馈、无反馈、不和谐的反馈 深入 Facebook 消息应用服务器 Android四种Activity的加载模式 更多知识库文章... China-pub 计算机图书网上专卖店!6.5万品种2-8折! China-Pub 计算机绝版图书按需印刷服务 C#异步的Socket通信(重构局域网聊天小工具) 微软社区精英(0/0) .NET Works(17) Assembly(1) HTML&CSS(1) Other Notes(6) Pro Thinking(5) SICP Study(2) Visual Studio(2) Windows 7(3) WinForm(2) 2011年5月(1) 2011年4月(5) 2011年3月(1) 2011年2月(9) 2011年1月(2) 2010年12月(3) 2010年10月(2) 2010年8月(2) 2010年7月(2) 2010年6月(2) 2010年5月(3) 2010年4月(10) 2010年3月(1) 2009年11月(1) 1. C#异步的Socket通信(重构局域网聊天小工具) 2. C#匿名方法与Delegate类型转换错误 3. WPF中使用amCharts绘制股票K线图 4. C#代码中不经意的值拷贝 5. 设置CodeRush Xpress的线条颜色 6. 解决C#中一个"异步方法却同步执行"的问题 7. C#版本拉格朗日插值算法 8. LINQ中的Func委托 9. LINQ中的"延迟查询"特性 10. C#3.0亮点 —— 分部方法 11. C#3.0亮点 —— 扩展方法 12. C#3.0亮点 —— 关键字var和匿名类型 13. C#3.0亮点 —— lambda表达式 14. 费马小定理在公钥加密中的应用及原理 1. 关于QQ一些功能的实现(一)(21381) 2. 小软件获取QQ好友是否"隐身对你可见"(4297) 3. Windows 7的"上帝模式"(3284) 4. 用Socket做一个局域网聊天工具(3129) 5. 关于QQ一些功能的实现(二)(2904) 6. "六度空间"的应用——找出两个陌生人之间的关系(一)(2894) 7. 梁朝伟变刘德华之山寨实现(2341) 8. C#异步的Socket通信(重构局域网聊天小工具)(2335) 9. 用WinForm做了一个实用的屏幕截图程序(2223) 10. 人脸变换程序究竟要如何实现(1867) 11. "六度空间"的应用——找出两个陌生人之间的关系(二)(1813) 12. WPF中使用amCharts绘制股票K线图(1725) 13. 算法练习 (一)(1688) 14. 个性化你的Windows 7 Taskbar Thumbnail(1485) 15. 把Omegle改一改, 摇身变成窗口类型的聊天程序(1405) 16. 解决C#中一个"异步方法却同步执行"的问题(1361) 17. 费马小定理在公钥加密中的应用及原理(1339) 18. 关于汇编语言寄存器和指令操作的整理(1313) 19. 算法练习 (二)(1204) 20. C#匿名方法与Delegate类型转换错误(1084) 21. 刚刚体验了一把用WPF做的QQ概念版(1073) 22. VS2010和IE8是怎样让"Ctrl+鼠标滚轮的上下操作"实现改变字体或页面大小的(1035) 23. .NET操作Excel表格的整理(518) 24. 有趣的换零钱问题(477) 25. WPF动画: 窗体上下方向同时拉伸(427) 26. LINQ中的Func委托(352) 27. 刚听完CSDN总裁蒋涛先生的学术报告(339) 28. 教你一招画素描, 不写程序时陶冶陶冶情操(331) 29. C#3.0亮点 —— lambda表达式(323) 30. 小技巧: Win7还原XP的All Programs风格(306) 1. 关于QQ一些功能的实现(一)(76) 2. 用Socket做一个局域网聊天工具(48) 3. 关于QQ一些功能的实现(二)(41) 4. "六度空间"的应用——找出两个陌生人之间的关系(一)(41) 5. "六度空间"的应用——找出两个陌生人之间的关系(二)(31) 6. 梁朝伟变刘德华之山寨实现(25) 7. 小软件获取QQ好友是否"隐身对你可见"(25) 8. C#异步的Socket通信(重构局域网聊天小工具)(22) 9. 人脸变换程序究竟要如何实现(18) 10. 算法练习 (一)(18) 11. 算法练习 (二)(17) 12. Windows 7的"上帝模式"(17) 13. 用WinForm做了一个实用的屏幕截图程序(15) 14. LINQ中的Func委托(13) 15. C#3.0亮点 —— 分部方法(12) 16. WPF中使用amCharts绘制股票K线图(12) 17. C#3.0亮点 —— 关键字var和匿名类型(11) 18. 费马小定理在公钥加密中的应用及原理(10) 19. VS2010和IE8是怎样让"Ctrl+鼠标滚轮的上下操作"实现改变字体或页面大小的(9) 20. 个性化你的Windows 7 Taskbar Thumbnail(9) 21. .NET操作Excel表格的整理(9) 22. 设置CodeRush Xpress的线条颜色(7) 23. 教你一招画素描, 不写程序时陶冶陶冶情操(7) 24. 解决C#中一个"异步方法却同步执行"的问题(7) 25. 把Omegle改一改, 摇身变成窗口类型的聊天程序(7) 26. 哀悼日, 网页变灰的实现(6) 27. 关于汇编语言寄存器和指令操作的整理(6) 28. 几道有意思的逻辑分析题(6) 29. 刚刚体验了一把用WPF做的QQ概念版(5) 30. 刚听完CSDN总裁蒋涛先生的学术报告(5)
  Reply With Quote

Sponsored Links
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off


All times are GMT. The time now is 12:36 AM.

 

Powered by vBulletin Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Free Advertising Forums | Free Advertising Message Boards | Post Free Ads Forum