zoukankan      html  css  js  c++  java
  • 浅谈C#Socket

    好不容易把socket通信搞懂一点,比较喜欢做笔记,嘿嘿~

    希望共同学习,共同进步!

    socket通信是C#中非常基础的一个知识点,我这里用到的是基于Tcp协议的socket通信。Tcp会有三次握手连接通信.

     一、 创建服务端socket步骤:

          1.首先需要引用socket通信中所用到的名称空间;

             

    using System.Net;
    using System.Threading;
    using System.Net.Sockets;

             这三个名称空间是为socket通信打基础,没有这三个名称空间无法实现socket通信.

          2.接下来就是要创建一个socket的对象了,创建socket对象是为了方便客户端与服务端之间的通信,如果你还不明白,就请往下继续看;

    Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

             在这里面有几个知识点我要补充一下:

             socket类中的参数我做简要阐述,AddressFamily.InterNetwork简单来说就是使用内网,啥,你不知道内网是什么东东?至于内网是啥,内网就是不能上互联网的局域网;SocketType.Stream是流式的套接字类型,这种套接字类型是一种可靠且双向,基于连接的字节流,不重复数据,简单一点就是支持双向通信;ProtocolType.Tcp指的是使用基于tcp协议的通信协议。

          3.绑定IP地址和端口号;

                //将字符串类型的IP地址转换为IPAddress类型
                IPAddress ip = IPAddress.Parse("173.168.5.15");
                //标识网络地址
                EndPoint point = new IPEndPoint(ip,port);
                serverSocket.Bind(point);

     如果你想实现socket通信就必须绑定IP地址和端口号,IP地址是计算机的通信地址,端口号指向计算机中某个软件或者说是应用程序;

          4.监听客户端的连接;

    serverSocket.Listen(10);

            参数指的是监听客户端的最大数量。

          5.为连接到的客户端新建一个socket;

    Socket ListenClientSocket= serverSocket.Accept();

           这是规定,如果不新建一个socket无法通信。   

           这一步完成时客户端给服务端发送消息且客户端会连接到服务端,完成第一次握手。

          6.向客户端发送消息;

    ListenClientSocket.Send(data);

           此时服务端给客户端发送消息完成第二次握手。

          7.接受客户端消息;

                byte[] data2 = new byte[1024];
    
                int length=ListenClientSocket.Receive(data2);
                string message2=Encoding.UTF8.GetString(data2,0,length);
                Console.WriteLine("接收到客户端传来的消息:"+message2);

            服务端接收到客户端的消息完成第三次握手。

            服务端socket   完整代码如下:

     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.Threading;
     8 using System.Net.Sockets;
     9 
    10 namespace serverSocketTest2
    11 {
    12     class Program
    13     {
    14         static int port = 3500;
    15         static void Main(string[] args)
    16         {
    17             //创建一个socket的对象
    18             Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    19             //将字符串类型的IP地址转换为IPAddress类型
    20             IPAddress ip = IPAddress.Parse("173.168.5.15");
    21             //标识网络地址
    22             EndPoint point = new IPEndPoint(ip,port);
    23             serverSocket.Bind(point);
    24             //开始监听
    25             serverSocket.Listen(10);
    26             Console.WriteLine("等待客户端连接...");
    27 
    28             //为连接客户端需要新建一个线程
    29             Socket ListenClientSocket= serverSocket.Accept();//暂停当前线程,等待客户端连接之后再执行之后的语句
    30             Console.WriteLine("客户端连接成功!  真是令人振奋!");
    31             //传送的消息
    32             string message = "Hello Client!";
    33             //将字符串类型的数据转换为byte类型的数组
    34             byte[] data=Encoding.UTF8.GetBytes(message);
    35             //发送消息
    36             ListenClientSocket.Send(data);
    37 
    38             /////接受客户端数据
    39             byte[] data2 = new byte[1024];
    40 
    41             int length=ListenClientSocket.Receive(data2);
    42             string message2=Encoding.UTF8.GetString(data2,0,length);
    43             Console.WriteLine("接收到客户端传来的消息:"+message2);
    44 
    45             Console.ReadKey();
    46         }
    47     }
    48 }

         

     二、 创建客户端socket步骤如下:

           1.引用进行socket通信的名称空间;

    using System.Net;
    using System.Threading;
    using System.Net.Sockets;

           原因我不再赘述了,相信聪明的你们都懂.

           2.客户端向服务端发送连接的请求,建立客户端和服务端的连接;

    clientSocket.Connect(ip,port);

           这是第一次握手。本次握手与服务端里的第一次握手同步执行,其实这次握手也是服务端里的第一次握手。

           3.接收数据;

    clientSocket.Receive(data);

           在这里需要将客户端接收到的数据返回一个长度并存储到byte数组里。

           4.将字节型数据转换成字符串型的数据;

    string message=Encoding.UTF8.GetString(data,0,length);

           5.发送数据

    clientSocket.Send(data2);

           第二次握手连接。本次握手与服务端里的第二次握手同步执行,其实这次握手也是服务端里的第二次握手。

            客户端socket   完整代码如下:

     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.Threading;
     8 using System.Net.Sockets;
     9 
    10 namespace clientSocketTest2
    11 {
    12     class Program
    13     {
    14         static int port = 3500;
    15         static void Main(string[] args)
    16         {
    17             //新建一个socket
    18             Socket clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    19             IPAddress ip = IPAddress.Parse("173.168.5.15");
    20             
    21             //客户端向服务端发送连接的请求,建立客户端和服务端的连接
    22             clientSocket.Connect(ip,port);
    23             //存储数据,接收数据
    24             byte[] data=new byte[1024];
    25             int length=clientSocket.Receive(data);
    26             //转换为字符串型的数据
    27             string message=Encoding.UTF8.GetString(data,0,length);//0,length 表示的是发送的数据的长度
    28             Console.WriteLine("接收到来自服务端的数据:"+message);
    29 
    30             ///////   发送数据
    31             string message2 = Console.ReadLine();
    32             byte[] data2=Encoding.UTF8.GetBytes(message2);
    33             clientSocket.Send(data2);
    34 
    35             Console.ReadKey();
    36 
    37         }
    38     }
    39 }

         这是我的理解,如果有不足的地方,请指教,共同学习!希望共同进步!

  • 相关阅读:
    世界充满神秘的不平衡:创业中的“二八”法则
    树立个人品牌:从名字开始
    房子,心中的痛
    今生,谁会是我最美丽的新娘
    失败不是创业的结束,因为有了你们,这世界才璀璨(转载)
    再等五百年
    名字作诗:为您的名字增添一份色彩
    揭开爱情的外衣
    李子楠(帮客户名字作诗)
    爱上你,早已是命中注定
  • 原文地址:https://www.cnblogs.com/jc-1997/p/6187413.html
Copyright © 2011-2022 走看看