Asp.Net

9.1 Socket相关概念

IP地址

每台联网的电脑都有一个唯一的IP地址。

长度32位,分为四段,每段8位,用十进制数字表示,每段范围 0 ~ 255

特殊IP:127.0.0.1 用户本地网卡测试

版本:V4(32位) 和 V6(128位,分为8段,每段16位)

端口

在网络上有很多电脑,这些电脑一般运行了多个网络程序。每种网络程序都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的网络程序。

常用端口:21 FTP ,25 SMTP ,110 POP3 ,80 HTTP , 443 HTTPS

有两种常用Socket类型:

流式Socket(STREAM):
是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但是效率低

数据报式Socket(DATAGRAM):
是一种无连接的Socket,对应于无连接的UDP服务应用.不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但效率高.

9.1.1 Socket 流式(服务器端和客户端)

服务器端的Socket(至少需要两个)

一个负责接收客户端连接请求(但不负责与客户端通信)

每成功接收到一个客户端的连接便在服务端产生一个对应的负责通信的Socket

在接收到客户端连接时创建.

为每个连接成功的客户端请求在服务端都创建一个对应的Socket(负责和客户端通信).

客户端的Socket

客户端Socket

必须指定要连接的服务端IP地址和端口。

通过创建一个Socket对象来初始化一个到服务器端的TCP连接

9.1.2 Socket的通讯过程

服务器端

•申请一个socket

//1.创建监听套接字 使用 ip4协议,流式传输,TCP连接
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

•绑定到一个IP地址和一个端口上

//2.1 获取网络节点对象
IPAddress address = IPAddress.Parse(this.txt_IP.Text);
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txt_Port.Text));
//2.2 绑定端口(其实内部就像系统端口表中注册了一个端口,并指定了当前句柄)
socketWatch.Bind(endPoint);
//2.3 设置监听队列
socketWatch.Listen(10);

•开启侦听,等待接授连接

//2.4.开始监听 此方法会阻断当前线程。知道有其他程序连接,才能执行完毕
Socket socket = socketWatch.Accept(); //【通信套接字】注意这里,Accept返回类型Socket

客户端

•申请一个socket

•连接服务器(指明IP地址和端口号)

//1.创建监听套接字 使用 ip4协议,流式传输,TCP连接
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定端口
//2.1 获取网络节点对象
IPAddress address = IPAddress.Parse(this.txt_IP.Text);
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txt_Port.Text));
//3.向服务端发送连接请求
socketWatch.Connect(endPoint);

服务器端接到连接请求后,产生一个新的socket(端口大于1024)与客户端建立连接并进行通讯,原监听socket继续监听。

 

image

 

9.2 使用线程调用监听套接字

 

SNAGHTMLcc8de1

监听demo

 

9.3 客户端连接服务端

向服务端发送连接请求demo

 

9.4 客户端向服务端发送消息

不足点了一次发送后,再点就没反映了。

服务端

3.通信套接字 监听 客户端 消息

客户端

发送消息

 

image

 

9.5 服务端循环接收消息

解决:9.4的只能发送1次的问题

创建一个线程,还是在WathchConnection里修改

服务端循环接收消息demo

 

9.6 服务端向客户端发送消息

服务端

服务端向客户端发送消息:Server

户端

服务端向客户端发送消息:Client

无标题

image

 

问题:

1.不换行

image

image

获取真实长度

//3.2 接收客户端的消息,并存如缓存区。注意:Receive会阻断当前的线程
                 int realLength = socket2.Receive(arrMsg);
                //3.3 将接收的消息转化为字符串
                string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg,0,realLength);
原文地址:https://www.cnblogs.com/tangge/p/3779544.html