网络编程(通信)
Socket(套接字)通信(有IP的)
Searial(串口)通信
运动控制卡
Socket通信
网络
网络是由若干个节点和链接这些节点的链路构成的,表示的是诸多对象及其相互联系的一种关系
作用
-
可以让多台计算机产生相互连接
-
可以实现资源的一种共享
-
可以实现数据交换
IP地址
为什么想要IP地址?
两台计算机如果想要交互或通信 ,双方都必须拥有地址-->IP地址
介绍
IP:Internet Protocol网络协议
唯一标识网络上每一台计算机的地址
IP地址的组成:
192.168.212.16
32位,由四个八位二进制数组成,中间用"."分割
原因:二进制地址不容易记忆
IP地址=网络地址+主机地址
网络地址:标示计算机或者网络设备所在的网段
主机地址:标识特定主机或者网络设备
IP地址的配置和检测
1.控制面板---网络和internet---网络链接---找到网络设备---属性----ipv4属性里进行配置
如何查看IP地址:
管理员控制台---ipconfig /all
测试网络是否通畅:
ping目标地址
DNS域名解析服务器
当进入到一个网站的时候,为什么在浏览器的地址栏当中输入域名,而不是输入的lp地址?
因为域名比IP地址好记,另外我们本地网络配置的有域名解析服务器
DNS:Domain Name System 域名服务器
网络服务器
通常情况下是指:在网络环境当中具有较高的计算能力,能够提供用户特殊服务功能的计算机
邮件服务器:收发邮件stmp腾讯网易微软谷歌
Web服务器:让本地的服务共享到网络当中 Tomcat Apache.....
网络通信协议
OSI七层网络模型
OSI: Open System Interconnection
OSI将网络通信的过程分成7层来进行通信:
应用层
表示层--->前三层整体概括为应用层:HTTP、FTP、TFTP、SMTP、SNMP、DNS主要负责应用程序的协议
会话层
传输层--->TCP、UDP主要使网络程序进行通信,在通信时可以采用TCP协议或者UDP协议
网络层--->IP、ICMP、IGMP将传输的数据进行分组,将分组的数据发送到目标计算机或者是网络当中
数据链路层---->是由底层网络定义的协议:各种驱动协议
物理层--->最后两层概括为一层:链路层:光纤、网线、电缆.....
落地应用的是四层网络模型:TCP/IP网络模型。
TCP协议:
面向连接,通过三次握手建立连接,通过四次挥手断开连接(双方确认)
一般进行的是双全工模式进行通信:双方都可以进行发送和接收信息,假设有两个进程A和B,数据A-->B数据B-->A
点对点:一个TCP连接总是在两台主机之间进行的,在发送中,通过一个连接将数据发送给多个接收方是行不通的。
通过Socket套接字实现通信。
UDP协议:
面向无连接的,一般数据很容易丢失,传输速度会非常快。
通过Socket套接字实现通信。
基本操作
1.服务器端对远程的客户端端口进行监听
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Server服务器已经启动");
//准备IP地址 标识服务端dz
IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
//准备一个监听器 TcpListener
TcpListener listener = new TcpListener(ip, 8080);
//启动监听器
listener.Start();
Console.WriteLine("服务器开始监听");
Console.WriteLine("\r\n按下\'Q'键退出");
ConsoleKey key;
while ((key = Console.ReadKey(true).Key) == ConsoleKey.Q)
{
break;
}
}
}
2.单一客户端与服务端链接
namespace 单一客户端
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("客户端已经启动");
//客户端在创建对象时不需要显式的指定的IP地址(本机地址)和端口号(系统随机生成)
TcpClient tcpClient = new TcpClient();
//链接远程服务器
//try-catch语句块就是C#程序中用于处理可能产生异常的语句
//把有可能产生异常的代码写入到try语句块中,不管try里面的代码会不会产生异常,经过try-cathc语句异常都被处理掉了
//异常会造成程序异常终止(停止)
try
{
tcpClient.Connect("127.0.0.1", 8080);
}
catch (Exception ex)
{
Console.WriteLine("连接服务器失败:");
}
//如果连接成功,则可以向服务器发送数据
Console.WriteLine("客户端已经连接上服务器");
Console.WriteLine("链接成功"+tcpClient.Client.LocalEndPoint,tcpClient.Client.RemoteEndPoint);
//按下Q键退出程序
while (true)
{
string input = Console.ReadLine();
if (input.ToLower() == "q")
{
break;
}
byte[] data = Encoding.UTF8.GetBytes(input);
tcpClient.GetStream().Write(data, 0, data.Length);
}
tcpClient.Close();
Console.WriteLine("客户端已经退出");
}
}
}
总结:
服务器端:TcpListener
客户端:TcpClient
一般情况下,先启动服务器端,让客户端连接服务器端
在创建服务器端的时候,需要手动指定服务端的ip地址和端口号
在创建客户端的时候,不需要指定客户端的ip地址和端口号
如果服务端未启动,客户端无法正常连接服务器端(目标不存在,拒绝连接)
3.获取多个客户端链接
namespace 多个客户端
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("客户端启动了");
//创建多个客户对象
//定义一个TCPClient对象
TcpClient tcpClient;
for(int i = 0; i < 3; i++)
{
try
{
tcpClient = new TcpClient();
//连接到服务器
tcpClient.Connect("127.0.0.1", 8080);
//打印链接到服务器端的信息
Console.WriteLine("已连接到服务器端");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
//按下Q 退出程序
Console.WriteLine("按下Q 退出程序");
while (Console.ReadKey().KeyChar!= 'q')
{
continue;
}
Console.WriteLine("客户端退出");
}
}
}
进行相应改造的服务器端
namespace 服务器监听客户端端口
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Server服务器已经启动");
//准备IP地址 标识服务端dz
IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
//准备一个监听器 TcpListener
TcpListener listener = new TcpListener(ip, 8080);
//启动监听器
listener.Start();
Console.WriteLine("服务器开始监听");
//查看有哪些客户端连接了我
while (true)
{
//获取客户端链接的方法
TcpClient client = listener.AcceptTcpClient();
//获取客户端的IP地址
IPEndPoint ipEndPoint = (IPEndPoint)client.Client.RemoteEndPoint;
//输出客户端的IP地址
Console.WriteLine("客户端{0}已连接", ipEndPoint.Address.ToString());
}
}
}
}
同步传输文本字符串
1.客户端发送,服务器端接收并打印展示
namespace Sever服务器端
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("服务器端启动成功!");
IPAddress ip = IPAddress.Parse("127.0.0.1");
//创建TcpListener实例
TcpListener listener = new TcpListener(ip, 8080);
//开始监听
listener.Start();
Console.WriteLine("服务器端开始监听!");
//循环接收客户端连接
while (true)
{
//等待客户端连接
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("客户端已连接!");
//读取客户端发送的数据
NetworkStream stream = client.GetStream();//获取客户端的网络流
byte[] data = new byte[1024];//定义一个字节数组来接收客户端发送的数据
int length = stream.Read(data, 0, data.Length);//读取客户端发送的数据并存储到字节数组中
string message = Encoding.UTF8.GetString(data, 0, length);//将字节数组转换为字符串
Console.WriteLine("客户端:" + message);
//向客户端发送数据
byte[] response = Encoding.UTF8.GetBytes("服务器端已收到消息!");
stream.Write(response, 0, response.Length);
//关闭连接
client.Close();
}
}
}
}
//服务端
namespace 客户端Client
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("客户端启动成功!");
TcpClient client;
try
{
client = new TcpClient("127.0.0.1", 8080);//连接到服务器的IP和端口
Console.WriteLine("已连接到服务器!");
//向服务器发送数据
byte[] data = Encoding.UTF8.GetBytes("Hello,服务器!");
//发送数据
client.GetStream().Write(data, 0, data.Length);//写入数据
client.GetStream().Flush();//刷新缓冲区
Console.WriteLine("已向服务器发送数据!");
//接收服务器的回复
byte[] response = new byte[1024];
int length = client.GetStream().Read(response, 0, response.Length);
Console.WriteLine("服务器回复:" + Encoding.UTF8.GetString(response, 0, length));
client.Close();
}
catch (Exception ex)
{
Console.WriteLine("连接服务器失败!" + ex.Message);
}
Console.ReadKey();
}
}
}
一、核心通信方式
-
Socket 通信:基于 IP 的网络通信(重点)
-
辅助方式:串口通信、运动控制卡通信
二、网络基础核心
-
IP 地址 :唯一标识网络设备,格式如
192.168.x.x
(32 位二进制转换而来),分网络地址和主机地址 -
DNS 作用:将易记的域名转换为 IP 地址
-
网络测试 :
ipconfig /all
查 IP,ping 目标
测连通性
三、核心协议
-
TCP:面向连接(三次握手建立、四次挥手断开),可靠传输,适合重要数据
-
UDP:无连接,速度快但可能丢包,适合实时性要求高的场景
-
两者均通过 Socket 实现通信
四、Socket 通信关键操作(C#)
-
服务器端 :用
TcpListener
,指定 IP 和端口(如127.0.0.1:8080
),Start()
启动监听,AcceptTcpClient()
接收客户端连接 -
客户端 :用
TcpClient
,无需指定本地 IP / 端口,通过Connect(服务器IP, 端口)
建立连接 -
数据传输 :通过
NetworkStream
读写数据,需用Encoding.UTF8
进行字节与字符串转换
五、通信流程要点
-
先启动服务器,再启动客户端连接
-
服务器可同时处理多个客户端连接
-
数据传输为双向:客户端发送→服务器接收(可回复),反之亦然
