C# Socket实际应用案例与属性详解

news2024/12/25 1:15:26

引言
Socket是一个在网络编程中非常常见和重要的概念,它提供了一种通信机制,使不同的计算机之间可以进行数据传输。本文将介绍C#中Socket的实际应用案例,并对Socket的常用属性进行详细解析。

文章目录

    • 1. Socket的实际应用案例
    • 2. Socket的属性详解
    • 3. 示例代码解析

在这里插入图片描述

1. Socket的实际应用案例

以一个简单的实时聊天应用为例,介绍Socket在实际应用中的使用场景和功能。

  • 服务端代码:

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    class Server
    {
        static void Main(string[] args)
        {
            // 创建Socket对象
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
            // 绑定Socket
            serverSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888));
    
            // 监听连接
            serverSocket.Listen(10);
    
            // 接受连接
            Socket clientSocket = serverSocket.Accept();
    
            // 发送和接收数据
            byte[] dataBuffer = new byte[1024];
            int bytesRead = clientSocket.Receive(dataBuffer);
            string receivedData = Encoding.ASCII.GetString(dataBuffer, 0, bytesRead);
            Console.WriteLine("Received Data: " + receivedData);
            byte[] sendData = Encoding.ASCII.GetBytes("Hello client!");
            clientSocket.Send(sendData);
    
            // 关闭连接
            clientSocket.Close();
            serverSocket.Close();
        }
    }
    
  • 客户端代码:

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    class Client
    {
        static void Main(string[] args)
        {
            // 创建Socket对象
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
            // 连接服务端
            clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888));
    
            // 发送和接收数据
            byte[] sendData = Encoding.ASCII.GetBytes("Hello server!");
            clientSocket.Send(sendData);
            byte[] dataBuffer = new byte[1024];
            int bytesRead = clientSocket.Receive(dataBuffer);
            string receivedData = Encoding.ASCII.GetString(dataBuffer, 0, bytesRead);
            Console.WriteLine("Received Data: " + receivedData);
    
            // 关闭连接
            clientSocket.Close();
        }
    }
    

2. Socket的属性详解

介绍Socket类的各种属性,并解析其用法和作用。

  • LocalEndPoint:获取本地端点的信息,包括IP地址和端口号。在服务端中,使用此属性获取绑定的本地端点信息。
  • RemoteEndPoint:获取远程端点的信息,包括IP地址和端口号。在客户端中,使用此属性获取已连接的服务器端点信息。
  • AddressFamily:获取或设置套接字的地址族。常用的是AddressFamily.InterNetwork表示IPv4地址族。
  • SocketType:获取或设置套接字的类型。常用的是SocketType.Stream表示流式套接字。
  • ProtocolType:获取或设置套接字的协议类型。常用的是ProtocolType.Tcp表示TCP协议。
  • Blocking:获取或设置一个Boolean值,指示套接字是否处于阻塞模式。可以通过此属性设置套接字为阻塞或非阻塞模式。
  • Available:获取从网络中可读取的字节数。可以通过此属性判断是否有可用的数据可接收。
  • SendTimeout:获取或设置发送操作的超时时间。可以通过此属性设置发送数据的超时时间,如果在指定时间内发送不成功,则会引发异常。
  • ReceiveTimeout:获取或设置接收操作的超时时间。可以通过此属性设置接收数据的超时时间,如果在指定时间内接收不到数据,则会引发异常。

3. 示例代码解析

解析上述客户端和服务端代码中使用的Socket属性。

  • 服务端代码解析:

    • Bind方法用于将Socket对象与本地IP地址和端口号绑定。
    • Listen方法开始监听客户端连接请求,参数指定允许的最大排队数。
    • Accept方法用于接受客户端的连接请求,并返回一个新的Socket对象,用于与客户端进行通信。
    • Receive方法用于接收客户端发送的数据,将数据读取到指定的缓冲区中。
    • Close方法用于关闭与客户端的连接。
  • 客户端代码解析:

    • Connect方法用于连接服务端,参数指定服务端的IP地址和端口号。
    • Send方法用于向服务端发送数据,将数据发送到指定的缓冲区中。
    • Receive方法用于接收服务端发送的数据,将数据读取到指定的缓冲区中。
    • Close方法用于关闭与服务端的连接。

结论
本文介绍了C#中Socket的实际应用案例,通过一个简单的实时聊天应用的示例,详细解析了Socket的常用属性及其使用方法。通过对Socket的理解和应用,可以在网络编程中实现各种通信需求。在实际应用中,我们可以根据具体的需求使用不同的Socket属性进行设置,以实现更灵活和可靠的数据传输。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/807166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAS比较并交换具体实现细节

线程2读取内存值到工作内存中,设置一个预估值与读入的值相等,线程1也同样读入。 线程2进行操作,之后在写入内存前,将预估值与内存值作比较,看内存值是否修改过。 如果线程2比较完相同,则修改内存值为1&am…

开源了!最强原创图解八股文面试网来袭

强烈推荐 Github上业内新晋的一匹黑马—Java图解八股文面试网—Java2Top.cn,图解 Java 大厂面试题,深入全面,真的强烈推荐~ 这是一个二本逆袭阿里的大佬根据自己秋招上岸所看过的相关专栏,面经,课程,结合自…

211. 添加与搜索单词 - 数据结构设计---------------字典树

211. 添加与搜索单词 - 数据结构设计 原题链接:完成情况:解题思路:参考代码: 原题链接: 211. 添加与搜索单词 - 数据结构设计 https://leetcode.cn/problems/design-add-and-search-words-data-structure/descriptio…

