C# Socket的TCP通讯的实例代码

我们来详细讲解一下“C# Socket的TCP通讯的实例代码”的完整攻略。

1. 引言

Socket 是实现网络通信协议的一种方法,可以实现不同计算机之间的数据交互。而 TCP 是面向连接的、可靠的、基于字节流的传输控制协议。在 C# 中,可以使用 Socket 类实现 TCP 协议的通讯。下面我们将介绍如何实现一个简单的 TCP 通讯程序。

2. 步骤

2.1 建立服务器端

服务器端需要监听端口,等待客户端的连接请求,并且在接受到客户端请求时,创建新的连接用于通讯。以下是服务器端的代码示例:

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

class Server {
    public static void Main() {
        IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
        int port = 8001;
        TcpListener tcpListener = new TcpListener(ipAddress, port);
        tcpListener.Start();
        Console.WriteLine("服务器已启动,等待客户端连接...");
        while (true) {
            TcpClient tcpClient = tcpListener.AcceptTcpClient();
            Console.WriteLine("客户端已连接:" + tcpClient.Client.RemoteEndPoint.ToString());
            // 开启一个线程进行通讯
        }
    }
}

2.2 建立客户端

客户端需要连接服务器,并且在连接成功后,可以使用 Socket 进行通讯。以下是客户端的代码示例:

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

class Client {
    public static void Main() {
        IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
        int port = 8001;
        TcpClient tcpClient = new TcpClient();
        tcpClient.Connect(ipAddress, port);
        Console.WriteLine("已连接服务器:" + tcpClient.Client.RemoteEndPoint.ToString());
        // 开启一个线程进行通讯
    }
}

2.3 进行通讯

在建立好服务器端和客户端之后,需要在服务器端和客户端均开启一个线程进行通讯,以保证可以同时进行多个连接的通讯。以下是服务器端和客户端通讯的代码示例:

// 服务器端
TcpClient tcpClient = tcpListener.AcceptTcpClient();
Console.WriteLine("客户端已连接:" + tcpClient.Client.RemoteEndPoint.ToString());
NetworkStream networkStream = tcpClient.GetStream();
while (true) {
    byte[] bytes = new byte[1024];
    int bytesRead = networkStream.Read(bytes, 0, bytes.Length);
    if (bytesRead > 0) {
        string data = Encoding.Default.GetString(bytes, 0, bytesRead);
        Console.WriteLine("收到客户端的消息:" + data);
        // 回复消息
        byte[] replyBytes = Encoding.Default.GetBytes("已收到消息:" + data);
        networkStream.Write(replyBytes, 0, replyBytes.Length);
    }
}

// 客户端
TcpClient tcpClient = new TcpClient();
tcpClient.Connect(ipAddress, port);
Console.WriteLine("已连接服务器:" + tcpClient.Client.RemoteEndPoint.ToString());
NetworkStream networkStream = tcpClient.GetStream();
while (true) {
    Console.WriteLine("请输入要发送的消息:");
    string message = Console.ReadLine();
    byte[] data = Encoding.Default.GetBytes(message);
    networkStream.Write(data, 0, data.Length);
    // 接收服务器端回复的消息
    byte[] bytes = new byte[1024];
    int bytesRead = networkStream.Read(bytes, 0, bytes.Length);
    if (bytesRead > 0) {
        string reply = Encoding.Default.GetString(bytes, 0, bytesRead);
        Console.WriteLine("收到回复:" + reply);
    }
}

3. 总结

