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

在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.mzph.cn/news/49832.shtml

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

相关文章

2023年高教社杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

第2篇:ESP32 helloword第一个程序示范点亮板载LED

1.选择ESP32开发板 2.寻找串口号,win10自动安装驱动 手动安装驱动参考: 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可…

ipad可以用别的品牌的手写笔吗?开学平价电容笔推荐

开学需要买什么呢?随着科技的不断进步,各种类型的iPad电容笔应运而生。一支好的电容笔,不仅能大大提高我们的工作效率,而且能大大提高我们的生产力。平替的这款电容笔,不管是在技术上,还是在品质上&#xf…

关于路由器和DNS解析的一些新理解

其实我本人对于交换机和路由器这些网络硬件是比较感兴趣的,也在一点一点的学习相关知识,每次解决一个问题,就让我对一些事情有新的思考。。 今天前台同事,的机器突然上不了网,,和领导一起去看了一波&#…

jmeter CSV 数据文件设置

创建一个CSV数据文件:使用任何文本编辑器创建一个CSV文件,将测试数据按照逗号分隔的格式写入文件中。例如: room_id,arrival_date,depature_date,bussiness_date,order_status,order_child_room_id,guest_name,room_price 20032,2023-8-9 14:…

C++--动态规划两个数组的dp问题

1.最长公共子序列 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串…

Unity 之NavMeshAgent 组件(导航和路径寻找的组件)

文章目录 **作用**:**属性和方法**:**用途**:**注意事项**: NavMeshAgent 是Unity引擎中用于导航和路径寻找的组件。它可以使游戏对象在场景中自动找到可行走的路径,并在避免障碍物的情况下移动到目标位置。 以下是关于…

在当今信息化社会中的安全大文件传输

随着科技的不断进步,数据已经成为各个领域和行业的宝贵财富。然而,随之而来的数据传输和交换问题也成为一个日益突出的挑战。在这篇文章中,我们将探讨在当今信息化社会中的安全大文件传输的重要性,以及如何应对传统传输方式所面临…

穿起“新架构”的舞鞋,跳一支金融数字化转型的华尔兹

华尔兹,是男女两位舞者,通过形体的控制,舞步技巧的发挥,完美配合呈现而出的一种舞蹈形式。华尔兹舞姿,如行云流水、潇洒自如、飘逸优美,素有“舞中皇后”的美称。 在跳华尔兹的时候,如果舞者双…

SQL 盲注

问题描述&#xff1a; 解决方案&#xff1a; 通过建立过滤器方法 添加拦截器&#xff1a; web.xml 文件配置拦截器 <filter><filter-name>sqlFilter</filter-name><filter-class>com.fh.filter.SqlFilter</filter-class></filter> pack…

Python将网络文件下载到本地

Python将网络文件下载到本地 前言相关介绍Python将网络文件下载到本地 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看基于DETR的人脸伪…

【Git版本控制工具使用---讲解一】

Git版本控制工具使用 安装设置用户名签名和邮箱Git常用的命令 初始化本地库查看本地状态Git 命令添加暂存区提交本地库查看版本信息修改文件版本穿梭 安装 首先根据自身电脑的配置选择性的安装是32位的还是64位的Git版本控制工具 我这边安装的是64位的 以下是我安装的时候的过…

springboot2+redis 订阅发布,解决接收消息累计线程到内存溢出,使用自定义线程池接收消息

pom 添加redis <!-- redis 缓存操作 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 发布消息 import lombok.extern.slf4j.Slf4j; import o…

python 连接Redis 数据库

pip install redis python代码 import redis# 连接数据库 r redis.Redis(host192.168.56.15, port6379, db0)# 存储数据 #r.set(key, value) r.set(name, zaraNet)# 获取数据 value r.get(name) print(value)# 关闭连接&#xff08;可选&#xff09; r.close()

C# 工厂模式

一、概述 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。在C#中&#xff0c;工厂模式通过定义一个公共接口或抽象类来创建对象&#xff0c;而具体的对象创建则由工厂类来实现。 工厂模式主要包含三个角色…

【C++数据结构】二叉搜索树

【C数据结构】二叉搜索树 目录 【C数据结构】二叉搜索树二叉搜索树概念二叉搜索树操作二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除二叉搜索树的实现二叉搜索树的应用二叉搜索树的性能分析 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.8.22 前言&#xff1a;二…

无涯教程-PHP - preg_split()函数

preg_split() - 语法 array preg_split (string pattern, string string [, int limit [, int flags]]); preg_split()函数的操作与split()完全相同&#xff0c;只不过正则表达式被接受为pattern的输入参数。 如果指定了可选的输入参数limit&#xff0c;则仅返回子字符串的限…

WebGL 变量uniform、gl.getUniformLocation、gl.uniform4f及其同族函数相关

目录 uniform变量命名规范 获取 uniform 变量的存储地址 gl.getUniformLocation 向uniform变量赋值 gl.uniform4f ​编辑 gl.uniform4f()的同族函数 demo&#xff1a;点击webgl坐标系的四个象限绘制各自不同颜色的点 uniform变量命名规范 var FSHADER_SOURCE uniform vec4…

小程序-基于vant的Picker组件实现省市区选择

一、原因 因vant/area-data部分的市/区数据跟后台使用的高德/腾讯省市区有所出入&#xff0c;故须保持跟后台用同一份数据&#xff0c;所以考虑以下几个组件 1、Area 2、Cascader 3、Picker 因为使用的是高德地图的省市区json文件&#xff0c;用area的话修改结构代价太大&…