Socket创建简单服务器和客户端程序,互相发送一条消息

https://blog.csdn.net/weixin_42464466/article/details/84782870

  • AddressFamily.Internet表示IPV4地址

  • AddressFamily.InternetV6表示IPV6地址

  • SocketType.Stream-数据流 对应TCP协议传输数据

  • SocketType.gram-数据报 对应UDP协议传输数据

  • ProtocolType.TCP

  • ProtocolType.UDP

  • 节点,标明了IP地址和端口号,由于 套接字(Socket) 需要绑定在一个进程上面,通过节点(IP: port)来确定

  • 对于TCP/IP协议而言,一台计算机有 0~66535个端口(有的已被占用,自定义申请时多使用靠后的端口号)

参考:https://blog.csdn.net/tianlansedeshijie/article/details/95357734

  • IPEndPoint继承于EndPoint。IPEndPoint引用的时候参数为IP和端口。IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);

  • .net中 Bind(EndPoint localEP);方法参数是EndPoint,填入IPEndPoint会按照EndPoint参数执行。

EndPoint是IPEndPoint的基类,IPEndPoint可以强转为EndPoint。EndPoint ep = (EndPoint)iep;

  • 主要原因是IPEndPoint可以自己写入IP地址和端口。

https://www.cnblogs.com/pctzhang/archive/2012/02/02/2335324.html

  • new Socket(…).Accept()

  • new Socket(…).AcceptAsync(SocketAsyncEventArgs e)

  • new Socket(…).BeginAccept()

归并折叠其中的代码块

功能

  • 互相发送一条消息并接收

  • 暂无用户自定义消息内容功能—— Console.ReadLine()

  • 暂无多次通讯功能——线程中添加while循环或其他(异步接收方法等)

  1. // 服务器端
  2. using System;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Text;
  6. using System.Threading;
  7. namespace Demo01_SocketTest_Sever
  8. {
  9. class SeverEnd
  10. {
  11. private static Socket severSocket;
  12. static void Main(string[] args)
  13. {
  14. // 1. 建立服务器
  15. severSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
  16. // 2. 绑定进程
  17. severSocket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.105"),6666));
  18. // 3. 规定同时连接客户端数量
  19. severSocket.Listen(10);
  20. // 4. 提示服务器启动成功
  21. Console.WriteLine("服务器启动成功");
  22. // 5. 建立Accept等待连接线程(Accpet方法如果没有连接则会挂起,这里使用线程来处理)
  23. Thread severAcceptThread = new Thread(SeverAccept);// new Thread(委托)
  24. severAcceptThread.Start();
  25. // 6. 暂停主线程
  26. Console.ReadKey();
  27. }
  28. // 线程委托方法——Accept
  29. private static void SeverAccept()
  30. {
  31. // 1. 建立客户端实例
  32. Socket clientInstance = severSocket.Accept();
  33. // 2. 向客户端发送消息肯定连接成功
  34. clientInstance.Send(Encoding.Default.GetBytes("服务器发来消息:连接成功"));
  35. // 3. 建立Receive接收消息线程(Receive方法如果没有连接则会挂起,这里使用线程来处理)
  36. Thread severReceiveThread = new Thread(SeverReceive);
  37. severReceiveThread.Start(clientInstance);
  38. }
  39. // 线程委托方法——Receive
  40. private static void SeverReceive(Object clientSocket)
  41. {
  42. // 1. 构建byte数组(充当缓冲区用于存储客户端发来的消息)
  43. byte[] data = new byte[1024];
  44. // 2. 接收客户端clientSocket发来的消息,并存储至data缓冲区,且返回数据字节长度
  45. int length = (clientSocket as Socket).Receive(data);
  46. // 3. 打印输出接收到的消息(相当于处理数据)
  47. Console.WriteLine(Encoding.UTF8.GetString(data,0,length));
  48. }
  49. }
  50. }
  51. // 客户端
  52. using System;
  53. using System.Net;
  54. using System.Net.Sockets;
  55. using System.Text;
  56. using System.Threading;
  57. namespace Demo01_SocketTest_Client
  58. {
  59. class Program
  60. {
  61. private static Socket clientSocket;
  62. static void Main(string[] args)
  63. {
  64. // 1. 创建客户端Socket
  65. clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  66. // 2. 建立连接(请求,对应SeverEnd中第五步)
  67. clientSocket.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.105"),6666));
  68. // 3. 提示连接成功
  69. Console.WriteLine("连接成功");
  70. // 4. 向服务器发送消息
  71. clientSocket.Send(Encoding.UTF8.GetBytes("来自客户端:你好呀服务器!"));
  72. // 5. 建立Receive接收消息线程(接收来自服务器端的消息),Receive方法如果没有连接则会挂起,这里使用线程来处理
  73. Thread clientReceiveThread = new Thread(ClientReceive);
  74. // 6. 暂停主线程
  75. Console.ReadKey();
  76. }
  77. // 线程委托方法
  78. private static void ClientReceive()
  79. {
  80. // 1. 构建byte数组(充当缓冲区用于存储服务器端发来的消息)
  81. byte[] data = new byte[1024];
  82. // 2. 接收由服务器端发来的消息,并存储至data缓冲区,且返回消息字节长
  83. int length = clientSocket.Receive(data);
  84. // 3. 打印输出接收到的消息(相当于处理数据)
  85. Console.WriteLine(Encoding.UTF8.GetString(data,0,length));
  86. }
  87. }
  88. }

 

版权声明:本文为YuanShiRenY原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/YuanShiRenY/p/Socket_Server_Client.html