Socket基础二
1:什么是Socket?
Socket又被称之为"套接字",是计算机之间通信的一种约定或者方式,通过这种约定,计算机之间可以相互发送数据。
2:本质是什么?
实际上是对TCP/IP协议的封装,它的出现方便了程序员使用TCP/IP协议栈,本身不是协议。可以看做是传输层和应用层之间抽象出来的一层,是一组调用接口(TCP/IP网络的API函数)
3 步骤
服务器端程序编写的程序步骤:
第一:首先肯定是要先创建一个Socket套接字。
第二:客户端想要连接到服务器上,必须要知道IP地址和端口号,根据端口号才能找到服务器上具体是哪个应用程序。使用Bind()方法来绑定IP和端口号(服务器端的端口号就是服务器端的应用程序所使用的的端口号,和客户端没关系)。一定要注意将服务器端的IP和端口进行绑定,否则客户端根据IP和端口申请连接的时候会失败。
第三:准备工作做好之后就要开始监听,看看有哪些客户端设备来连接服务器,通过Listen方法建立一个监听序列,存在待处理的客户连接。这个地方一定要搞清楚一件事,就是在监听的时候必须设置一个时间点内最多能连接的数量,比如类似游戏登录的时候同一时间那么多设备请求,不可能同时对所有的请求都进行回应,必须设置一个回应请求的最大上限,超过这个数量就排队进行等待。比如网吧中有10台电脑最多容纳10个人连接网络玩游戏,但是这个网吧并不是只能容纳10个人,超过10个人之后需要你站在旁边等着,有人用完之后你才能用。
第四:监听工作准备好之后就要开始处理监听序列中的客户连接信息了,通过accept方法实现。
第五:建立连接之后,通过receive和send来进行接收发送信息。
第六:关闭连接
代码:
/// <summary> /// 简单Socket服务端 /// </summary> public class SimpleSocketServer { public static void Proccess() { int port = 2018; string host = "127.0.0.1"; IPAddress ip = IPAddress.Parse(host); IPEndPoint ipe = new IPEndPoint(ip, port); Socket sSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sSocket.Bind(ipe); sSocket.Listen(0); Console.WriteLine("监听已经打开,请等待"); //收到消息 接受一个socket链接 Socket serverSocket = sSocket.Accept(); Console.WriteLine("连接已经建立。。。"); while (true) { string recStr = ""; byte[] recByte = new byte[4096]; int bytes = serverSocket.Receive(recByte, recByte.Length, 0); recStr += Encoding.ASCII.GetString(recByte, 0, bytes); Console.WriteLine("服务器端获得信息:{0}", recStr); if (recStr.Equals("stop")) { serverSocket.Close();//关闭该socket对象 Console.WriteLine("关闭链接。。。。"); break; } //回发消息 Console.WriteLine("请输入回发消息。。。。"); string sendStr = Console.ReadLine(); //"send to client :hello world"; byte[] sendByte = Encoding.ASCII.GetBytes(sendStr); serverSocket.Send(sendByte, sendByte.Length, 0); } sSocket.Close();//关闭server监听 } }
客户端步骤:
第一:也是要创建Socket套接字,这是最基础的准备工作。
第二:此时客户端需要主动申请服务器的连接,通过connect方法实现,一定要写对服务器的IP和端口号。
第三:申请成功之后,通过receive和send来进行通信。
第四:close()关闭连接。
代码实现:
/// <summary> /// 发起socket请求 /// 常使用的其实是Http请求; 单向,客户端===服务器 请求响应式; /// socket==套接字,长链接、双工通信,可以让客户单和服务器之间相互发送消息; /// </summary> class Program { static void Main(string[] args) { try { Console.WriteLine("启动一个Socket客户端链接"); int port = 2018; string host = "127.0.0.1";//服务器端ip地址 IPAddress ip = IPAddress.Parse(host); IPEndPoint ipe = new IPEndPoint(ip, port); //注意这里: ProtocolType.Tcp表明是TCP连接,可以改成UDP连接: ProtocolType.Udp Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(ipe); //开启链接以后,是长链接; 因为没有关闭,close方法在while(true)方法体之外, 一直保持连接, while (true) { Console.WriteLine("请输入发送到服务器的信息:"); string sendStr = Console.ReadLine(); if (sendStr == "exit") break; byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr); clientSocket.Send(sendBytes); //receive message string recStr = ""; byte[] recBytes = new byte[4096]; //监控传递过来的消息; int bytes = clientSocket.Receive(recBytes, recBytes.Length, 0); recStr += Encoding.ASCII.GetString(recBytes, 0, bytes); Console.WriteLine($"服务器返回:{recStr}"); } clientSocket.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } }