• C# Socket学习笔记一


    首先我们要了解一下几点内容:

     
    1、网络中进程之间如何通信?
    2、Socket是什么?
    3、socket的基本操作
    3.1、socket()函数
    3.2、bind()函数
    3.3、listen()、connect()函数
    3.4、accept()函数
    3.5、read()、write()函数等
    3.6、close()函数
    4、socket中TCP的三次握手建立连接详解
    5、socket中TCP的四次握手释放连接详解
    6、一个例子
    现阶段socket通信使用TCP、UDP协议,相对应UDP来说,TCP则是比较安全稳定的协议了。本文只涉及到TCP协议来说socket通信。首先讲述TCP/IP的三次握手,在握手基础上延伸socket通信的基本过程。
     
    下面介绍对于应届生毕业面试来说是非常熟悉的,同时也是最臭名昭著的三次握手:
     
    1 客户端发送syn报文到服务器端,并置发送序号为x。
     
    2 服务器端接收到客户端发送的请求报文,然后向客户端发送syn报文,并且发送确认序号x+1,并置发送序号为y。
     
    3 客户端受到服务器发送确认报文后,发送确认信号y+1,并置发送序号为z。至此客户端和服务器端建立连接。
     
     
     
    在此基础上,socket连接过程:
     
    服务器监听:服务器端socket并不定位具体的客户端socket,而是处于等待监听状态,实时监控网络状态。
     
    客户端请求:客户端clientSocket发送连接请求,目标是服务器的serverSocket。为此,clientSocket必须知道serverSocket的地址和端口号,进行扫描发出连接请求。
     
    连接确认:当服务器socket监听到或者是受到客户端socket的连接请求时,服务器就响应客户端的请求,建议一个新的socket,把服务器socket发送给客户端,一旦客户端确认连接,则连接建立。
     
    注:在连接确认阶段:服务器socket即使在和一个客户端socket建立连接后,还在处于监听状态,仍然可以接收到其他客户端的连接请求,这也是一对多产生的原因。
     
    下图简单说明连接过程:
     
     
     
    下面开始进行代码分析了:
     
    服务器端:TcpServer.cs
     
    复制代码
     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 TcpServer
    10 {
    11     class Program
    12     {
    13         static void Main(string[] args)
    14         {
    15             //确定端口号
    16             int port = 6000;
    17 
    18             //设定连接IP
    19             string host = "127.0.0.1";
    20 
    21             //将IP地址字符串转化为IP地址实例
    22             IPAddress ip = IPAddress.Parse(host);
    23 
    24             //将网络端点表示为 IP 地址和端口号
    25             IPEndPoint ipe = new IPEndPoint(ip, port);
    26 
    27             //建立Socket 
    28             //addressFamily 参数指定 Socket 类使用的寻址方案
    29             //socketType 参数指定 Socket 类的类型
    30             //protocolType 参数指定 Socket 使用的协议。 
    31             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    32 
    33             //socket与本地终结点建立关联
    34             socket.Bind(ipe);
    35             while (true)
    36             {
    37                 //开始监听端口
    38                 socket.Listen(0);
    39 
    40                 Console.WriteLine("服务已开启,请等待....."+ DateTime.Now.ToString());
    41 
    42                 //为新建的连接建立新的Socket目的为客户端将要建立连接
    43                 Socket serverSocket = socket.Accept();
    44                 Console.WriteLine("连接已建立......" + DateTime.Now.ToString());
    45 
    46                 string recStr =string.Empty;
    47                 //定义缓冲区用于接收客户端的数据
    48                 byte[] recbyte = new byte[1024];
    49 
    50                 //返回接收到的字节数
    51                 int bytes = serverSocket.Receive(recbyte, recbyte.Length, 0);
    52 
    53                 //将接收到的字节抓获年华为string
    54                 //参数一:字节数组 参数二:起始索引 参数三:总长度
    55                 recStr += Encoding.ASCII.GetString(recbyte, 0, bytes);
    56 
    57                 Console.WriteLine("服务器接收到客户端的信息:" + recStr + " " + DateTime.Now.ToString()+" ");
    58 
    59 
    60                 //服务端给客户端回送消息
    61                 string strSend = "Hello Client!";
    62                 byte[] sendByte = new byte[1024];
    63                 //将发送的字符串转换为byte[]
    64                 sendByte = Encoding.ASCII.GetBytes(strSend);
    65 
    66                 //服务端发送数据
    67                 serverSocket.Send(sendByte, sendByte.Length, 0);
    68 
    69                 serverSocket.Close();
    70             }
    71         }
    72 }
    复制代码
     
     
    客户端的代码:
     
    复制代码
     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 TcpClient
    10 {
    11     class Program
    12     {
    13         static int port = 6000;                          //监听端口号
    14         static string host = "127.0.0.1";                //连接服务端IP
    15         static IPAddress ip = IPAddress.Parse(host);     //将IP地址转换为IP实例
    16         static IPEndPoint ipe = new IPEndPoint(ip, port);//将网络端点表示为 IP 地址和端口号
    17         static Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立客户端Socket
    18        
    19         static void Main(string[] args)
    20         {
    21 
    22             clientSocket.Connect(ipe);                   //客户端开始连接服务端
    23 
    24 
    25             string sendStr = "Hello,Server!";            //向服务器发送消息
    26             byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
    27             clientSocket.Send(sendBytes);
    28 
    29 
    30             string revStr = "";                          //接收来自服务器的消息
    31             byte[] revBytes = new byte[4096];
    32             int bytes = clientSocket.Receive(revBytes, revBytes.Length, 0);
    33 
    34             revStr += Encoding.ASCII.GetString(revBytes, 0, bytes);
    35             Console.WriteLine("来自服务端的回应:{0}",revStr);
    36 
    37             clientSocket.Close();
    38         }
    39     }
    40 }
  • 相关阅读:
    shell 脚本实现yum安装 LAMP 架构的 wordpress
    redis主从及哨兵和cluster集群
    扫描网段中服务器显示状态
    利用for循环输出九九乘法表
    正则表达式取文件后缀
    利用正则表达式实现yes/no判断
    判断输入的IP地址是否合法
    Shell脚本编程基础之shell脚本条件测试命令
    Shell脚本编程基础之shell脚本逻辑运算
    Shell脚本编程基础之shell脚本算术运算
  • 原文地址:https://www.cnblogs.com/gc2013/p/4108113.html
Copyright © 2020-2023  润新知