经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
c#socket TCP同步网络通信
来源:cnblogs  作者:小白成长之路&  时间:2018/12/10 9:50:58  对本文有异议

一、socket简介

  socket就是套接字,它是引用网络连接的特殊文件描述符,由三个基本要素组成:

    1: AddressFamily(网络类型)

    2: SocketType(数据传输类型)

    3:ProtocolType(采用的网络协议)

  下面是可用于IP通信的套接字组合及其常用的属性和方法

 

二、socket与网络通信 

  IP连接领域有两种通信类型:面向连接的和无连接的,这里我要讲的是面向连接的,使用TCP协议来建立两个IP的值端点之间的会话,下面是它的基本步骤。

    a:建立一个套接字

    b:绑定本机的IP和端口

    c:使用listen()方法监听别人发过来的东西

    d:如果监听到连接,则可以使用Send/Receive来执行操作

    e:完成后使用Close()方法进行关闭

  工作原理如图所示:

  

 

三、一个简单的同步通信示例

  1.服务器端

  1. using System.Text;
  2. using System.Threading.Tasks;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Threading;
  6.  
  7. namespace socket服务端
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. int port = 23456;//端口号
  14. int recv;//记录客户端信息的长度
  15. string address = "127.0.0.1";//IP地址,指向localhost主机名,常用于程序调试
  16. IPAddress addr = IPAddress.Parse(address);
  17. IPEndPoint ipe = new IPEndPoint(addr, port);
  18. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  19. socket.Bind(ipe);//绑定端口
  20. socket.Listen(0);//开始监听,0表示任意数量
  21. Console.WriteLine("已启动监听,等待客户端连接。");
  22. Socket clientSocket = socket.Accept();
  23. IPEndPoint clientIp = (IPEndPoint)clientSocket.RemoteEndPoint;//获取远程终结点信息
  24. if (clientSocket != null)
  25. Console.WriteLine("成功与{0}的客户端建立联系",clientIp);
  26. while (true)//用死循环不断执行
  27. {
  28. try
  29. {
  30. byte[] data = new byte[1024];
  31. recv = clientSocket.Receive(data);//获取客户端传过来的信息
  32. if (recv == 0)
  33. break;
  34. Console.WriteLine("客户端发来信息:{0}",Encoding.ASCII.GetString(data, 0, recv));
  35. Console.Write("输入要发送的信息:");
  36. String input = Console.ReadLine();
  37. clientSocket.Send(Encoding.ASCII.GetBytes(input));
  38. }
  39. catch(Exception ex)
  40. {
  41. Console.WriteLine("ERROR:{0}", ex.Message);
  42. }
  43. }
  44. Console.WriteLine("断开连接");
  45. clientSocket.Close();
  46. socket.Close();
  47. }
  48. }
  49. }

 

  2.客户端

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Net;
  7. using System.Net.Sockets;
  8.  
  9. namespace socket客户端
  10. {
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. int port = 23456;
  16. string address = "127.0.0.1";
  17. byte[] data = new byte[1024];
  18. IPAddress addr = IPAddress.Parse(address);
  19. IPEndPoint ipe = new IPEndPoint(addr, port);
  20. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  21. socket.Connect(ipe);
  22. Console.WriteLine("与服务器连接成功");
  23.  
  24. try
  25. {
  26. while (true)
  27. {
  28. Console.Write("输入信息内容:");
  29. string input = Console.ReadLine();
  30. if (input == "exit")
  31. break;
  32. socket.Send(Encoding.ASCII.GetBytes(input));//发送数据
  33. data = new byte[1024];
  34. int recv;
  35. string strData;
  36. recv = socket.Receive(data);
  37. strData = Encoding.ASCII.GetString(data, 0, recv);
  38. Console.WriteLine("服务器发来内容:{0}",strData);
  39. }
  40. }
  41. catch (SocketException ex)
  42. {
  43. Console.WriteLine(ex.ToString());
  44. }
  45. Console.WriteLine("断开连接...");
  46. socket.Shutdown(SocketShutdown.Both);
  47. socket.Close();
  48. Console.ReadKey();
  49. }
  50. }
  51. }

   接下来对上面一些内容进行解释

    a.端口号:32位无符号整形,范围是0~65535,0~1023被系统进程和通信协议使用,1024~49251是用户可以使用的端口

    b.IPAddress类: 该类有一个Parse()方法,可以把点分的十进制IP转化为IPAdress类, 它还有四个可读字段

           Any:用于代表本地系统可用的任何IP地址

           Broadcase:用于代表本地网络的IP广播地址

           Loopback:用于代表本地系统的回送地址

           None:用于代表本地系统上没有网络接口

    c.IPEndPoint是一个端口和IP地址的绑定,可以代表一个服务,用来Socket通信,可以通过两种方法构造

           IPEndPoint( long address, int pot);

          IPEndPoint( IPAddress address, int pot)'

    d. Accept 以同步方式从侦听套接字,在连接请求队列中提取第一个挂起的连接请求,然后创建并返回一个新Socket。 不能使用此返回Socket为接受任何其他连接的连接队列。 但是,可以调用RemoteEndPoint方法所返回的Socket来标识远程主机的网络地址和端口号。

    e.Receive()从绑定的 Socket套接字接收数据,将数据存入接收缓冲区。

 

注:同步通信每发完一个数据包后,需要等待接收方响应后再继续发送下一个数据包

       运行时先启动服务器端,再启动客户端

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号