当前位置:Gxlcms > asp.net > C#利用服务器实现客户端之间通信

C#利用服务器实现客户端之间通信

时间:2021-07-01 10:21:17 帮助过:9人阅读

先来讲述下我自己对于整个Socket通信过程的理解,毕竟初学,说错见谅,知道错了会改正~ 

首先在服务端新建一个serverSocket,对其进行初始化(一般包含AddressFamily:IP地址类型,SocketType:Socket传输数据方式,ProtoType:传输协议); 

接着我们要设置server端要绑定的IP:port;然后开始监听,并设置最多同时监听多少个Client.

这时,服务端就在等待状态,直到某一个Client连接到这个ip:port上,这时serverSocket.Accept()工作,获得这个连接。(此时的连接是有地址信息的哦!记得保存) 

获得连接之后,server就可以和这个Client进行通信了,当加入第二个Client(我们称其为ClientB)时,Server接收到ClientB的消息,可以将这个消息转发给前一个Client(我们称其为ClientA),当受到ClientA的消息,也可以转发给ClientB。这样就实现了Clients之间的通信了。(重点在保存连接信息!!)

那么现在贴上代码讲解:

Server端代码 

  1. namespace SocketServer
  2. {
  3. class Program
  4. {
  5. private static byte[] result = new byte[1024];
  6. static Socket serverSocket;
  7. private static string client;
  8. private static Socket clientSocket;
  9. //我这里存了两个Client,因为自己电脑开了两个Client,不会有多的
  10. //理论上应该开一个Socket[]来保存信息,最好用一个二元组将client的信息和连接绑定起来
  11. //这样就可以实现断开连接后下次登陆还是可以识别是这个Client
  12. private static Socket clientSocketA=null;
  13. private static Socket clientSocketB=null;
  14. static void Main(string[] args)
  15. {
  16. Program.SetPort(8885);
  17. }
  18. private static void SetPort(int port)
  19. {
  20. IPAddress ip = IPAddress.Parse("127.0.0.1");//set ip
  21. serverSocket = new Socket(AddressFamily.InterNetwork,
  22. SocketType.Stream, ProtocolType.Tcp);//initialize
  23. serverSocket.Bind(new IPEndPoint(ip, port));//bind
  24. serverSocket.Listen(10);
  25. //进入监听状态
  26. Console.WriteLine("监听{0}成功", serverSocket.LocalEndPoint.ToString());
  27. //开启一个线程来监听客户端连接
  28. Thread myThread = new Thread(ListenClientConnect);
  29. myThread.Start();
  30. Console.ReadLine();
  31. }
  32. /// <summary>
  33. /// 监听客户端连接
  34. /// </summary>
  35. private static void ListenClientConnect()
  36. {
  37. while (true)
  38. {
  39. //Client连接上后 得到这个连接
  40. clientSocket = serverSocket.Accept();
  41. //这里我因为只有两个Client,所以就简单写了
  42. if (clientSocketA == null)
  43. {
  44. clientSocketA = clientSocket;
  45. }
  46. else if (clientSocketB == null)
  47. {
  48. clientSocketB = clientSocket;
  49. }
  50. else
  51. {
  52. //当其中一个断开了,又重新连接时,需要再次保存连接
  53. if (clientSocketB.IsBound)
  54. {
  55. clientSocketA = clientSocketB;
  56. clientSocketB = clientSocket;
  57. }
  58. else
  59. {
  60. clientSocketB = clientSocketA;
  61. clientSocketA = clientSocket;
  62. }
  63. }
  64. clientSocket.Send(Encoding.ASCII.GetBytes("say hello"));
  65. //开个线程接收Client信息
  66. Thread receivedThread = new Thread(ReceiveMessage);
  67. receivedThread.Start(clientSocket);
  68. }
  69. }
  70. private static void ReceiveMessage(object clientSocket)
  71. {
  72. Socket myClientSocket = (Socket) clientSocket;
  73. while (true)
  74. {
  75. try
  76. {
  77. int revceiveNumber = myClientSocket.Receive(result);
  78. //Console.WriteLine("接受客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString()
  79. // , Encoding.ASCII.GetString(result, 0, revceiveNumber));
  80. Console.WriteLine(Encoding.ASCII.GetString(result, 0, revceiveNumber));
  81. if (myClientSocket == clientSocketA)
  82. {
  83. Console.WriteLine("receive from A");
  84. if (clientSocketB!=null&&clientSocketB.IsBound)
  85. {
  86. Console.WriteLine("a IS BOUND");
  87. clientSocketB.Send(result, 0, revceiveNumber, SocketFlags.None);
  88. }
  89. else
  90. {
  91. myClientSocket.Send(Encoding.ASCII.GetBytes("the people is not online! Send Failed!"));
  92. Console.WriteLine("对方不在线上,发送失败!");
  93. }
  94. }
  95. else
  96. {
  97. Console.WriteLine("receive from B");
  98. if (clientSocketA != null && clientSocketA.IsBound)
  99. {
  100. Console.WriteLine("a IS BOUND");
  101. clientSocketA.Send(result, 0, revceiveNumber, SocketFlags.None);
  102. }
  103. else
  104. {
  105. myClientSocket.Send(Encoding.ASCII.GetBytes("the people is not online! Send Failed!"));
  106. Console.WriteLine("对方不在线上,发送失败!");
  107. }
  108. }
  109. }
  110. catch(Exception ex)
  111. {
  112. Console.WriteLine(ex.Message);
  113. myClientSocket.Shutdown(SocketShutdown.Both);
  114. myClientSocket.Close();
  115. break;
  116. }
  117. }
  118. }
  119. }
  120. }

Client端代码(因为都差不多 就只贴一个了) 

  1. namespace SocketClient
  2. {
  3. class Program
  4. {
  5. private static byte[] result = new byte[1024];
  6. private static Socket clientSocket;
  7. private static void ListenServer()
  8. {
  9. while (true)
  10. {
  11. result = new byte[1024];
  12. int receiveLength = clientSocket.Receive(result);
  13. Console.WriteLine("{0}", Encoding.ASCII.GetString(result, 0, receiveLength));
  14. }
  15. }
  16. static void Main(string[] args)
  17. {
  18. IPAddress ip = IPAddress.Parse("127.0.0.1");
  19. clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  20. try
  21. {
  22. clientSocket.Connect(ip, 8885);
  23. Console.WriteLine("连接成功!");
  24. }
  25. catch (Exception e)
  26. {
  27. Console.WriteLine("连接失败!");
  28. return;
  29. }
  30. Thread threadRead = new Thread(ListenServer);
  31. threadRead.Start();
  32. while(true)
  33. {
  34. try
  35. {
  36. Thread.Sleep(1000);
  37. string sendMessage = Console.ReadLine();
  38. clientSocket.Send(Encoding.ASCII.GetBytes("Sylvia:"+sendMessage));
  39. }
  40. catch (Exception ex)
  41. {
  42. clientSocket.Shutdown(SocketShutdown.Both);
  43. clientSocket.Close();
  44. break;
  45. }
  46. }
  47. Console.WriteLine("发送完毕 按回车退出");
  48. Console.ReadKey();
  49. }
  50. }
  51. }

写的时候要特别注意一下Send信息的时候,注意byte[]的传输大小,很容易变成byte[]数组的大小而不是内容的大小。 

这个大家就自己尝试吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

人气教程排行