C#实现简单TCP服务器和客户端网络编程

news2024/11/18 8:39:01

在C#中进行网络编程涉及许多类和命名空间,用于创建和管理网络连接、传输数据等。下面是一些主要涉及的类和命名空间:

  1. System.Net 命名空间:这个命名空间提供了大部分网络编程所需的类,包括:

    • IPAddress:用于表示IP地址。
    • IPEndPoint:表示IP地址和端口号的组合。
    • Socket:用于创建和管理网络套接字,实现基本的套接字通信。
    • TcpListener:用于创建TCP服务器,监听传入的连接请求。
    • TcpClient:用于创建TCP客户端,连接到TCP服务器。
    • UdpClient:用于进行UDP通信。
  2. System.Net.Sockets 命名空间:这个命名空间提供了与套接字相关的类,用于实现底层的网络通信。

  3. System.Net.WebClient 类:用于简化HTTP请求和响应的处理,可用于进行基本的HTTP通信。

  4. System.Net.Http 命名空间:提供了更丰富的HTTP支持,包括:

    • HttpClient:用于进行HTTP客户端通信,支持异步操作。
    • HttpListener:用于创建HTTP服务器,处理传入的HTTP请求。
  5. System.Net.Sockets.SocketAsyncEventArgs 类:提供了异步套接字操作的高级支持,可提高异步通信的性能。

  6. 异步编程:C#提供了异步和await关键字,用于简化异步编程。你可以在网络编程中使用这些关键字来实现异步操作,以避免阻塞主线程。

网络编程的示例代码会根据你想要实现的具体场景而有所不同。

例如,如果你想创建一个简单的TCP服务器,你可以使用TcpListenerTcpClient类来实现。如果你想进行HTTP通信,你可以使用HttpClient类来发送HTTP请求并处理响应。

以下是一个简单的C#网络编程示例,演示了如何创建一个简单的TCP服务器和客户端:

// 服务器端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Server {
    static void Main() {
        TcpListener server = new TcpListener(IPAddress.Any, 8080);
        server.Start();

        Console.WriteLine("Server started. Waiting for clients...");

        TcpClient client = server.AcceptTcpClient();
        Console.WriteLine("Client connected.");

        NetworkStream stream = client.GetStream();
        byte[] data = new byte[1024];
        int bytesRead = stream.Read(data, 0, data.Length);
        string message = Encoding.ASCII.GetString(data, 0, bytesRead);
        Console.WriteLine("已接收: " + message);

        //client.Close();
        //server.Stop();
         Console.ReadKey();
    }
}
// 客户端
using System;
using System.Net.Sockets;
using System.Text;

class Client {
    static void Main() {
        TcpClient client = new TcpClient();
        client.Connect("127.0.0.1", 8080);

        string message = "Hello, server!";
        byte[] data = Encoding.ASCII.GetBytes(message);
        NetworkStream stream = client.GetStream();
        stream.Write(data, 0, data.Length);

        Console.WriteLine("已发送" + message);

        Console.ReadKey();

        //client.Close();
    }
}

 

System.Net.Sockets 命名空间
是 C# 中用于进行底层网络编程的命名空间,它包含了许多类和枚举,用于创建和管理套接字(Sockets)以进行网络通信。下面是一些在这个命名空间下常用的类和枚举:

  1. Socket 类:Socket 类是进行网络通信的核心,可以用于创建各种类型的套接字,包括 TCP、UDP 和原始套接字。

    • SocketType 枚举:定义套接字的类型,如 SocketType.Stream(用于 TCP)和 SocketType.Dgram(用于 UDP)。
    • ProtocolType 枚举:定义套接字使用的协议,如 ProtocolType.TcpProtocolType.Udp
  2. SocketAsyncEventArgs 类:这个类用于在异步操作中传递套接字操作的参数,可以有效地管理异步网络操作。

  3. TcpListener 类:用于创建 TCP 服务器端监听,接受客户端连接请求。

    • Pending 方法:检查是否有等待连接的客户端请求。
    • AcceptSocket 方法:接受客户端连接,返回连接的套接字。
  4. TcpClient 类:用于创建 TCP 客户端连接。

    • Connect 方法:连接到指定的 IP 地址和端口号。
  5. UdpClient 类:用于创建 UDP 客户端和服务器端。

    • Send 方法:发送 UDP 数据报。
    • Receive 方法:接收 UDP 数据报。

