热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#之入门总结_网络编程_18

ISOOSI模型简介ISO:国际标准化组织OSI:开放系统互联结构模型ISOOSI模型把网络分成了若干层,每层都实现特定的功能。ISOOSI模型把网络表示成竖直的线,模型中的每一层次至少包含有一

ISO/OSI模型简介


ISO:国际标准化组织
OSI:开放系统互联结构模型
ISO/OSI模型把网络分成了若干层,每层都实现特定的功能。
ISO/OSI模型把网络表示成竖直的线,模型中的每一层次至少包含有一个协议,所以也可以说是模型中的协议是逐个叠放的。协议栈是个由竖直的层和对方的协议抽象而来。
OSI不是一个实际的物理模型,而是一个将网络协议规范化了的逻辑参考模型

常见的三种协议:
IP协议:网际协议(Internet Protocol)
TCP协议: 传输控制协议(Transmission Control Protocol)
UDP协议:用户数据协议(User Datagram Protocol)
Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。
抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。WebReqeust和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于传输层。可以如下图示意:

可见,传输层位于这个结构的最底层,当其上面的应用协议层和请求/响应层不能满足应用程序的特殊需要时,就需要使用这一层进行Socket套接字编程。
在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息;NetworkStream类则提供用于网络访问的基础数据流等,常见的许多Internet服务都可以见到Socket的踪影,如Telnet、Http、Email、Ftp等,这些服务尽管通讯协议Protocol的定义不同,但是其基础的传输都是采用的Socket。

Scoket  TCP编程的流程图

TCP的三次握手


TCP的四次挥手

namespace TcpServer
{
    class Program
    {
        static TcpListener server;
        static void Main(string[] args)
        {
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint ipendPoint = new IPEndPoint(ip, 9999);
            server = new TcpListener(ipendPoint);
            server.Start();
            Thread th = new Thread(Liseten);
            th.Start();

        }

        static void Liseten()
        {
            TcpClient client = null ;
            try
            {
                while (true)
                {
                    client = server.AcceptTcpClient();
                    
                    Console.WriteLine("连接成功");
                    NetworkStream netWorkStream = client.GetStream();
                    Console.WriteLine(client.Connected);
                    byte[] buffer = new byte[4096];
                    int len = 0;

                    try
                    {
                        while ((len = netWorkStream.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            Console.WriteLine(Encoding.Default.GetString(buffer, 0, len));
                        }
                        
                    }
                    catch (Exception e)
                    {
                        //不做任何处理即可  这里不影响服务器和客户端

                    }
                }
            }
            catch (SocketException e)
            {
                if (client.Connected)
                {
                    client.Close();
                }
                Console.WriteLine("***************");
               
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                
            }
            




        }

    }
}



namespace TcpClientDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpClient client = new TcpClient();

            client.Connect("127.0.0.1", 9999);

            while (true)
            {
                string str = Console.ReadLine();
                byte[] buffer = Encoding.Default.GetBytes(str);
                NetworkStream networkStream = new NetworkStream(client.Client);
                networkStream.Write(buffer, 0, buffer.Length);
            }

            
        }
    }
}


Scoket UDP编程的流程图

UDP套接口是无连接的、不可靠的数据报协议;
为什么要使用这种不可靠的协议呢?
其一:当应用程序使用广播或多播时只能使用UDP协议;
其二:由于他是无连接的,所以速度快。

UDP收发数据的流程:

namespace UDPClientDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            UdpClient client = new UdpClient("127.0.0.1", 9999);
            try
            {
                while (true)
                {
                    string str = Console.ReadLine();
                    byte[] buffer = Encoding.Default.GetBytes(str);
                    client.Send(buffer, buffer.Length);
                    Console.WriteLine("发送完毕");
                }
                
            }
            catch (Exception e)
            {

                Console.WriteLine(e);
            }
            

        }
    }
}

 class Program
    {
        static void Main(string[] args)
        {
            UdpClient udpServer = new UdpClient(9999);

            try
            {
                while (true)
                {
                    IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Any, 0);
                    byte[] buffer = udpServer.Receive(ref ipendpoint);
                    string ret = Encoding.Default.GetString(buffer, 0, buffer.Length);
                    Console.WriteLine("来自{0}:{1}的信息是{2}", ipendpoint.Address, ipendpoint.Port, ret);
                }
            }
            catch (Exception e)
            {

                Console.WriteLine(e);
            }

TCP和UDP的区别!
 1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。   




推荐阅读
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • 本文介绍了如何处理在Xcode构建过程中出现的多个命令生成相同文件的问题,特别是当这些文件与Info.plist无关时。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
author-avatar
weijun520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有