tinkerCAD案例:19. Move Circuit Assembly 移动电路组件

tinkerCAD案例:19. Move Circuit Assembly 移动电路组件 In this tutorial, you’ll learn how to add the Move circuit assembly to a design. 在本教程中,您将学习如何将移动电路装配体添加到设计中。 When you assemble the Move circuit assembly…

【Docker】Docker应用部署之Docker容器安装Tomcat

目录 一、搜索镜像 二、拉取镜像 三、创建容器 四、测试使用 一、搜索镜像 docker search tomcat 二、拉取镜像 docker pull tomcat:版本 三、创建容器 首先在宿主机创建数据卷的目录 mkdir /root/tomcat # 创建目录 cd /root/tomcat # 进入目录 docker run -id -…

解决mysqld服务启动失败

1、进程 首先查看下mysql进程: ps -aux | grep mysql有进程号 2、所有者和所属组为mysql 查看/usr/local/MySQL/data/mysqld.pid所有者和所属组是否为mysql 原来是权限有问题,那么更改权限(还需要加权限)3、 重新启动服务

2023牛客暑期多校-J-Qu‘est-ce Que C‘est?(DP)

题意: 给定长度为n的数列,要求每个数都在的范围,且任意长度大于等于2的区间和都大于等于0,问方案数。。 思路: 首先要看出是dp题,用来表示遍历到第i位且后缀和最小为x的可行方案数(此时的后缀可以只有最…

LeetCode[面试题04.08]首个共同祖先

难度:Medium 题目: 设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树。 例如,给定如下二叉树: root [3,5,1,6,2,0,8,null,null,7,…

软考高级架构师笔记-10数学计算题

目录 1. 前文回顾 & 考情分析2. 最小生成树3. 最短路径4. 网络与最大流量5. 线性规划6. 动态规划/决策表7. 博弈论8. 状态转移矩阵9. 决策论10. 结语1. 前文回顾 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记-2计算机软件(操作系统)软考…

Spring AOP 的概念及其作用

一、什么是 Spring AOP? 在介绍 Spring AOP 之前,首先要了解一下什么是 AOP ? AOP ( Aspect Oriented Programming ):面向切面编程,它是一种思想, 它是对某一类事情的集中处 理 。…

vue强制刷新的方法

前言 在开发过程中,有时候会遇到这么一种情况: 1.切换页面页面没有更新 2.通过动态的赋值,但是dom没有及时更新,能够获取到动态赋的值,但是无法获取到双向绑定的dom节点, 这就需要我们手动进行强制刷新组件,下面这篇文章主要给大家介绍了关于vue组件强制刷新的方案…

搭建自己的Git服务器

环境 服务端:Ubuntu 22.04 客户端:Win11_x64 前提条件:需要确保在Windows机器上能够ping通Ubuntu服务器, 并且服务端与客户端均已安装了Git软件 服务端上的配置操作 以Ubuntu服务器作为Git服务端的运行环境,并方便后期免密推…

iOS开发-CAShapeLayer与UIBezierPath实现微信首页的下拉菜单效果

iOS开发-CAShapeLayer与UIBezierPath实现微信首页的下拉菜单效果 之前开发中遇到需要使用实现微信首页的下拉菜单效果。用到了CAShapeLayer与UIBezierPath绘制菜单外框。 一、效果图 二、CAShapeLayer与UIBezierPath 2.1、CAShapeLayer是什么? CAShapeLayer继承自…

解决Nacos启动时遇到的一些错误

当我们双击nacos的bin目录下的statup.cmd启动Nacos时,发现报以下错误: [dba-load-error] load jdbc.properties error 报错的原因是:数据库找不到,没有导入。 解决方法步骤: ①在安装的nacos的conf目录下&#xff0…

C++:类和对象(下)---对类和对象深入一些的理解

文章目录 构造函数?初始化列表explicit关键字 匿名对象 构造函数? 初始化列表 前面已然介绍过构造函数,但并未完全结束,构造函数有很多种写法,有带缺省参数的,有全缺省的,不带缺省参数的…但用…

Jenkins从配置到实战(二) - Jenkins的Master-Slave分布式构建

前言 Jenkins的Master-Slave分布式构建,就是通过将构建过程分配到从属Slave节点上,从而减轻Master节点的压力,而且可以同时构建多个,有点类似负载均衡的概念。简单理解就是,将Jenkins服务器上的构建任务分配到其他机器…

GitLab开启双端认证并登录GitLab

GitLab开启双端认证并登录GitLab 1.介绍双端认证 单重认证——密码验证,这极其容易出现密码被盗,密码泄露等危险事件。 于是为了提高安全性,就出现了双因素认证,多因素认证。登录的时候不仅要输入账号和密码还需要输入一个验证码…

C++模板进价

本期我们来学习C模板的进价内容,没有看过初阶的同学建议先看看初阶内容 (26条消息) C模板初阶_KLZUQ的博客-CSDN博客 目录 非类型模板参数 模板特化 函数模板特化 类模板特化 模板分离编译 模板总结 我们之前一直说我们写模板时,typename和class没…

FPGA2-采集OV5640乒乓缓存后经USB3.0发送到上位机显示

1.场景 基于特权A7系列开发板,采用OV5640摄像头实时采集图像数据,并将其经过USB3.0传输到上位机显示。这是验证数据流能力的很好的项目。其中,用到的软件版本,如下表所示,基本的硬件情况如下。该项目对应FPGA工程源码…

【雕爷学编程】Arduino动手做(129)---TTS文字转语音合成模块2

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…