C#基于Socket的网络通信类你了解吗

C#基于Socket的网络通信类攻略

什么是基于Socket的网络通信?

基于Socket的网络通信是指利用Socket技术实现网络通信的过程。Socket(套接字)是一个通信端点,它包含了IP地址和端口号。在网络通信中,客户端和服务器端都需要创建Socket对象以便建立连接,进行数据传输。

C#实现基于Socket的网络通信的方式

在C#中实现基于Socket的网络通信,可以使用System.Net.Sockets中的TcpClient和TcpListener类。其中,TcpClient用于创建一个客户端Socket对象,TcpListener用于创建一个服务器端Socket对象。

客户端实现网络通信

  • 创建TcpClient对象:使用TcpClient类创建一个客户端Socket对象。
TcpClient client = new TcpClient(serverHost, serverPort);
  • 获取网络流:使用TcpClient对象获取网络流NetworkStream。
NetworkStream stream = client.GetStream();
  • 发送数据:使用网络流NetworkStream将数据发送到服务器端。
byte[] buffer = Encoding.ASCII.GetBytes(data);
stream.Write(buffer, 0, buffer.Length);
  • 接收来自服务器端的响应:使用网络流NetworkStream接收服务器端返回的响应。
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
  • 关闭连接:使用TcpClient和NetworkStream关闭连接。
stream.Close();
client.Close();

服务器端实现网络通信

  • 创建TcpListener对象:使用TcpListener类创建一个服务器端Socket对象。
TcpListener server = new TcpListener(localAddr, port);
  • 开始监听:使用TcpListener对象开始监听来自客户端的连接请求。
server.Start();
  • 接受连接请求:使用TcpListener对象Accept方法接受来自客户端的连接请求,并返回一个TcpClient对象。
TcpClient client = server.AcceptTcpClient();
  • 获取网络流:使用TcpClient对象获取网络流NetworkStream。
NetworkStream stream = client.GetStream();
  • 接收来自客户端的数据:使用网络流NetworkStream接收客户端发送的数据。
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
  • 发送响应:使用网络流NetworkStream将响应发送到客户端。
byte[] responseBuffer = Encoding.ASCII.GetBytes(response);
stream.Write(responseBuffer, 0, responseBuffer.Length);
  • 关闭连接:使用TcpClient和NetworkStream关闭连接。
stream.Close();
client.Close();
server.Stop();

示例

客户端发送请求,服务器端响应

客户端代码:

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

class Program {
    static void Main(string[] args) {
        string data = "Hello from client";
        string response = "";
        string serverHost = "localhost";
        int serverPort = 12345;

        TcpClient client = new TcpClient(serverHost, serverPort);
        NetworkStream stream = client.GetStream();
        byte[] buffer = Encoding.ASCII.GetBytes(data);
        stream.Write(buffer, 0, buffer.Length);

        buffer = new byte[1024];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);
        response = Encoding.ASCII.GetString(buffer, 0, bytesRead);

        Console.WriteLine("Response received from server: {0}", response);

        stream.Close();
        client.Close();
        Console.ReadKey();
    }
}

服务器端代码:

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

class Program {
    static void Main(string[] args) {
        string response = "Hello from server";
        int port = 12345;

        TcpListener server = new TcpListener(IPAddress.Any, port);
        server.Start();

        TcpClient client = server.AcceptTcpClient();
        NetworkStream stream = client.GetStream();

        byte[] buffer = new byte[1024];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);
        string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);

        Console.WriteLine("Data received from client: {0}", data);

        byte[] responseBuffer = Encoding.ASCII.GetBytes(response);
        stream.Write(responseBuffer, 0, responseBuffer.Length);

        stream.Close();
        client.Close();
        server.Stop();
        Console.ReadKey();
    }
}

服务器端广播消息

客户端代码:

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

class Program {
    static void Main(string[] args) {
        string data = "Hello from client";
        string response = "";
        string serverHost = "localhost";
        int serverPort = 12345;

        TcpClient client = new TcpClient(serverHost, serverPort);
        NetworkStream stream = client.GetStream();
        byte[] buffer = Encoding.ASCII.GetBytes(data);
        stream.Write(buffer, 0, buffer.Length);

        buffer = new byte[1024];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);
        response = Encoding.ASCII.GetString(buffer, 0, bytesRead);

        Console.WriteLine("Response received from server: {0}", response);

        stream.Close();
        client.Close();
        Console.ReadKey();
    }
}