NetworkStream
位于 System.Net.Sockets 命名空间中,用于在网络套接字上提供流式数据传输的功能。它是基于 System.IO.Stream 的一个特殊实现,用于在网络连接上进行数据的读取和写入。

以下是一些关于 NetworkStream 类的基本信息和用法:

构造函数:

public NetworkStream(Socket socket, bool ownsSocket);

  • 构造一个 NetworkStream 对象,可以指定是否拥有该套接字。拥有套接字意味着在 NetworkStream 对象被释放时,套接字也会被关闭。

方法:

  • Read(byte[] buffer, int offset, int size):从流中读取数据并存储到指定的缓冲区中。
  • Write(byte[] buffer, int offset, int size):将数据从指定的缓冲区写入到流中。
  • Close():关闭流以及与之关联的套接字。

属性:

  • CanRead:指示是否可以从流中读取数据。
  • CanWrite:指示是否可以向流中写入数据。
  • Socket:获取与流关联的套接字。

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

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

相关文章

2.IO控制器

第五章 I/O管理 2.I/O控制器 I/O控制器的组成: I/O控制器负责接收和识别从CPU发来的各种命令,同时需要翻译为具体的设备可以明白的命令,通过控制器与设备的接口发送给具体的设备,让设备执行相应的操作。 一个I/O控制器有可能会负…

跨越边界:从前端切图仔走进iOS开发(Swift版--上集)

本文简介 点赞 关注 收藏 学会了 本文将以前端开发者的视角,和各位工友进入iOS开发的世界。 本文以实战为导向,快速掌握iOS开发这个技能。 无论你是想要扩展技能领域,还是对iOS开发充满好奇,花一个下午学习本文都能打开iOS开…

AUTOSAR规范与ECU软件开发(实践篇)5.6 基于ISOLAR-A的系统级设计与配置方法(下)

目录 3 、系统配置 4、 ECU信息抽取 3 、系统配置 在完成了VehicleComposition建立后, 可以进行系统配置。 右键点击System→Create System Info→Elements|System(图5.83) 可以新建System Info, 命名为VehicleSystem, 结果如图5.84所示。 图5.83 System Info新建(一)

Unity 3D之 利用Vector3 计算移动方向,以及实现位移多少

文章目录 先分析代码,从代码中了解Vector3 moveDirection new Vector3(10f, 0f, 100f);合法吗Vector3 moveDirection new Vector3 (xf,yf,zf)不是用来表示三维坐标的怎么表示在某个方向的位移 先分析代码,从代码中了解 这段代码是一个在游戏开发中常见…

回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测

回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测 目录 回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现DBN-ELM深度置信网络结合极限学习…

七夕学算法

目录 P1031 [NOIP2002 提高组] 均分纸牌 原题链接 : 题面 : 思路 : 代码 : P1036 [NOIP2002 普及组] 选数 原题链接 : 题面 : 思路 : 代码 : P1060 [NOIP2006 普及组] 开心的金明 原题链接 : 题面 : 思路 : 01背包例题 : 代码 : P1100 高低位交换 原题…

stm32之7.位带操作---volatile---优化等级+按键控制

源码--- #define PAin(n) (*(volatile uint32_t *)(0x42000000 (GPIOA_BASE0x10-0x40000000)*32 (n)*4)) #define PEin(n) (*(volatile uint32_t *)(0x42000000 (GPIOE_BASE0x10-0x40000000)*32 (n)*4)) #define PEout(n) (*(volatile uint32_t *)(0x420…

SQL优化之诊断篇:快速定位生产性能问题实践

1.优化背景 用户提交一个 SQL 作业后,一方面是希望作业能够成功运行,另一方面,对于成功完成的作业,需要进一步分析作业瓶颈,进行性能调优。针对这两个方面的需求,本文将介绍如何解决作业运行时的常见问题、…

