C#利用服务器实现客户端之间通信

C#利用服务器实现客户端之间通信

在C#中,我们可以使用 TCP、UDP 等协议,以及 socket 编程来实现客户端之间的通信。下面将详细介绍基于 TCP 协议的服务器和客户端之间的通信实现。

环境准备

在进行操作之前,需要准备以下环境:

  • 安装 Visual Studio 开发工具
  • 使用 C# 语言进行开发

服务器端代码

1. 引入命名空间

要使用 socket 进行编程,需要使用 System.Net 命名空间。

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

2. 定义服务器

服务器可以使用 Socket 类实现。

IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;

TcpListener server = new TcpListener(ip, port);

3. 开始监听

将服务器绑定到本地 IP 地址和端口,并开始监听来自客户端的连接请求。

server.Start();

4. 接受客户端连接请求

等待客户端的连接请求,并接受连接请求。

TcpClient client = server.AcceptTcpClient();

5. 接受客户端发送的数据

接受客户端发送的数据,并将数据存储在一个 byte 数组中。

NetworkStream stream = client.GetStream();
byte[] data = new byte[1024];
stream.Read(data, 0, data.Length);

6. 发送数据到客户端

向客户端发送数据,可以使用 NetworkStream.Write 方法。

string message = "Hello Client!";
byte[] data = Encoding.ASCII.GetBytes(message);
stream.Write(data, 0, data.Length);

7. 关闭连接

关闭客户端连接。

client.Close();

完整代码示例

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

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            int port = 8888;

            TcpListener server = new TcpListener(ip, port);
            server.Start();
            Console.WriteLine("Server Started.");

            TcpClient client = server.AcceptTcpClient();
            Console.WriteLine("Client Connected.");

            NetworkStream stream = client.GetStream();
            byte[] data = new byte[1024];
            stream.Read(data, 0, data.Length);
            string message = Encoding.ASCII.GetString(data);
            Console.WriteLine($"Received {message}");

            message = "Hello Client!";
            data = Encoding.ASCII.GetBytes(message);
            stream.Write(data, 0, data.Length);
            Console.WriteLine($"Sent {message}");

            client.Close();
            Console.WriteLine("Client Disconnected.");

            server.Stop();
            Console.WriteLine("Server Stopped.");
        }
    }
}

客户端代码

1. 引入命名空间

同样需要使用 System.Net 命名空间。

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

2. 客户端连接服务器

向服务器发送请求,并连接到服务器。

IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;

TcpClient client = new TcpClient();
client.Connect(ip, port);

3. 向服务器发送数据

客户端发送数据到服务器,并接收服务器返回的数据。

NetworkStream stream = client.GetStream();
string message = "Hello Server!";
byte[] data = Encoding.ASCII.GetBytes(message);
stream.Write(data, 0, data.Length);

data = new byte[1024];
stream.Read(data, 0, data.Length);
message = Encoding.ASCII.GetString(data);
Console.WriteLine($"Received {message}");

4. 关闭连接

关闭客户端连接。

client.Close();

完整代码示例

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

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            int port = 8888;

            TcpClient client = new TcpClient();
            client.Connect(ip, port);
            Console.WriteLine("Connected to Server.");

            NetworkStream stream = client.GetStream();
            string message = "Hello Server!";
            byte[] data = Encoding.ASCII.GetBytes(message);
            stream.Write(data, 0, data.Length);

            data = new byte[1024];
            stream.Read(data, 0, data.Length);
            message = Encoding.ASCII.GetString(data);
            Console.WriteLine($"Received {message}");

            client.Close();
            Console.WriteLine("Disconnected.");
        }
    }
}

示例说明

示例1

假设有两个客户端A和B,客户端A向服务端发送消息“Hello Server!”,服务端接收到消息后再发送消息“Hello Client!”,客户端A接收到消息后打印出来。

服务端代码:

IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;

TcpListener server = new TcpListener(ip, port);
server.Start();
Console.WriteLine("Server Started.");

TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Client Connected.");

