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

来源:互联网 发布:随机算法 编辑:程序博客网 时间:2024/05/09 08:04
    C#异步传输字符串服务端的实现是如何的呢?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#异步传输字符串有所帮助。

原创粉丝点击