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# SyncRoot:获取可用于同步对集合的访问的对象

    C# SyncRoot 完整攻略 什么是 C# SyncRoot 在 C# 中,SyncRoot 是一个实现了 ICollection 接口的对象的同步根对象。它通常是一个对象,用来充当锁。 可以通过以下代码将 SyncRoot 属性访问锁对象: ICollection myCollection = …; object myLock = myCollec…

    C# 2023年4月19日
    00
  • .NET基础面试题整理小结

    针对“.NET基础面试题整理小结”的攻略,我可以提供以下的完整过程和示例说明: 1. 确定文章的主旨和目标读者 首先需要明确,文章的主旨是整理.NET基础面试题,并对每个问题进行详细解答;目标读者是那些正在学习.NET编程或者准备参加.NET相关面试的人员。 2. 收集面试题库,按照分类整理 在整理.NET基础面试题时,需要先收集全面的面试题库,包括语言基础…

    C# 2023年6月6日
    00
  • UnityShader使用图像叠加实现运动模糊

    下面是详细讲解”Unity Shader使用图像叠加实现运动模糊”的攻略。 一、前言 在实现游戏视觉效果时,运动模糊是一种非常实用的手段。运动模糊使用了相邻的帧并取平均值以模拟运动物体的模糊效果,使动作看起来更加连续、自然。 二、实现思路 运动模糊的实现思路是将相邻的帧的图像进行叠加处理,最后再进行取平均。具体实现时,需要使用相机的 RenderTextur…

    C# 2023年6月3日
    00
  • 深入理解C#中常见的委托

    深入理解C#中常见的委托 委托的定义 委托(Delegate)是一种类型,它可以封装一个方法,使该方法像一个对象实例一样被传递。委托可以像其他任何对象一样进行实例化和调用,其实质是把方法作为参数进行传递和执行。在C#当中,定义委托类型需要使用delegate关键字: delegate void MyDelegate(int param); 以上代码定义了一个…

    C# 2023年5月31日
    00
  • 在Winform框架界面中改变并存储界面皮肤样式的方法

    下面是在Winform框架中改变并存储界面皮肤样式的完整攻略: 1.创建皮肤风格文件 首先,需要准备一些用于表示不同皮肤风格的文件。在这里我们可以使用 JSON 文件来存储皮肤风格相关的属性,例如颜色、字体、大小等信息。具体来说,我们可以为每个皮肤风格创建一个以 .json 为后缀的文件,文件中包含了该皮肤的各项属性。 示例:下面是一个表示深色主题的 dar…

    C# 2023年6月3日
    00
  • C#批量更新sql实例

    C#批量更新SQL实例 在C#中,我们可以使用 SQLCommand 对象来执行SQL语句操作数据库。为了提高效率,在需要批量更新数据库时,我们可以使用 SQLCommand 对象的批处理功能。 批处理功能 使用 SQLCommand 对象的 ExecuteNonQuery 方法执行SQL语句时,我们可以使用批处理方法 ExecuteNonQueryAsyn…

    C# 2023年6月2日
    00
  • 日常收集C#接口知识(知识全面)

    日常收集 C# 接口知识(知识全面) 简介 在日常写 C# 代码的过程中,我们会接触到各种各样的接口。为了更好地了解和掌握 C# 的接口知识,我们需要不断地进行学习和整理。本文将提供一些收集 C# 接口知识的建议和步骤,帮助读者全面掌握 C# 接口知识。 收集步骤 1. 阅读官方文档 首先,我们可以阅读 Microsoft 的官方文档。在 官方文档 中,我们…

    C# 2023年5月15日
    00
  • C#实现简单点餐系统

    C#实现简单点餐系统攻略 介绍 本攻略将为读者讲解如何使用C#语言实现一个简单点餐系统,通过此系统用户可以选择不同菜品并形成订单。此攻略将分为以下几个步骤: 确定功能需求 搭建开发环境 设计程序架构 编写程序代码 测试和优化 在了解了以上步骤后,我们将通过两个示例来说明如何具体实现。 确定功能需求 在开始编写任何程序之前,首先需要明确需求。在这个简单的点餐系…

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