19.网络通信-套接字Socket-TCP通信-同步-服务端
19.1 知识点
回顾服务端需要做的事情
- 创建套接字Socket
- 用Bind方法将套接字与本地地址绑定
- 用Listen方法监听
- 用Accept方法等待客户端连接
- 建立连接,Accept返回新套接字
- 用Send和Receive相关方法收发数据
- 用Shutdown方法释放连接
- 关闭套接字
实现服务端基本逻辑
创建套接字Socket对象(TCP)
//1.创建套接字Socket(TCP)
Socket socketTcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
用Bind方法将套接字与本地地址绑定
//2.用Bind方法将套接字与本地地址绑定
try
{
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);//把本机作为服务端程序 IP地址传入本机
socketTcp.Bind(iPEndPoint);//绑定
}
catch (Exception e)
{
//如果IP地址不合法或者端口号被占用可能报错
Console.WriteLine("绑定报错" + e.Message);
return;
}
用Listen方法监听
//3.用Listen方法监听
socketTcp.Listen(1024);//最大接收1024个客户端
Console.WriteLine("服务端绑定监听结束,等待客户端连入");
用Accept方法等待客户端连接
建立连接,Accept返回新套接字
//5.建立连接,Accept返回新套接字
Socket socketClient = socketTcp.Accept();
//Accept是阻塞式的方法 会把主线程卡主 一定要等到客户端接入后才会继续执行后面的代码
//客户端接入后 返回新的Socket对象 这个新的Socket可以理解为客户段和服务端的通信通道
Console.WriteLine("有客户端连入了");
用Send和Receive相关方法收发数据
//6.用Send和Receive相关方法收发数据
//发送字符串转成的字节数组给客户端
socketClient.Send(Encoding.UTF8.GetBytes("欢迎连入服务端"));
//声明接受客户端信息的字节数组 声明1024容量代表能接受1kb的信息
byte[] result = new byte[1024];
//接受客户端信息 返回值为接受到的字节数
int receiveNum = socketClient.Receive(result);
//打印 远程发送信息的客户端的IP和端口 以及 发送过来的字符串
Console.WriteLine("接受到了{0}发来的消息:{1}",
socketClient.RemoteEndPoint.ToString(),
Encoding.UTF8.GetString(result, 0, receiveNum));
用Shutdown方法释放连接
//7.用Shutdown方法释放连接
//注意断开的是客户段和服务端的通信通道
socketClient.Shutdown(SocketShutdown.Both);
关闭套接字
//8.关闭套接字
//注意关闭的是客户段和服务端的通信通道
socketClient.Close();
总结
- 服务端开启的流程每次都是相同的。
- 服务端的Accept、Send、Receive是会阻塞主线程的,要等到执行完毕才会继续执行后面的内容。
抛出问题:
- 如何让服务端可以服务n个客户端?
- 我们会在之后的综合练习题进行讲解。
19.2 知识点代码
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Lesson19_网络通信_套接字Socket_TCP通信_同步_服务端
{
class Program
{
static void Main(string[] args)
{
#region 知识点一 回顾服务端需要做的事情
//1.创建套接字Socket
//2.用Bind方法将套接字与本地地址绑定
//3.用Listen方法监听
//4.用Accept方法等待客户端连接
//5.建立连接,Accept返回新套接字
//6.用Send和Receive相关方法收发数据
//7.用Shutdown方法释放连接
//8.关闭套接字
#endregion
#region 知识点二 实现服务端基本逻辑
//1.创建套接字Socket(TCP)
Socket socketTcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.用Bind方法将套接字与本地地址绑定
try
{
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);//把本机作为服务端程序 IP地址传入本机
socketTcp.Bind(iPEndPoint);//绑定
}
catch (Exception e)
{
//如果IP地址不合法或者端口号被占用可能报错
Console.WriteLine("绑定报错" + e.Message);
return;
}
//3.用Listen方法监听
socketTcp.Listen(1024);//最大接收1024个客户端
Console.WriteLine("服务端绑定监听结束,等待客户端连入");
//4.用Accept方法等待客户端连接
//5.建立连接,Accept返回新套接字
Socket socketClient = socketTcp.Accept();
//Accept是阻塞式的方法 会把主线程卡主 一定要等到客户端接入后才会继续执行后面的代码
//客户端接入后 返回新的Socket对象 这个新的Socket可以理解为客户段和服务端的通信通道
Console.WriteLine("有客户端连入了");
//6.用Send和Receive相关方法收发数据
//发送字符串转成的字节数组给客户端
socketClient.Send(Encoding.UTF8.GetBytes("欢迎连入服务端"));
//声明接受客户端信息的字节数组 声明1024容量代表能接受1kb的信息
byte[] result = new byte[1024];
//接受客户端信息 返回值为接受到的字节数
int receiveNum = socketClient.Receive(result);
//打印 远程发送信息的客户端的IP和端口 以及 发送过来的字符串
Console.WriteLine("接受到了{0}发来的消息:{1}",
socketClient.RemoteEndPoint.ToString(),
Encoding.UTF8.GetString(result, 0, receiveNum));
//7.用Shutdown方法释放连接
//注意断开的是客户段和服务端的通信通道
socketClient.Shutdown(SocketShutdown.Both);
//8.关闭套接字
//注意关闭的是客户段和服务端的通信通道
socketClient.Close();
#endregion
#region 总结
//1.服务端开启的流程每次都是相同的
//2.服务端的 Accept、Send、Receive是会阻塞主线程的,要等到执行完毕才会继续执行后面的内容
//抛出问题:
//如何让服务端可以服务n个客户端?
//我们会在之后的综合练习题进行讲解
#endregion
Console.WriteLine("按任意键退出");
Console.ReadKey();
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com