首页 > 代码库 > C# Socket学习笔记一
C# Socket学习笔记一
小记:刚接触网络编程觉得网络是个神奇的东西,所以对它就很有兴趣,想了解下网络是如何进行进行数据传输的,那么开始第一天的学习吧!ReadyGo!!!
首先我们要了解一下几点内容:
- 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 TcpServer10 {11 class Program12 {13 static void Main(string[] args)14 {15 //确定端口号16 int port = 6000;17 18 //设定连接IP19 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 //将接收到的字节抓获年华为string54 //参数一:字节数组 参数二:起始索引 参数三:总长度55 recStr += Encoding.ASCII.GetString(recbyte, 0, bytes);56 57 Console.WriteLine("服务器接收到客户端的信息:" + recStr + " " + DateTime.Now.ToString()+"\n\n");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 TcpClient10 {11 class Program12 {13 static int port = 6000; //监听端口号14 static string host = "127.0.0.1"; //连接服务端IP15 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);//建立客户端Socket18 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 }
下面是运行结果:
我们试一下是否可以对多个客户端进行回应:
测试发现是可以同时回应多个客户端的,一起努力,下节咱们学习异步加载数据!
C# Socket学习笔记一