NetworkStream stream = client.GetStream();
byte[] data = new byte[1024];
stream.Read(data, 0, data.Length);
string message = Encoding.ASCII.GetString(data);
Console.WriteLine($"Received {message}");

message = "Hello Client!";
data = Encoding.ASCII.GetBytes(message);
stream.Write(data, 0, data.Length);
Console.WriteLine($"Sent {message}");

client.Close();
Console.WriteLine("Client Disconnected.");

server.Stop();
Console.WriteLine("Server Stopped.");

客户端A代码:

IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;

TcpClient client = new TcpClient();
client.Connect(ip, port);
Console.WriteLine("Connected to Server.");

NetworkStream stream = client.GetStream();
string message = "Hello Server!";
byte[] data = Encoding.ASCII.GetBytes(message);
stream.Write(data, 0, data.Length);

data = new byte[1024];
stream.Read(data, 0, data.Length);
message = Encoding.ASCII.GetString(data);
Console.WriteLine($"Received {message}");

client.Close();
Console.WriteLine("Disconnected.");

示例2

在示例1的基础上,增加客户端B,表示客户端B向服务端发送消息“Hello Server too!”,服务端接收到消息后再发送消息“Hello Client too!”给客户端B,并且客户端B接收到消息后打印出来。

服务端代码:

IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;

TcpListener server = new TcpListener(ip, port);
server.Start();
Console.WriteLine("Server Started.");

TcpClient clientA = server.AcceptTcpClient();
Console.WriteLine("Client A Connected.");

NetworkStream streamA = clientA.GetStream();
byte[] dataA = new byte[1024];
streamA.Read(dataA, 0, dataA.Length);
string messageA = Encoding.ASCII.GetString(dataA);
Console.WriteLine($"Received {messageA}");

messageA = "Hello Client A!";
dataA = Encoding.ASCII.GetBytes(messageA);
streamA.Write(dataA, 0, dataA.Length);
Console.WriteLine($"Sent {messageA}");

TcpClient clientB = server.AcceptTcpClient();
Console.WriteLine("Client B Connected.");

NetworkStream streamB = clientB.GetStream();
byte[] dataB = new byte[1024];
streamB.Read(dataB, 0, dataB.Length);
string messageB = Encoding.ASCII.GetString(dataB);
Console.WriteLine($"Received {messageB}");

messageB = "Hello Client B!";
dataB = Encoding.ASCII.GetBytes(messageB);
streamB.Write(dataB, 0, dataB.Length);
Console.WriteLine($"Sent {messageB}");

clientA.Close();
Console.WriteLine("Client A Disconnected.");

clientB.Close();
Console.WriteLine("Client B Disconnected.");

server.Stop();
Console.WriteLine("Server Stopped.");

客户端A代码:

IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;

TcpClient client = new TcpClient();
client.Connect(ip, port);
Console.WriteLine("Connected to Server.");

NetworkStream stream = client.GetStream();
string message = "Hello Server!";
byte[] data = Encoding.ASCII.GetBytes(message);
stream.Write(data, 0, data.Length);

data = new byte[1024];
stream.Read(data, 0, data.Length);
message = Encoding.ASCII.GetString(data);
Console.WriteLine($"Received {message}");

client.Close();
Console.WriteLine("Disconnected.");

客户端B代码:

IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;

TcpClient client = new TcpClient();
client.Connect(ip, port);
Console.WriteLine("Connected to Server.");

NetworkStream stream = client.GetStream();
string message = "Hello Server too!";
byte[] data = Encoding.ASCII.GetBytes(message);
stream.Write(data, 0, data.Length);

data = new byte[1024];
stream.Read(data, 0, data.Length);
message = Encoding.ASCII.GetString(data);
Console.WriteLine($"Received {message}");

client.Close();
Console.WriteLine("Disconnected.");

