C#异步传输字符串服务端的实现

C#异步传输字符串服务端的实现当程序越来越复杂的时候,就需要越来越高的抽象,所以从现在起我们不再把所有的代码全部都扔进Main()里,这次我创建了一个RemoteClient类,它对于服务端获取到的TcpClient进行了一个包装:

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了兴县免费建站欢迎大家使用!

C#异步传输字符串服务端的实现实例:

 
 
 
  1. public class RemoteClient {  
  2. private TcpClient client;  
  3. private NetworkStream streamToClient;  
  4. private const int BufferSize = 8192;  
  5. private byte[] buffer;  
  6. private RequestHandler handler;  
  7.  //C#异步传输字符串服务端的实现
  8. public RemoteClient(TcpClient client) {  
  9. this.client = client;  
  10.  
  11. // 打印连接到的客户端信息  
  12. Console.WriteLine("\nClient Connected!{0} <-- {1}",  
  13. client.Client.LocalEndPoint,  
  14.  client.Client.RemoteEndPoint);  
  15.  
  16. // 获得流  
  17. streamToClient = client.GetStream();  
  18. buffer = new byte[BufferSize];  
  19.  
  20. // 设置RequestHandler  
  21. handler = new RequestHandler();  
  22.  
  23. // 在构造函数中就开始准备读取  
  24. AsyncCallback callBack =   
  25. new AsyncCallback(ReadComplete);  
  26. streamToClient.BeginRead(buffer,   
  27. 0, BufferSize, callBack, null);  
  28. }  
  29.  
  30. // 再读取完成时进行回调  
  31. private void ReadComplete(IAsyncResult ar) {  
  32. int bytesRead = 0;  
  33. try {  
  34. lock (streamToClient) {  
  35. bytesRead = streamToClient.EndRead(ar);  
  36. Console.WriteLine("Reading data, {0} bytes ...", bytesRead);  
  37. }  
  38. if (bytesRead == 0) throw new Exception("读取到0字节");  
  39.  //C#异步传输字符串服务端的实现
  40. string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);  
  41. Array.Clear(buffer,0,buffer.Length);  
  42. // 清空缓存,避免脏读  
  43.  
  44. string[] msgArray = handler.GetActualString(msg);   
  45.   // 获取实际的字符串  
  46.  
  47. // 遍历获得到的字符串  
  48. foreach (string m in msgArray) {  
  49. Console.WriteLine("Received: {0}", m);  
  50. string back = m.ToUpper();  
  51.  
  52. // 将得到的字符串改为大写并重新发送  
  53. byte[] temp = Encoding.Unicode.GetBytes(back);  
  54. streamToClient.Write(temp, 0, temp.Length);  
  55. streamToClient.Flush();  
  56. Console.WriteLine("Sent: {0}", back);  
  57. }     //C#异步传输字符串服务端的实现
  58.  
  59. // 再次调用BeginRead(),完成时调用自身,形成无限循环  
  60. lock (streamToClient) {  
  61. AsyncCallback callBack =  
  62.  new AsyncCallback(ReadComplete);  
  63. streamToClient.BeginRead(buffer,   
  64. 0, BufferSize, callBack, null);  
  65. }  
  66. } catch(Exception ex) {  
  67. if(streamToClient!=null)  
  68. streamToClient.Dispose();  
  69. client.Close();  
  70. Console.WriteLine(ex.Message);    
  71. // 捕获异常时退出程序    
  72. }  
  73. }  
  74. }  

随后,我们在主程序中仅仅创建TcpListener类型实例,由于RemoteClient类在构造函数中已经完成了初始化的工作,所以我们在下面的while循环中我们甚至不需要调用任何方法:

 
 
 
  1. class Server {  
  2. static void Main(string[] args) {  
  3. Console.WriteLine("Server is running ... ");  
  4. IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });  
  5. TcpListener listener = new TcpListener(ip, 8500);  
  6.  
  7. listener.Start();   // 开始侦听  
  8. Console.WriteLine("Start Listening ...");  
  9.  
  10. while (true) {  
  11. // 获取一个连接,同步方法,在此处中断  
  12. TcpClient client = listener.AcceptTcpClient();    
  13. RemoteClient wapper = new RemoteClient(client);  
  14. }  
  15. }  //C#异步传输字符串服务端的实现

好了,服务端的实现现在就完成了。

C#异步传输字符串服务端的实现方面内容就向你介绍到这里,希望对你了解和学习C#异步传输字符串有所帮助。

【编辑推荐】

  1. 委托实现C#异步调用浅析
  2. 浅析C#中异步和多线程的区别
  3. C# Socket通信三大问题详解
  4. C#异步调用四大方法详解
  5. C#网络编程消息发送问题浅析

本文名称:C#异步传输字符串服务端的实现
网站链接:http://www.shufengxianlan.com/qtweb/news1/187501.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联