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日

相关文章

  • .Net Core SDK命令介绍及使用

    .Net Core SDK命令介绍及使用 在使用.Net Core开发应用程序时,我们需要使用.Net Core SDK命令来完成各种任务,例如创建项目、编译代码、运行应用程序等。本攻略将详细介绍.Net Core SDK命令的使用方法,并提供两个示例说明。 常用命令 以下是一些常用的.Net Core SDK命令: dotnet new:创建新项目或文件。…

    C# 2023年5月16日
    00
  • C#获取存储过程返回值和输出参数值的方法

    下面是详细的攻略: 获取存储过程返回值和输出参数值的方法 存储过程返回值与输出参数概述 在使用 C# 调用存储过程时,往往需要获取存储过程的返回值和输出参数的值。其中,返回值是存储过程完成操作后返回的整数值,而输出参数是从存储过程中返回的数据值。在 C# 中,可以使用 SqlCommand 类的 ExecuteNonQuery() 方法来执行存储过程,并通过…

    C# 2023年5月15日
    00
  • C#随机生成Unicode类型字符串

    下面是C#随机生成Unicode类型字符串的完整攻略。 1. 确定生成的字符串长度 首先需要决定生成的字符串长度。例如,我们想要生成一个长度为6的随机字符串。 int length = 6; 2. 获取随机码点 Unicode是一个支持世界上大多数语言的编码方案。每个字符都有一个唯一的码点,用16进制数字表示。为了生成Unicode类型的字符串,需要从Uni…

    C# 2023年6月8日
    00
  • 详解asp.net core重新加载应用配置

    详解Asp.Net Core重新加载应用配置攻略 在本攻略中,我们将深入讲解如何在Asp.Net Core应用程序中重新加载应用配置,并提供两个示例说明。 什么是重新加载应用配置? 重新加载应用配置是指在Asp.Net Core应用程序运行时,动态更改应用程序配置,而无需重新启动应用程序。这可以提高应用程序的灵活性和可维护性。 如何重新加载应用配置? 以下是…

    C# 2023年5月17日
    00
  • C#快速实现拖放操作

    下面是关于“C#快速实现拖放操作”的完整攻略。 什么是拖放操作 拖放操作是指在界面中,将某个物体从一个位置拖到另一个位置的操作。在 Web 应用程序或桌面应用程序中,拖放操作是常用的一种操作方式。 C# 快速实现拖放操作的步骤 在C#中,实现拖放操作的步骤如下: 步骤一:设置允许接受拖放操作的控件 在要接受拖放操作的控件中,设置 AllowDrop 属性为 …

    C# 2023年6月1日
    00
  • c# winform窗口一直置顶显示在桌面最上方或最底层的方法

    要让C# Winform窗口一直置顶显示在桌面的最上方或最底层需要使用其他的工具或API来实现。下面提供两种示例来解释如何实现这个功能。 方法一:使用Window API实现 可以通过调用Windows API来实现窗口置顶。具体步骤如下: 添加命名空间: using System.Runtime.InteropServices; using System.…

    C# 2023年6月7日
    00
  • C# 基于udp广播收集局域网类所有设备信息

    C# 基于UDP广播收集局域网所有设备信息攻略 简介 UDP广播是一种数据包发送方式,其中数据包被发送到网络上的所有设备而不仅仅是目标设备。这使得它成为一项非常有用的技术,因为它允许我们在局域网内查找所有的设备并进行通信。本攻略将介绍如何使用C#编写基于UDP广播收集局域网所有设备信息的程序。 攻略步骤 步骤一:创建项目 首先,你需要在Visual Stud…

    C# 2023年6月6日
    00
  • iOS省市二级联动的数据组织PHP版

    下面是“iOS省市二级联动的数据组织PHP版”详细攻略,分以下几个部分: 1.前置知识2.数据组织3.PHP实现代码4.示例说明 1.前置知识 在进行iOS省市二级联动之前,我们需要掌握以下前置知识: PHP基础语法:包括变量、数组、循环语句等 数据库基本操作:包括增删改查操作(CRUD操作) JSON数据格式:了解JSON数据结构的基本概念及用法 2.数据…

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