以上就是基于 TCP 协议的服务器和客户端之间通信的完整攻略,希望可以帮助您进行相关的开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#利用服务器实现客户端之间通信 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#递归读取XML菜单数据的方法

    在C#中,我们可以使用递归方法来读取XML菜单数据。递归方法是一种自我调用的方法,它可以在方法内部调用自身,以便处理嵌套的数据结构。本文将介绍如何使用递归方法来读取XML菜单数据,并提供两个示例来演示如何使用这些技术。 读取XML菜单数据的方法 以下是读取XML菜单数据的步骤: 创建一个XmlDocument对象,用于加载XML文件。 使用XmlDocume…

    C# 2023年5月15日
    00
  • ASP实现加法验证码

    实现加法验证码的过程可以分为以下几个步骤: 步骤一:生成加法算式 我们需要在服务器端生成一道简单的加法算式作为验证码,同时将其保存在会话(session)中,方便后续验证操作的进行。代码片段如下: <% Dim num1, num2, code Randomize ‘初始化随机数生成器 num1 = Int(Rnd() * 10) ‘生成0~9之间的随…

    C# 2023年6月1日
    00
  • 浅谈C#单例模式的实现和性能对比

    下面是详细讲解“浅谈C#单例模式的实现和性能对比”的完整攻略。 什么是单例模式? 单例模式是一种创建型设计模式,在整个应用程序运行期间只有一个实例存在,使用该实例来控制其他对象的访问权限。常用于需要严格控制全局资源的情况,例如数据库连接池、线程池和缓存等。 单例模式的实现方法 C#中单例模式的实现方法主要有以下两种: 1. 饿汉式单例模式 饿汉式单例模式是指…

    C# 2023年6月7日
    00
  • C#实现批量更改文件名称大小写或扩展名

    下面是详细讲解“C#实现批量更改文件名称大小写或扩展名”的完整攻略。 问题描述 有时候我们需要将多个文件的名称进行更改,例如将文件名称的大小写规范化,或者将文件的拓展名更改为另一种形式。手动更改一两个文件可以使用Windows资源管理器来完成,但如果需要更改数量较多的文件,则手动操作将非常费时费力。因此,我们需要一种批量操作的方法。 解决方案 我们可以使用C…

    C# 2023年6月1日
    00
  • C#创建自签名认证文件的方法

    下面为您详细讲解C#创建自签名认证文件的方法的完整攻略。 什么是自签名认证文件 自签名认证文件是用来对软件代码进行签名的一种证书,用于保证软件代码的来源和完整性。 C#中也支持使用自签名认证文件对程序集进行签名,使程序能够在运行时通过CAS(代码访问安全性)校验。 创建自签名认证文件的步骤 第一步:生成证书文件 可以使用makecert工具来生成自签名证书文…

    C# 2023年6月1日
    00
  • c#和avascript加解密之间的互转代码分享

    下面是详细的“c#和Javascript加解密之间的互转代码分享”的完整攻略。 什么是加解密? 加密是将明文转换成密文的过程,解密是将密文转换成明文的过程。这种加解密的过程是为了保证信息的安全性,防止敏感信息被窃听。 c#和Javascript加解密 在c#和Javascript中,通常使用对称加密算法和非对称加密算法进行加密和解密。 对称加密算法:使用同一…

    C# 2023年6月7日
    00
  • c# 实现模糊PID控制算法

    c# 实现模糊PID控制算法攻略 什么是PID控制? PID控制是指通过对被控对象给出适当的控制量来使被控对象的输出接近于所要求的期望输出,并且能够根据被控对象给出的反馈信息来调整控制量,从而提高控制的精度。PID控制算法包含三个部分,分别是比例控制、积分控制、微分控制。 什么是模糊PID控制? 对于一些非线性或者模糊的系统,传统PID控制算法无法处理。此时…

    C# 2023年6月1日
    00
  • C# 使用Log4net添加日志记录的方法

    下面是“C# 使用Log4net添加日志记录的方法”的完整攻略,包含以下内容: Log4net 简介 安装 Log4net 在 C# 中使用 Log4net 记录日志 配置 Log4net 输出日志的方式 示例演示 Log4net 简介 Log4net 是一个功能强大的日志组件,它是Apache的开源日志组件。使用 Log4net 可以在程序中方便地记录日志…

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