Socket通信与网络编程实战

网络编程(通信)

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进行字节与字符串转换

五、通信流程要点

  • 先启动服务器,再启动客户端连接

  • 服务器可同时处理多个客户端连接

  • 数据传输为双向:客户端发送→服务器接收(可回复),反之亦然

相关推荐
界面开发小八哥22 分钟前
DevExpress ASP.NET Web Forms v25.1新版本开发环境配置要求
c#·asp.net·界面控件·devexpress·ui开发
钢铁男儿5 小时前
C# 异步编程(计时器)
开发语言·c#
weixin_4471035812 小时前
WPF之绑定!
c#·wpf
Dm_dotnet13 小时前
WPF优秀项目推荐:Stylet 一个非常轻量但强大的 ViewModel-First MVVM 框架
c#
伽蓝_游戏17 小时前
UGUI源码剖析(5):事件的旅程——EventSystem的架构与输入处理管线
游戏·ui·unity·架构·c#·游戏引擎·.net
fs哆哆18 小时前
在VB.net中,委托Action与Func的比较
开发语言·c#·.net
与火星的孩子对话19 小时前
Unity大型场景性能优化全攻略:PC与安卓端深度实践 - 场景管理、渲染优化、资源调度 C#
android·unity·性能优化·c#
半瓶啤酒一醉方休1 天前
C# 查询电脑已安装所有软件并打印txt保存到桌面
开发语言·c#
钢铁男儿1 天前
深入解析C#并行编程:从并行循环到异步编程模式
开发语言·c#