首页 > 编程语言 >c# Socket简单介绍

c# Socket简单介绍

时间:2024-06-04 21:33:47浏览次数:21  
标签:UDP Socket c# 使用 端口 TCP 简单 数据传输

1、socket简介

在 C# 中,Socket 是一个表示网络套接字的类。套接字是一种在应用程序之间进行通信的接口,可以用来实现基于 TCP/IP 协议的网络应用程序。Socket 类提供了创建、管理和维护网络连接的功能,是.NET Framework 中的一个基本网络通信类。

Socket 类的主要作用是提供了一种与网络设备(如网络接口卡)进行通信的方法。它可以用来创建套接字,套接字是一种在应用程序之间进行通信的接口。通过使用套接字,应用程序可以与其他应用程序进行通信,而无需关心底层的网络细节。

Socket 类还提供了许多方法和属性,可以用来配置和管理套接字。例如,可以使用 Bind 方法将套接字绑定到指定的地址和端口,可以使用 Listen 方法监听指定的端口,可以使用 Connect 方法连接到远程主机,可以使用 SendReceive 方法发送和接收数据,等等。

2、端口与协议概念

在计算机网络中,端口和协议是两个重要的概念。端口是一个逻辑上的地址,用于区分计算机上不同的网络应用程序。协议是一种规则集,定义了数据如何被封装、传输、接收和解释。

端口是一个 16 位的数字,通常范围在 0 到 65535 之间。每个端口都对应一个网络应用程序,例如 HTTP 应用程序使用端口 80,FTP 应用程序使用端口 21 等。端口可以用来区分不同的网络应用程序,使得计算机可以同时运行多个网络应用程序。

协议是一种规则集,定义了数据如何被封装、传输、接收和解释。常见的网络协议包括 TCP/IP、HTTP、FTP 等。协议通常包括一些规则和约定,例如数据包的格式、数据传输的顺序、错误检测和纠正方法等。协议可以用来确保数据能够正确地被传输和处理。

在使用 Socket 类进行网络编程时,需要指定要使用的端口和协议。例如,可以使用 Socket 类的 Bind 方法将套接字绑定到指定的地址和端口,可以使用 Listen 方法监听指定的端口,可以使用 Connect 方法连接到远程主机,可以使用 SendReceive 方法发送和接收数据,等等。在使用这些方法时,需要指定要使用的端口和协议,以确保数据能够正确地被传输和处理。

3、TCP与UDP区别

TCP(传输控制协议)和 UDP(用户数据报协议)是两种不同的传输层协议,它们在数据传输方面有一些不同的特点。

(1)连接方式:

TCP 是一种面向连接的协议,它需要在数据传输之前建立一个连接。这个连接是通过三次握手(three-way handshake)过程建立的,该过程可以确保数据能够可靠地被传输。在数据传输过程中,TCP 会维护这个连接,确保数据能够按照顺序被传输。

UDP 是一种无连接的协议,它不需要在数据传输之前建立一个连接。相反,UDP 会将数据包直接发送到目的地。这种无连接的方式可以提高数据传输的效率,但也意味着数据可能会丢失或出现错误。

(2)可靠性:

**TCP 提供可靠的数据传输。**它使用确认和重传机制来确保数据能够正确地被传输。如果一个数据包没有被成功接收,TCP 会重新发送它,直到它被成功接收为止。

**UDP 不提供可靠的数据传输。**它不保证数据能够被正确地传输,因此可能会出现数据丢失或错误的情况。如果需要可靠的数据传输,可以使用其他协议或应用程序层的错误检测和纠正机制。

(3)速度:

由于**TCP 提供可靠的数据传输,它的速度可能会比 UDP 慢。**在一些对速度要求较高的应用场景(如实时视频流),可能会选择使用 UDP 而不是 TCP,以获得更高的传输速度。

(4)流量控制:

TCP 提供流量控制机制,可以根据网络状况和接收能力来控制数据的发送速度。这可以确保数据不会超过网络的处理能力,从而避免数据丢失或延迟。

**UDP 没有内置的流量控制机制。**如果需要流量控制,可以使用其他协议或应用程序层的流量控制机

(5)适用场景:

TCP 适用于对数据传输可靠性要求较高的应用场景,例如文件传输、远程登录等。它也适用于对数据传输顺序有要求的场景,例如 HTTP 请求、SMTP 邮件等。

UDP 适用于对数据传输速度要求较高的应用场景,例如实时视频流、在线游戏等。它也适用于对数据传输顺序没有要求的场景,例如广播数据、实时聊天等。

4、使用 Socket 类创建一个简单的网络应用程序

using System.Net;
using System.Net.Sockets;

public class SimpleServer
{
    private Socket serverSocket;

