当前位置:首页 > 技术分析 > 正文内容

C#网络通信3

在 C# 中,TcpClient 是一个用于在客户端与远程服务器之间建立 TCP 连接的类。它包含在 System.Net.Sockets 命名空间中,并通过该类,你可以实现基于 TCP 协议的客户端通信。下面是对 TcpClient 类的详细解释,包括它所包含的命名空间、对象、方法和属性,以及如何使用它。

1. TcpClient 类所在的命名空间

TcpClient 类位于 System.Net.Sockets 命名空间中。要使用 TcpClient 类,首先需要引入这个命名空间。

csharp

using System.Net.Sockets;

2. TcpClient 类的对象

TcpClient 类用于在客户端与远程服务器之间建立 TCP 连接,并通过网络流发送和接收数据。你可以使用它来执行 TCP 协议的常见操作,如连接到服务器、发送数据、接收数据以及关闭连接。

示例:创建 TcpClient 对象

csharp

TcpClient tcpClient = new TcpClient();

或者你可以使用连接构造函数直接连接到远程主机:

csharp

TcpClient tcpClient = new TcpClient("192.168.1.100", 8080);

3. TcpClient 类的核心属性和方法

3.1 核心属性

Client

这个属性返回一个 Socket 对象,允许你访问底层的网络 socket。可以用来执行更底层的 socket 操作。

Socket socket = tcpClient.Client;

Connected

这个布尔值属性指示 TcpClient 是否已成功连接到远程主机。它在连接成功后返回 true,否则返回 false。

bool isConnected = tcpClient.Connected;

Available

返回 TcpClient 中可以读取的字节数。通常在读取数据前,可以检查 Available 属性,以确保有数据可读。

int availableBytes = tcpClient.Available;

NoDelay

获取或设置一个值,指定是否禁用 TCP 协议中的 Nagle 算法。Nagle 算法合并小数据包以减少网络开销。禁用它可能会增加网络负载,但减少延迟。

tcpClient.NoDelay = true; // 禁用 Nagle 算法

3.2 核心方法

Connect()

Connect() 方法用于连接到指定的远程主机和端口。这个方法有多个重载,允许你使用主机名、IP 地址或 IP 地址的 IPAddress 对象来指定远程服务器。

tcpClient.Connect("192.168.1.100", 8080); // 使用主机名和端口

ConnectAsync()

异步地连接到远程主机和端口。它是非阻塞的,可以避免在连接过程中阻塞主线程。

tcpClient.ConnectAsync("192.168.1.100", 8080); // 异步连接

GetStream()

这个方法返回一个 NetworkStream 对象,允许你读取和写入数据。NetworkStream 提供了一个流接口,通过它可以向远程主机发送请求或从远程主机接收数据。

NetworkStream stream = tcpClient.GetStream();

Close()

用于关闭 TcpClient 连接,并释放它占用的资源。关闭连接后,不能再使用该对象。

tcpClient.Close();

BeginConnect() 和 EndConnect()

这些方法是异步版本的连接方法。BeginConnect() 用于启动异步连接,EndConnect() 用于完成连接操作。

tcpClient.BeginConnect("192.168.1.100", 8080, callback, null);

1

3.3 异常处理

在使用 TcpClient 时,可能会遇到多种异常。常见的异常包括:

SocketException:当与服务器建立连接时发生错误。

ObjectDisposedException:如果尝试在已关闭的 TcpClient 上执行操作,将抛出此异常。

InvalidOperationException:如果 TcpClient 在不允许的状态下执行操作(例如,已连接时尝试关闭连接)。

4. NetworkStream 类

TcpClient 类通过 GetStream() 方法返回一个 NetworkStream 对象,NetworkStream 是用于读写 TCP 数据流的类。它可以帮助你发送和接收数据。

示例:使用 NetworkStream 发送和接收数据

NetworkStream stream = tcpClient.GetStream();

// 发送数据

string message = "Hello, Server!";

byte[] data = Encoding.UTF8.GetBytes(message);

stream.Write(data, 0, data.Length);


// 接收数据

byte[] buffer = new byte[256];

int bytesRead = stream.Read(buffer, 0, buffer.Length);

string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);

Console.WriteLine("Received: " + response);