C语言刷题训练DAY.11

1.有序序列插入一个整数 解题思路: 这里我们采用从后向前的比较法,如果最后面的数字比N大,我们就把这个数字向后移动一位,就比如把下标为3的数据移动到下标为4的位置。 注意:可能有一个数字是整个数组里面最小的&#…

无涯教程-PHP - 移除的扩展

以下扩展已从PHP 7开始删除- eregmssqlmysqlsybase_ct 以下SAPI已从PHP 7开始删除- aolserverapacheapache_hooksapache2filtercaudiumcontinuityisapimilternsapiphttpdpi3webroxenthttpdtuxwebjames PHP - 移除的扩展 - 无涯教程网无涯教程网提供以下扩展已从PHP 7开始删除…

UnionTech OS(统信桌面操作系统)安装 g++ 和 cmake

文章目录 前言一、debian 10简介二、安装 g三、安装cmake参考资料 前言 统信桌面操作系统支持x86、龙芯、申威、鲲鹏、飞腾、兆芯等国产CPU平台,基于debian 10.x 的稳定版本,长期维护的统一内核版本(4.19)。 一、debian 10简介 Debian 10 是一款广泛使…

Java 对图片进行上传或下载后发生了90度的旋转

一、背景介绍 在开发给上传图片打水印的时候,发现了一个奇怪的事情。某张图片在上传后发生了90度的旋转,但是在window打开来是竖的,上传后在打开就是横的。后来上网查询是由于手机在拍摄时候是横着拍的,在图片处理时将旋转角度存…

postman接口参数化设置

为什么需要参数化? 我们在做接口测试的过程中,会遇到需要测试同一个接口使用不同的数据的情况,如果每次去一个个填写数据就太麻烦了,这时我们就需要用到接口参数化,我们把数据单独的存放在一个文件中管理,…

一生一芯8——在github上添加ssh key

为在github上下载代码框架,这里在github上使用ssh key进行远程连接,方便代码拉取 参照博客https://blog.csdn.net/losthief/article/details/131502734 本机 系统ubuntu22.04 git 版本2.34.1 本人是第一次配置,没有遇到奇奇怪怪的错误&…

AI绘画:SDXL版ControlNet模型和使用方法!

SDXL是目前最强的AI绘画基础模型,直接加载模型,就可以生成不错的效果。但是它有一个致命的问题,就是不支持ControlNet。 在AI绘画中,ControlNet是一个非常重要的工具。有了它,就可以生成更加可控精准的图片。ControlN…

贪心算法:简单而高效的优化策略

在计算机科学中,贪心算法是一种简单而高效的优化策略,用于解决许多组合优化问题。虽然它并不适用于所有问题,但在一些特定情况下,贪心算法能够产生近似最优解,而且计算成本较低。在本文中,我们将深入探讨贪…

linux————LVS集群

目录 一、集群概述 一、负载均衡技术类型 二、负载均衡实现方式 二、LVS结构 一、三层结构 二、架构对象 三、LVS工作模式 四、负载均衡算法 一、静态负载均衡 二、动态负载 五、ipvsadm命令详解 六、LVS配置 一、基础配置 二、实现NAT模型搭建 配置IP地址 安装…

Python入门教程 | Python3 基本数据类型

赋值 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号(&#xff…

MyBatid动态语句且模糊查询

目录 什么是MyBtais动态语句??? MyBatis常用的动态标签和表达式 if标签 Choose标签 where标签 MyBatis模糊查询 #与$的区别 ​编辑 MyBatis映射 resultType resultMap 什么是MyBtais动态语句???…

LeetCode面试经典150题(day 1)

LeetCode是一个免费刷题的一个网站,想要通过笔试的小伙伴可以每天坚持刷两道算法题。 接下来,每天我将更新LeetCode面试经典150题的其中两道算法题,一边巩固自己,一遍希望能帮助到有需要的小伙伴。 88.合并两个有序数组 给你两个…