本文主要介绍了如何使用 C# 中的 Socket 类实现 TCP 协议的通讯,并且提供了建立服务器端和客户端的示例代码。在实际应用中,需要注意数据的编码和解码,以及服务器端和客户端的并发性和安全性等问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# Socket的TCP通讯的实例代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • 详解C# 结构体

    详解C#结构体 结构体(Struct)是C#中的一种数据类型,与类相似,能够封装数据和行为。本文将从以下几个方面进行详解: 结构体的定义和特点 结构体的实例化和使用方法 结构体和类的区别和联系 结构体的定义和特点 结构体的定义方式与类类似,但使用struct关键字。 以下是一个定义结构体的示例,可以存储一个人的姓名和年龄: struct Person { p…

    C# 2023年5月15日
    00
  • 精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换攻略 本文将详细介绍如何实现SQL SERVER与ACCESS、EXCEL之间的数据导入导出转换,包括建立连接、执行SQL查询、导入导出数据等。 建立连接 要在SQL SERVER中操作ACCESS或EXCEL数据,必须先建立连接。在SQL SERVER中,可以使用ODBC数据源…

    C# 2023年6月8日
    00
  • 纯C#实现Hook功能详解

    纯C#实现Hook功能详解 什么是Hook 在计算机编程领域,Hook是指拦截某个操作,加入自定义的操作或者修改已有操作的过程。 Hook的种类 Windows系统中可用的Hook种类有三种: 全局钩子(Global Hook) 全局钩子会影响整个操作系统,可以拦截鼠标、键盘、消息、Shell等等所有操作,需要管理员权限安装和使用,且有一定的性能损失。 线程…

    C# 2023年6月6日
    00
  • C# .NET 中的缓存实现详情

    C#.NET中的缓存实现详情 什么是缓存? 缓存是计算机中常用的性能优化机制之一,它将一些已经经过计算的数据暂存在计算机的内存中,以便后续的使用,以减少后续访问时的计算代价。 C#.NET中的缓存实现 在C#.NET中,可以使用System.Runtime.Caching命名空间中的MemoryCache类进行缓存的实现。 MemoryCache类的基本用法…

    C# 2023年5月15日
    00
  • C#泛型运作原理的深入理解

    C#泛型运作原理的深入理解 C#中的泛型是一种能够在编译时期实现类型安全和可重用性的技术,使用泛型可以提高代码的可读性、可维护性和灵活性,因此对于开发大型应用程序来说具有非常重要的意义。下面分为三个部分来详细介绍C#泛型的运作原理。 常规类型与泛型类型 C#中的类型可分为两类:常规类型和泛型类型。 常规类型常规类型是指在编译时期就已经确定数据类型的类型,例如…

    C# 2023年5月15日
    00
  • unity通过Mesh网格绘制图形球体

    下面是Unity通过Mesh网格绘制图形球体的完整攻略: 准备工作 首先,在开始绘制球体之前,我们需要先做一些准备工作。 在Unity的场景中创建一个空物体。 给该空物体添加MeshFilter和MeshRenderer组件(如果没有的话),以便我们可以在场景中看到球体。 创建一个新的C#脚本,并将其命名为“MeshCreator”(我们需要用它来实现网格绘…

    C# 2023年6月3日
    00
  • Asp.net 通用万级数据分页代码[修正下载地址]

    Asp.net 通用万级数据分页代码是一个用于实现数据分页的工具库。下面将给出该工具库的详细攻略: 安装 可以通过Nuget进行安装,输入以下命令即可: Install-Package AspNetPager 安装完成后可以通过以下命名引用Asp.net分页控件: using Wuqi.Webdiyer; 使用方法 在前端页面中添加控件 在前端页面中引用控件…

    C# 2023年5月31日
    00
  • c# 如何用lock解决缓存击穿

    当系统中缓存访问热点集中,且其中某些key的缓存失效时间过短,导致大量的请求直接访问DB,从而在DB上产生很大的压力,遇到高并发情况下往往会导致系统崩溃。这种情况就被称为“缓存击穿”。 C#语言提供了一种避免缓存击穿的方法,就是使用lock关键字,将可能产生高并发的代码块锁住,这样系统中只有一个线程能够访问这段代码,从而避免了缓存击穿的情况。 下面是使用lo…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部