    public SimpleServer(int port)
    {
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
        serverSocket.Listen(1);
    }

    public void StartListening()
    {
        serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
    }

    private void AcceptConnection(IAsyncResult ar)
    {
        Socket server = (Socket)ar.AsyncState;
        Socket client = server.EndAccept(ar);

        try
        {
            while (true)
            {
                byte[] data = new byte[1024];
                int bytesReceived = client.Receive(data);
                if (bytesReceived == 0)
                {
                    break;
                }
                Console.WriteLine("Received: {0}", Encoding.ASCII.GetString(data, 0, bytesReceived));
                data = Encoding.ASCII.GetBytes("Hello, client!");
                client.Send(data);
            }
        }
        finally
        {
            client.Close();
        }
    }
}

在这个示例中,我们创建了一个名为 SimpleServer 的类,它使用 Socket 类创建了一个网络服务器。服务器可以监听指定的端口,并接受来自客户端的连接。当有客户端连接时,服务器会进入一个循环,接收客户端发送的数据,并向客户端发送回应数据。当客户端关闭连接时,服务器会退出循环,并关闭连接。

需要注意的是,Socket 类的使用涉及到底层的网络编程,因此需要小心处理。在实际应用程序中,可能会出现各种网络问题,例如连接中断、数据丢失、网络延迟等。因此,应该使用适当的网络编程技巧,例如使用缓冲区处理大数据量、使用异步编程模型处理多个客户端等。

标签:UDP,Socket,c#,使用,端口,TCP,简单,数据传输
From: https://blog.csdn.net/z763955196/article/details/139454388

相关文章

  • JavaScript省市区县选择三级联动实现
    <!DOCTYPEhtml><htmllang="en"><head> <metacharset="UTF-8"> <style>  .select-container{   margin:20pxauto;   width:610px;  }  select{   width:200px;   height:25px;  ......
  • 使用yolov10源码对图片进行目标检测的步骤讲解(windows环境、PyCharm软件、预测阶段)
            本文只讲解yolov10的预测阶段,即如何使用代码调用yolov10模型,对图片进行目标检测,并不涉及训练、验证等阶段。步骤:一、下载yolov10源码        1、打开源码地址。yolov10源码链接:https://github.com/THU-MIG/yolov10    注意:如果网页加载不......
  • Maven实战: 创建自定义archetype
    在手动创建SpringBoot应用中,我们讲过手动创建SpringBoot工程是比较麻烦的,尤其是公司内部不有自定义扩展和集成的情况下。利用Maven的archetype:generate能基于项目模板生成功能,自定义模板能让整个创建过程自动化,这样既能大大降低创建和集成SpringBoot的复杂度,还能做到公司内部......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript美食网站(甜品)
    HTML+CSS+JS【美食网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript个人网站(图书爱好)
    HTML+CSS+JS【个人网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • ElasticSearch性能原理拆解
    逐层拆分ElasticSearch的概念Cluster:集群,Es是一个可以横向扩展的检索引擎(部分时候当作存储数据库使用),一个Es集群由一个唯一的名字标识,默认为“elasticsearch”。在配置文件中指定相同的集群名,Es会将相同集群名的节点组成一个集群。Node:节点,集群中的任意一个实例对象,是一个节......
  • c 与 c++ struct
     在C语言和C++语言中,结构体的使用确实存在一些差异,特别是在结构体类型名称的使用上。具体而言:C语言:在C语言中,声明和使用结构体变量时,通常需要使用struct关键字,除非你使用typedef为结构体定义了一个别名。C++语言:在C++语言中,struct关键字在定义结构体类型......
  • chrony 时间同步服务
    centos7系统默认已安装chronyd时间同步服务&已开启(ntpd服务默认是关闭的) [BEGIN]2024/6/420:14:16[tang@localhost~]$chronycsources210Numberofsources=4MSName/IPaddressStratumPollReachLastRxLastsample======================......
  • acwing329 围栏障碍训练场 题解
    考试压轴题,意识到这题是线段树优化\(dp\)时追悔莫及。为了简化题目,我将从起点到原点变成了从原点到起点(这样就可以省去两个数组的空间)。想到设\(dp_{i,j}\)表示在第\(i\)层,奶牛们在\(j\)列时的最小移动范围,则转移方程为(设输入为\(l,r\)):\[\begin{cases}dp_{i,j}=dp_{......
  • 向量数据库chroma
    概述Chroma是向量数据库,存向量用的。拥有针对向量的查询能力,根据向量的距离远近查询,这一点和传统数据库不一样。安装与简单使用用pipinstallchromadb命令安装。为了创建数据库实例,先要创建一个client。importchromadbchroma_client=chromadb.Client()借助client......