首页 > 编程 > C# > 正文

C#中Socket通信用法实例详解

2019-10-29 21:38:19
字体:大 中 小
来源:转载
供稿:网友

这篇文章主要介绍了C#中Socket通信用法,以实例形式较为详细的分析了UDP及TCP两种通信方式的具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了C#中Socket通信用法。分享给大家供大家参考。具体如下:

一、UDP方式:

服务器端代码:

 

 
  1. static void Main(string[] args) 
  2. { 
  3. int recv; 
  4. byte[] data = new byte[1024]; 
  5. IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//定义一网络端点 
  6. Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//定义一个Socket 
  7. newsock.Bind(ipep);//Socket与本地的一个终结点相关联 
  8. Console.WriteLine("Waiting for a client.."); 
  9. IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//定义要发送的计算机的地址 
  10. EndPoint Remote = (EndPoint)(sender);// 
  11. recv = newsock.ReceiveFrom(data, ref Remote);//接受数据  
  12. Console.WriteLine("Message received from{0}:", Remote.ToString()); 
  13. Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 
  14. string welcome = "Welcome to my test server!"; 
  15. data = Encoding.ASCII.GetBytes(welcome); 
  16. newsock.SendTo(data, data.Length, SocketFlags.None, Remote); 
  17. while (true) 
  18. { 
  19. data = new byte[1024]; 
  20. recv = newsock.ReceiveFrom(data, ref Remote); 
  21. Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 
  22. newsock.SendTo(data, recv, SocketFlags.None, Remote); 
  23. } 
  24. } 

客户端代码:

 

 
  1. void MainInfo() 
  2. { 
  3. byte[] data = new byte[1024];//定义一个数组用来做数据的缓冲区 
  4. string input, stringData; 
  5. IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.1.21"), 9050); 
  6. Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
  7. string welcome = "Hello,are you there?"; 
  8. data = Encoding.ASCII.GetBytes(welcome); 
  9. server.SendTo(data, data.Length, SocketFlags.None, ipep);//将数据发送到指定的终结点 
  10. IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
  11. EndPoint Remote = (EndPoint)sender; 
  12. data = new byte[1024]; 
  13. int recv = server.ReceiveFrom(data, ref Remote);//接受来自服务器的数据 
  14. Console.WriteLine("Message received from{0}:", Remote.ToString()); 
  15. Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 
  16. while (true)//读取数据 
  17. { 
  18. input = richTextBox1.Text;//从键盘读取数据 
  19. if (input == "text")//结束标记 
  20. { 
  21. break; 
  22. } 
  23. server.SendTo(Encoding.ASCII.GetBytes(input), Remote);//将数据发送到指定的终结点Remote 
  24. data = new byte[1024]; 
  25. recv = server.ReceiveFrom(data, ref Remote);//从Remote接受数据 
  26. stringData = Encoding.ASCII.GetString(data, 0, recv); 
  27. Console.WriteLine(stringData); 
  28. } 
  29. Console.WriteLine("Stopping client"); 
  30. server.Close(); 
  31. } 

二、TCP方式:

服务器端代码:

 

 
  1. Socket serverSocket = null; 
  2. Thread clientThread = null; 
  3. Socket clientSocket = null; 
  4. Thread thread = null; 
  5. IPAddress ips = null; 
  6. PEndPoint ipep = null; 
  7. void ServerStart() 
  8. { 
  9. ips = Dns.GetHostAddresses(Dns.GetHostName())[0]; 
  10. //创建IPEndPoint实例  
  11. ipep = new IPEndPoint(ips, 9050); 
  12. //创建一个套接字  
  13. serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
  14. serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
  15. //将所创建的套接字与IPEndPoint绑定  
  16. serverSocket.Bind(ipep); 
  17. //设置套接字为收听模式  
  18. serverSocket.Listen(20); 
  19. while (listenalive) 
  20. { 
  21. try 
  22. { 
  23. //在套接字上接收接入的连接  
  24. clientSocket = serverSocket.Accept(); 
  25. clientThread = new Thread(new ParameterizedThreadStart(ReceiveData)); 
  26. clientThread.Start(clientSocket); 
  27. } 
  28. catch (Exception ex) 
  29. { 
  30. WriteErrorLog(ex.Message); 
  31. serverSocket.Close(); 
  32. serverSocket = null; 
  33. } 
  34. } 
  35. } 
  36. static void ReceiveData(object obj) 
  37. { 
  38. bool keepalive = true; 
  39. Socket s = obj as Socket; 
  40. Byte[] buffer = new Byte[1024]; 
  41. //根据收听到的客户端套接字向客户端发送信息  
  42. IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint; 
  43. Console.WriteLine("客户端ip:" + clientep.Address + " 端口:" + clientep.Port); 
  44. string welcome = "连接服务器成功"; 
  45. buffer = System.Text.Encoding.Unicode.GetBytes(welcome); 
  46. //向客户端发送“连接服务器成功”消息 
  47. s.Send(buffer, buffer.Length, SocketFlags.None); 
  48. buffer = new Byte[1024]; 
  49. int bufLen = 0; 
  50. string content = string.Empty; 
  51. while (true) 
  52. { 
  53. //在套接字上接收客户端发送的信息  
  54. bufLen = 0; 
  55. try 
  56. { 
  57. bufLen = s.Receive(buffer); 
  58. if (bufLen == 0) 
  59. { 
  60. break; 
  61. } 
  62. content += System.Text.Encoding.Unicode.GetString(buffer, 0, bufLen); 
  63. } 
  64. catch (Exception ex) 
  65. { 
  66. break; ; 
  67. } 
  68. } 
  69. Send(s, content); 
  70. s = null; 
  71. buffer = null; 
  72. clientep = null; 
  73. Thread.CurrentThread.Abort(); 
  74. } 

客户端代码:

 

 
  1. void Send(string content) 
  2. { 
  3. byte[] data = new byte[1024]; 
  4. newclient = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); 
  5. ie = new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ipadd), port);//服务器的IP和端口 
  6. try 
  7. { 
  8. //因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。 
  9. newclient.Connect(ie); 
  10. } 
  11. catch (System.Net.Sockets.SocketException e) 
  12. { 
  13. Console.WriteLine(e.ToString()); 
  14. return; 
  15. } 
  16. int recv = newclient.Receive(data); 
  17. //连接服务器成功 
  18. string stringdata = System.Text.Encoding.Unicode.GetString(data, 0, recv); 
  19. if (stringdata == "连接服务器成功") 
  20. { 
  21. newclient.Send(System.Text.Encoding.Unicode.GetBytes(content)); 
  22. newclient.Shutdown(System.Net.Sockets.SocketShutdown.Send); 
  23. data = new byte[1024]; 
  24. recv = newclient.Receive(data); 
  25. string result = System.Text.Encoding.Unicode.GetString(data, 0, recv);  
  26. newclient.Shutdown(System.Net.Sockets.SocketShutdown.Receive); 
  27. newclient.Close(); 
  28. MessageBox.Show(result); 
  29. } 
  30. else 
  31. { 
  32. MessageBox.Show("连接服务器失败", "友情提示"); 
  33. } 
  34. } 

希望本文所述对大家的C#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表