C#异步传输字符串客户端的实现

  • C#异步传输字符串客户端的实现是如何什么呢?C#异步传输字符串客户端的实现需要注意的是什么呢?那么本文就向你介绍相关的内容。
  •  

    C#异步传输字符串客户端的实现与服务端类似,我们首先对TcpClient进行一个简单的包装,使它的使用更加方便一些,因为它是服务端的客户,所以我们将类的名称命名为ServerClient:

      
      
    1. public class ServerClient {  
    2. private const int BufferSize = 8192;  
    3. private byte[] buffer;  
    4. private TcpClient client;  
    5. private NetworkStream streamToServer;  
    6. private string msg = "Welcome to TraceFact.Net!";  
    7.  //C#异步传输字符串客户端的实现
    8. public ServerClient() {  
    9. try {  
    10. client = new TcpClient();  
    11. client.Connect("localhost", 8500);    
    12. // 与服务器连接  
    13. catch (Exception ex) {  
    14. Console.WriteLine(ex.Message);  
    15. return;  
    16. }  
    17. buffer = new byte[BufferSize];  
    18.  //C#异步传输字符串客户端的实现
    19. // 打印连接到的服务端信息  
    20. Console.WriteLine("Server Connected!{0} --> {1}",  
    21. client.Client.LocalEndPoint,  
    22.  client.Client.RemoteEndPoint);  
    23.  
    24. streamToServer = client.GetStream();  
    25. }  
    26.  
    27. // 连续发送三条消息到服务端  
    28. public void SendMessage(string msg) {  
    29.  
    30. msg = String.Format("[length={0}]{1}",  
    31.  msg.Length, msg);  
    32.  
    33. for (int i = 0; i <= 2; i++) {  
    34. byte[] temp = Encoding.Unicode.GetBytes(msg);    
    35.  // 获得缓存  
    36. try {  
    37. streamToServer.Write(temp, 0, temp.Length);   
    38. // 发往服务器  
    39. Console.WriteLine("Sent: {0}", msg);  
    40. catch (Exception ex) {  
    41. Console.WriteLine(ex.Message);  
    42. break;  
    43. }  
    44. }  
    45.  //C#异步传输字符串客户端的实现
    46. lock (streamToServer) {  
    47. AsyncCallback callBack =   
    48. new AsyncCallback(ReadComplete);  
    49. streamToServer.BeginRead(  
    50. buffer, 0, BufferSize, callBack, null);  
    51. }  
    52. }  
    53.  
    54. public void SendMessage() {  
    55. SendMessage(this.msg);  
    56. }  
    57.  
    58. // 读取完成时的回调方法  
    59. private void ReadComplete(IAsyncResult ar) {  
    60. int bytesRead;  
    61.  
    62. try {  
    63. lock (streamToServer) {  
    64. bytesRead = streamToServer.EndRead(ar);  
    65. }  
    66. if (bytesRead == 0) throw new 
    67.  Exception("读取到0字节");  
    68.  
    69. string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);  
    70. Console.WriteLine("Received: {0}", msg);  
    71. Array.Clear(buffer, 0, buffer.Length);    
    72. // 清空缓存,避免脏读  
    73.  
    74. lock (streamToServer) {  
    75. AsyncCallback callBack =   
    76. new AsyncCallback(ReadComplete);  
    77. streamToServer.BeginRead(buffer,  
    78.  0, BufferSize, callBack, null);  
    79. }  
    80. catch (Exception ex) {  
    81.  
    82. if(streamToServer!=null)  
    83. streamToServer.Dispose();  
    84. client.Close();  
    85.  
    86. Console.WriteLine(ex.Message);  
    87. }  
    88. }  //C#异步传输字符串客户端的实现
    89. }  

    在上面的SendMessage()方法中,我们让它连续发送了三条同样的消息,这么仅仅是为了测试,因为异步操作同样会出现上面说过的:服务器将客户端的请求拆开了的情况。最后我们在Main()方法中创建这个类型的实例,然后调用SendMessage()方法进行测试:

      
      
    1. class Client {  
    2. static void Main(string[] args) {  
    3. ConsoleKey key;  
    4.  
    5. ServerClient client = new ServerClient();  
    6. client.SendMessage();  
    7.  
    8. Console.WriteLine("/n/n输入/"Q/"键退出。");  
    9. do {  
    10. key = Console.ReadKey(true).Key;  
    11. while (key != ConsoleKey.Q);  
    12. }  
    13. }  

    是不是感觉很清爽?因为良好的代码重构,使得程序在复杂程度提高的情况下依然可以在一定程度上保持良好的阅读性。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值