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#(.Net)将非托管dll嵌入exe中的实现

    C# (.Net)可以嵌入非托管dll文件到exe文件中,使得软件的分发和运行更加简单。下面是该过程的实现攻略: 第一步:创建工程 首先,在Visual Studio中创建一个C#应用程序工程。然后,添加非托管dll文件到项目中。注意,该dll文件必须与工程中的所有程序集(包括已添加的其他dll文件)都是兼容的,否则该dll文件会导致工程编译失败。 第二步:…

    C# 2023年6月1日
    00
  • ASP.NET MVC 项目直接预览PDF文件

    ASP.NET MVC 是一种在 ASP.NET 框架下使用的 Web 应用程序框架。我们可以通过 ASP.NET MVC 将应用程序分为三个主要部分: 模型(Model)、视图(View)和控制器(Controller)。在 ASP.NET MVC 项目中,如果需要直接预览 PDF 文件,我们可以通过以下步骤来实现: 1. 生成 PDF 文件 我们可以使用…

    C# 2023年5月31日
    00
  • c#委托与事件(详解)

    C#委托与事件(详解) 什么是委托? 在C#中,委托是一个类,用于指向和调用一个或多个方法。可以将委托看做是方法的类型。通过委托,我们可以在运行时确定要调用哪个方法,而无需提前确定调用哪个方法。 如何定义委托? 在C#中,委托的定义非常简单,只需使用delegate关键字即可。 delegate 返回类型 委托名称(参数列表); 其中, 返回类型:委托指向方…

    C# 2023年6月1日
    00
  • c#使用dynamic类型优化反射的方法

    下面是详细讲解“c#使用dynamic类型优化反射的方法”的完整攻略。 1. 前言 在C#中,使用反射可以在运行时动态地获取类型信息并对这些类型进行操作,是一种强大的编程工具。但反射也有一定的缺点,使用反射访问和操作类型的性能相对较低,尤其是当需求需要重复调用反射代码时,这种性能劣势就更加明显。因此,为了更好地优化反射操作的性能,C#提供了一种dynamic…

    C# 2023年5月15日
    00
  • C# Linq的SkipWhile()方法 – 跳过序列中的元素,直到某个元素不满足

    下面是关于 C# Linq 的 SkipWhile() 的完整攻略。 SkipWhile() 简介 SkipWhile() 方法是 C# Linq 中的一种用来过滤序列的方法,其参数为一个带有一个参数和一个返回bool类型的委托,该委托定义了决定跳过哪些元素的方法。SkipWhile() 方法会跳过序列中开头符合条件的元素,直到遇到第一个不符合条件的元素为止…

    C# 2023年4月19日
    00
  • C# WPF上位机实现和下位机TCP通讯的方法

    下面是对于“C# WPF上位机实现和下位机TCP通讯的方法”的完整攻略: 1. 概述 要实现 C# WPF 上位机和下位机(例如单片机)之间的 TCP 通讯,可以分为以下三个步骤:1. 建立 TCP 连接2. 实现数据的发送和接收3. 关闭 TCP 连接 这三个步骤的具体实现细节将在下面讨论,示例将基于 C# 语言和 WPF 框架。 2. 建立 TCP 连接…

    C# 2023年5月15日
    00
  • ASP.NET Core 实现基本认证的示例代码

    当我们需要给我们的Web应用程序添加身份验证功能时,可以使用ASP.NET Core来实现,ASP.NET Core实现身份验证的主要方法是使用中间件,即Microsoft.AspNetCore.Authentication中的中间件。 在此,我将介绍如何使用ASP.NET Core来实现基本身份验证,并提供两个示例说明。 实现基本身份验证的示例代码 1. …

    C# 2023年5月31日
    00
  • DataReader、DataSet、DataAdapter和DataView使用介绍

    DataReader、DataSet、DataAdapter和DataView是数据访问中常用的几个对象,下面我会详细介绍它们的作用和使用方法。 一、DataReader DataReader是一种只读的、前向的数据流,用于对数据库进行查询操作。它可以一行一行地读取查询结果,不支持对数据进行修改,适用于大数据量查询,可以最大程度减少内存占用。使用DataRe…

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