服务器端代码:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Server {
    static void Main(string[] args) {
        int port = 12345;
        List<TcpClient> clients = new List<TcpClient>();

        TcpListener server = new TcpListener(IPAddress.Any, port);
        server.Start();
        Console.WriteLine("Server started on port {0}", port);

        while (true) {
            TcpClient client = server.AcceptTcpClient();
            clients.Add(client);
            NetworkStream stream = client.GetStream();

            byte[] welcomeBuffer = Encoding.ASCII.GetBytes("Welcome to the server!");
            stream.Write(welcomeBuffer, 0, welcomeBuffer.Length);

            Console.WriteLine("Client connected");

            byte[] buffer = new byte[1024];
            int bytesRead;
            while (true) {
                try {
                    bytesRead = stream.Read(buffer, 0, buffer.Length);
                    string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);

                    Console.WriteLine("Data received from client: {0}", data);

                    byte[] responseBuffer = Encoding.ASCII.GetBytes(data);
                    foreach(TcpClient c in clients) {
                        NetworkStream ns = c.GetStream();
                        ns.Write(responseBuffer, 0, responseBuffer.Length);
                    }
                } catch(IOException) {
                    Console.WriteLine("Client disconnected");

                    clients.Remove(client);
                    stream.Close();
                    client.Close();
                    break;
                }
            }
        }
    }
}

总结

基于Socket的网络通信是实现网络通信的一种方法,在C#中可以使用TcpClient和TcpListener类来实现。这种方法可以实现客户端与服务器端之间的数据传输。通过本文的讲解,我们学习了如何使用TcpClient和TcpListener类来实现基于Socket的网络通信,以及一些实用的示例,使我们了解了该技术的实际应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基于Socket的网络通信类你了解吗 - Python技术站

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

相关文章

  • C# DirectoryInfo.GetDirectories – 获取目录下的所有子目录信息

    C# 中的 DirectoryInfo 类提供了多种用于操作目录的方法,其中 GetDirectories 方法用于获取指定目录中的所有子目录。 方法作用 DirectoryInfo.GetDirectories 方法返回指定目录中的所有子目录的数组,该数组的元素为 DirectoryInfo 类型,可以通过该类型实例调用其它目录操作方法。 方法使用方法 语…

    C# 2023年4月19日
    00
  • C# Path.GetFileName()方法: 获取指定路径的文件名

    C#中Path.GetFileName()的作用与使用方法 在C#编程中,Path.GetFileName()用于从指定的路径中获取文件名和扩展名。 使用方法 方法的语法如下: public static string GetFileName (string path); 其中,参数path表示需要获取文件名的路径。 实例说明 例1:获取路径中的文件名 以下…

    C# 2023年4月19日
    00
  • C#实现的几种委托方式介绍

    下面是“C#实现的几种委托方式介绍”的完整攻略。 1. 委托的概念 委托(Delegate)是一种类型,它定义了一个方法(或一组方法)的参数类型和返回值类型。委托可以看做是函数的“指针”,它允许我们将方法作为参数传递,并且可以通过委托调用传递的方法。 2. 委托的定义 在 C# 中,委托定义的格式如下: delegate 返回类型 委托名称(参数类型 参数名…

    C# 2023年6月7日
    00
  • C# 特殊的string类型详解

    C# 特殊的string类型详解 什么是C#中的string类型 在C#中,字符串被定义为一系列字符的序列。C#中的string类型是个类,因此声明一个字符串时需要使用string关键字。例如: string myString = "Hello, world!"; 在上面的代码中,我们声明了一个字符串变量myString,并且将字符串常量…

    C# 2023年5月31日
    00
  • C# Rx的主要接口深入理解

    下面就为大家详细讲解一下“C# Rx的主要接口深入理解”的完整攻略。 什么是C# Rx C# Rx(Reactive Extensions)是微软提供的一组编程工具,旨在帮助开发者使用简单易懂的语法来处理异步数据流,使得代码更加简洁高效。Rx 工具包含许多接口,每个接口都具有特定的功能特性。在本文中,我们着重探讨C# Rx的主要接口。 C# Rx的主要接口 …

    C# 2023年6月1日
    00
  • 垃圾代码二三行 ASPX小马

    攻击者可以通过嵌入”垃圾代码”来在服务器上运行恶意代码,从而达到控制服务器的目的。其中,”垃圾代码二三行 ASPX小马”是一种常见的攻击手段,本文将对其进行详细讲解。 什么是”垃圾代码二三行 ASPX小马” “垃圾代码二三行 ASPX小马”是指攻击者将一小段ASP.NET代码嵌入到页面中,通过这段代码来加载运行ASPX小马,从而达到控制服务器的目的。 攻击步…

    C# 2023年5月31日
    00
  • 如何用C#实现SAGA分布式事务

    当我们进行分布式系统开发的时候,需要保证不同分布式系统节点之间的数据的一致性,同时对于不同节点的事务处理也需要保证原子性、一致性、持久性和隔离性。SAGA是IBM公司出品的分布式事务解决方案,主要通过补偿机制来保证事务的一致性,因此最近比较火热。下面我们就来详细讲解如何使用C#实现SAGA分布式事务。 一、什么是SAGA分布式事务? SAGA是分布式事务的一…

    C# 2023年5月15日
    00
  • C#基础入门之算法:交换

    C#基础入门之算法:交换 算法介绍 交换是一种常用的算法,它可以将两个变量的值互换。在编程中,交换算法经常用于排序、查找、加密等操作中。 实现方法 在C#中,实现变量交换可以采用以下四种方法: 1.使用第三个变量 int a = 3; int b = 5; int temp = a; a = b; b = temp; 2.使用加减法 int a = 3; i…

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