5. TcpClient 类的使用场景

TcpClient 主要用于开发客户端应用程序,能够与服务器通过 TCP 协议进行数据交换。典型应用场景包括:


客户端-服务器通信:客户端和服务器之间使用 TCP 连接进行数据交换,如 Web 服务客户端、文件传输客户端等。

实时通信应用:即时消息、视频通话、在线游戏等需要低延迟、高可靠性的应用。

监控系统:客户端与服务器建立连接,实时传输监控数据。

6. 完整的示例代码

using System;

using System.Net;

using System.Net.Sockets;

using System.Text;

class Program

{

static void Main()

{

string serverIp = "127.0.0.1";

int port = 12345;

try

{

// 创建 TcpClient 实例

TcpClient tcpClient = new TcpClient();

// 连接到目标服务器

tcpClient.Connect(serverIp, port);

Console.WriteLine("Connected to server.");

// 获取 NetworkStream

NetworkStream stream = tcpClient.GetStream();

// 发送数据

string message = "Hello, Server!";

byte[] data = Encoding.ASCII.GetBytes(message);

stream.Write(data, 0, data.Length);

Console.WriteLine("Sent: " + message);

// 接收数据

byte[] buffer = new byte[256];

int bytesRead = stream.Read(buffer, 0, buffer.Length);

string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);

Console.WriteLine("Received: " + response);


// 关闭流和连接

stream.Close();

tcpClient.Close();

}

catch (Exception ex)

{

Console.WriteLine("Error: " + ex.Message);

}

}

}

7. 总结

TcpClient 类是用于基于 TCP 协议进行客户端通信的重要类。它封装了连接、数据传输、异常处理等常见操作,提供了易用的 API。通过 TcpClient,你可以轻松地实现客户端与服务器之间的连接,并进行可靠的数据交换。NetworkStream 类则为数据传输提供了流式接口,使得发送和接收数据变得更加简单和直观。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/4440.html

标签: c#在线
分享给朋友:

“C#网络通信3” 的相关文章

gitlab常用命令大全

GitLab常用命令大全GitLab是一个基于Git的Web平台,它不仅提供代码托管,还集成了持续集成/持续交付(CI/CD)、代码审查、问题追踪等功能。在日常使用GitLab的过程中,我们常常需要使用一系列命令来管理代码仓库、处理分支和标签等。以下是GitLab常用的Git命令大全,并附上详细解释...

虚幻引擎5.5现已发布 手游开发、动画制作重大改进

Epic在今天发布了虚幻引擎5.5,现可通过Epic Launcher下载。此版本在动画创作、渲染、虚拟制片、移动端游戏开发和开发人员迭代工具集等方面做出了重大改进。 官方博客:虚幻引擎5.5现已发布,在动画创作、虚拟制作和移动游戏开发方面取得了显著进步,渲染、摄像机内视觉特效和开发人员迭代等领域的...

最快清除数组空值?分享 1 段优质 JS 代码片段!

本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿!大家好,我是大澈!本文约 600+ 字,整篇阅读约需 1 分钟。今天分享一段优质 JS 代码片段,用最简洁的代码清除了数组中的空值。老规矩,先阅读代码片段并思考,再看代码解析再思考,最后评论区留下你的见解!const arr...

「干货」Vue+Element前端导入导出Excel

作者:xrkffgg转发链接:https://segmentfault.com/a/11900000189936191 前言1.1 业务场景由前台导入Excel表格,获取批量数据。根据一个数组导出Excel表格。2 实现原理2.1 引入工具库file-saver、xlsx、script-loader...

VUE3+JAVA商城源码小程序APP商城

三勾小程序商城基于springboot+element-ui+uniapp打造的面向开发的小程序商城,方便二次开发或直接使用,可发布到多端,包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。软件架构后端: springboot2.3.12管...

swiper在vue中正确的使用方法

swiper是网页中非常强大的一款轮播插件,说是轮播插件都不恰当,因为它能做的事情太多了,swiper在vue下也是能用的,需要依赖专门的vue-swiper插件,因为vue是没有操作dom的逻辑的,所以写法大不一样,下面附swiper在vue中正确的使用方法1.安装swiper,执行npm ins...