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. streamToServer = client.GetStream();
  24. }
  25. // 连续发送三条消息到服务端
  26. public void SendMessage(string msg) {
  27. msg = String.Format("[length={0}]{1}",
  28.  msg.Length, msg);
  29. for (int i = 0; i <= 2; i++) {
  30. byte[] temp = Encoding.Unicode.GetBytes(msg);  
  31.  // 获得缓存
  32. try {
  33. streamToServer.Write(temp, 0, temp.Length); 
  34. // 发往服务器
  35. Console.WriteLine("Sent: {0}", msg);
  36. } catch (Exception ex) {
  37. Console.WriteLine(ex.Message);
  38. break;
  39. }
  40. }
  41.  //C#异步传输字符串客户端的实现
  42. lock (streamToServer) {
  43. AsyncCallback callBack = 
  44. new AsyncCallback(ReadComplete);
  45. streamToServer.BeginRead(
  46. buffer, 0, BufferSize, callBack, null);
  47. }
  48. }
  49. public void SendMessage() {
  50. SendMessage(this.msg);
  51. }
  52. // 读取完成时的回调方法
  53. private void ReadComplete(IAsyncResult ar) {
  54. int bytesRead;
  55. try {
  56. lock (streamToServer) {
  57. bytesRead = streamToServer.EndRead(ar);
  58. }
  59. if (bytesRead == 0) throw new
  60.  Exception("读取到0字节");
  61. string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
  62. Console.WriteLine("Received: {0}", msg);
  63. Array.Clear(buffer, 0, buffer.Length);  
  64. // 清空缓存,避免脏读
  65. lock (streamToServer) {
  66. AsyncCallback callBack = 
  67. new AsyncCallback(ReadComplete);
  68. streamToServer.BeginRead(buffer,
  69.  0, BufferSize, callBack, null);
  70. }
  71. } catch (Exception ex) {
  72. if(streamToServer!=null)
  73. streamToServer.Dispose();
  74. client.Close();
  75. Console.WriteLine(ex.Message);
  76. }
  77. }  //C#异步传输字符串客户端的实现
  78. }

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

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

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

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

网站栏目:C#异步传输字符串客户端的实现
转载来源:http://www.csdahua.cn/qtweb/news20/325770.html

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

广告

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