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#异步传输字符串有所帮助。

【编辑推荐】

  1. 浅析C#中异步和多线程的区别
  2. C# Socket通信三大问题详解
  3. C#异步调用四大方法详解
  4. C#网络编程消息发送问题浅析
  5. C#异步传输字符串服务端的实现
责任编辑:仲衡 来源: 博客园
相关推荐

2009-08-21 16:37:54

C#客户端程序

2009-08-21 14:25:23

C#异步传输字符串

2009-08-21 16:27:44

C#服务端程序

2009-08-21 15:54:40

服务端与客户端

2009-08-21 15:36:41

服务端与客户端

2009-08-06 17:12:13

C# WebServi

2009-08-21 17:53:25

C#网络编程客户端程序

2009-08-11 10:26:49

C#算法C#字符串反转

2020-03-19 08:00:00

客户端KubernetesAPI

2011-04-07 09:33:01

Activex

2009-08-21 16:14:52

服务端与客户端通信

2009-08-21 15:59:22

服务端与客户端通信

2009-09-02 16:21:20

C#字符串

2011-08-25 10:37:15

leveldb的访问封C#客户端源码

2009-08-07 14:22:56

C#字符串搜索

2009-08-07 14:34:33

C#模式字符串

2009-08-07 13:50:11

C#字符串

2009-08-26 13:24:54

C#字符串

2009-08-07 14:15:21

C#字符串分割

2009-08-24 13:04:44

操作步骤C#字符串
点赞
收藏

51CTO技术栈公众号