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#中调用Servlet示例

    下面就详细讲解“C#中调用Servlet示例”的完整攻略。 概述 在C#中调用Servlet可以使用HttpClient来实现。HttpClient是一个.NET框架的类库,它是对HTTP请求和响应的封装,可以用来发送HTTP请求和接收HTTP响应。 步骤 引入HttpClient的命名空间: using System.Net.Http; 创建HttpCli…

    C# 2023年5月15日
    00
  • asp.net 数据类型转换类代码

    当在ASP.NET中开发应用程序时,将涉及到将不同数据类型之间进行转换的情况,例如将字符串转换为整数、将浮点数转换为字符串等等。为了简化这些转换过程,ASP.NET提供了多个转换类,包括Convert类和Parse类。 一、Convert类 Convert类提供了各种从一种数据类型到另一种数据类型的静态方法。常用的方法包括: ToInt32()方法:将字符串…

    C# 2023年5月31日
    00
  • C#移除字符串中的不可见Unicode字符 案例代码

    C#移除字符串中的不可见Unicode字符的完整攻略如下: 问题背景 在开发中,有时候字符串中可能会包含非常规的字符,例如不可见的Unicode字符。这些字符虽然不会影响字符串的显示,但会影响字符串的处理和运算。因此,需要移除字符串中的这些非常规字符,以便更好地进行后续的操作。 解决方案 我们可以通过正则表达式来匹配和替换字符串中的非常规字符。具体实现步骤如…

    C# 2023年5月31日
    00
  • 在ASP.NET Core5.0中访问HttpContext的方法步骤

    在ASP.NET Core 5.0中访问HttpContext的方法步骤 在ASP.NET Core 5.0应用程序中,HttpContext是一个非常重要的对象,它提供了许多有用的信息和功能,例如请求和响应对象、用户身份验证信息、会话状态等。本攻略将介绍如何在ASP.NET Core 5.0应用程序中访问HttpContext对象。 步骤 以下是在ASP.…

    C# 2023年5月17日
    00
  • C#集合本质之链表的用法详解

    C#集合本质之链表的用法详解 什么是链表 链表是一种常见的数据结构,它由一些节点组成,每个节点存储着数据和指向下一个节点的地址。链表的优点在于可以动态添加、删除节点,数据的操作效率较高。 在C#中,链表是一种集合类,实现了ICollection和IEnumerable接口,提供了许多常见的操作方法。 链表的构造 在使用链表之前,需要使用LinkedList&…

    C# 2023年5月31日
    00
  • C#遍历文件夹后上传文件夹中所有文件错误案例分析

    下面是“C#遍历文件夹后上传文件夹中所有文件错误案例分析”的完整攻略。 问题描述 在使用C#编写上传文件夹中所有文件的程序时,如果不注意程序的细节,很容易出现错误。其中一个常见的错误情况是: 在遍历文件夹的过程中,存在文件夹中包含文件夹的情况。如果不对这些内层文件夹进行正确的处理,就会造成上传的文件丢失或上传失败等问题。 下面我们来介绍一些正确处理内层文件夹…

    C# 2023年5月14日
    00
  • asp.net下Cache 缓存操作类代码

    下面是“asp.net下Cache 缓存操作类代码”的完整攻略。 一、Cache 缓存操作类简介 在 ASP.NET 中, Cache 缓存是一个非常有用的功能,它能够快速地提高网页的访问速度、降低服务器负载、提高用户体验。Cache 缓存是一个键值对的数据结构,用来存储经常使用的数据,以便快速访问。缓存在内存中,因此访问速度非常快。 向 Cache 缓存中…

    C# 2023年5月31日
    00
  • C#实现程序等待延迟执行的方法

    首先,C#中实现程序等待延迟执行的方法有多种,其中比较常用的有以下两种: Thread.Sleep()方法 这种方法实现起来比较简单,通过让线程休眠指定的时间(以毫秒为单位),使得程序延迟执行。示例代码如下所示: using System; using System.Threading; class Program { static void Main(st…

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