C#聊天程序服务端与客户端完整实例代码

下面我将为您详细讲解“C#聊天程序服务端与客户端完整实例代码”的完整攻略。

关于“C#聊天程序服务端与客户端完整实例代码”

这是一篇介绍如何使用C#语言实现聊天程序的完整攻略。其中包括服务端和客户端的完整代码。

服务端使用C#语言实现,使用TCP协议进行通信。并且,服务端为多线程模型,能够同时处理多个客户端连接请求。

客户端使用C#语言实现,可以与服务端建立连接,并且实现了在线聊天的功能。

实现步骤

下面是这篇攻略的实现步骤:

1. 创建服务端代码

服务端代码主要包括以下几个部分:

a. 建立TCP监听端口

在服务端代码中,我们需要先建立一个TCP监听端口来接收客户端的连接请求。

TcpListener listener = new TcpListener(IPAddress.Any, 8088);  
listener.Start();  

b. 接收客户端连接请求

接下来,我们需要使用AcceptTcpClient()函数接收客户端的连接请求,并且为每个连接请求创建一个线程来接收和处理客户端发送的数据。

while (true)  
{  
    TcpClient client = listener.AcceptTcpClient();  
    Thread clientThread = new Thread(handleClientRequest);  
    clientThread.Start(client);  
}  

c. 接收并处理客户端数据

对于每个客户端连接请求,我们需要在一个独立的线程中接收和处理客户端发送的数据。我们可以使用StreamReader类和StreamWriter类来读取和写入数据。

private static void handleClientRequest(object obj)  
{  
    TcpClient client = (TcpClient)obj;  
    StreamReader reader = new StreamReader(client.GetStream());  
    StreamWriter writer = new StreamWriter(client.GetStream());  
    while (true)  
    {  
        string data = reader.ReadLine();  
        Console.WriteLine("Received: {0}", data);  
        writer.WriteLine("Server Respond: " + data);  
        writer.Flush();  
    }  
}

2. 创建客户端代码

客户端代码主要包括以下几个部分:

a. 建立连接

在客户端代码中,我们需要先建立到服务端的TCP连接。

TcpClient client = new TcpClient();  
client.Connect(IPAddress.Parse("127.0.0.1"), 8088);  

b. 发送数据

在建立连接后,我们可以使用StreamWriter类向服务端发送数据。

StreamWriter writer = new StreamWriter(client.GetStream());  
string data = "Hello, server";  
writer.WriteLine(data);  
writer.Flush();  

c. 接收并处理服务端数据

对于接收和处理服务端数据,我们可以使用StreamReader类读取服务端发送的数据。

StreamReader reader = new StreamReader(client.GetStream());  
while (true)  
{  
    string data = reader.ReadLine();  
    Console.WriteLine("Received: {0}", data);  
} 

示例说明

这里提供两个示例说明:

示例一

在这个示例中,我们假设有两个客户端(A和B)连接到了服务端。当A发送一个消息给服务端时,服务端将该消息转发给B。

服务端代码如下:

//服务端代码
private static List<TcpClient> clients = new List<TcpClient>();

static void Main(string[] args)
{
    TcpListener listener = new TcpListener(IPAddress.Any, 8088);
    listener.Start();
    Console.WriteLine("Server started.");
    while (true)
    {
        TcpClient client = listener.AcceptTcpClient();
        clients.Add(client);
        Thread clientThread = new Thread(handleClientRequest);
        clientThread.Start(client);
    }
}

private static void handleClientRequest(object obj)
{
    TcpClient client = (TcpClient)obj;
    StreamReader reader = new StreamReader(client.GetStream());
    StreamWriter writer = new StreamWriter(client.GetStream());

    while (true)
    {
        string data = reader.ReadLine();
        Console.WriteLine("Received: {0}", data);

        foreach (TcpClient cl in clients)
        {
            if (cl != client)
            {
                StreamWriter writer2 = new StreamWriter(cl.GetStream());
                writer2.WriteLine(data);
                writer2.Flush();
            }
        }
    }
}

客户端A代码如下:

//客户端A代码

static void Main(string[] args)
{
    TcpClient client = new TcpClient();
    client.Connect(IPAddress.Parse("127.0.0.1"), 8088);
    Console.WriteLine("Connected to server.");
    StreamWriter writer = new StreamWriter(client.GetStream());

    Thread receiveThread = new Thread(() =>
    {
        StreamReader reader = new StreamReader(client.GetStream());
        while (true)
        {
            string data = reader.ReadLine();
            Console.WriteLine("Received from server: {0}", data);
        }
    });
    receiveThread.Start();

    while (true)
    {
        string data = Console.ReadLine();
        writer.WriteLine(data);
        writer.Flush();
    }
}

客户端B代码与客户端A基本相同。如果要在这个示例中添加更多的客户端,则只需要将new StreamReader(client.GetStream())和new
StreamWriter(cl.GetStream())中的client和cl分别替换为各自对应的客户端就可以了。

示例二

在这个示例中,我们使用Winform创建一个聊天客户端,实现多用户在线聊天。

客户端代码如下:

public partial class Form1 : Form
{
    private TcpClient client;
    private StreamReader reader;
    private StreamWriter writer;
    private Thread receiveThread;

    public Form1()
    {
        InitializeComponent();
    }

    private void connectBtn_Click(object sender, EventArgs e)
    {
        client = new TcpClient();
        client.Connect(IPAddress.Parse(ipText.Text), int.Parse(portText.Text));
        connectBtn.Enabled = false;
        sendBtn.Enabled = true;
        statusLabel.Text = "Connected to server.";
        reader = new StreamReader(client.GetStream());
        writer = new StreamWriter(client.GetStream());
        receiveThread = new Thread(() =>
        {
            while (true)
            {
                string data = reader.ReadLine();
                Invoke(new Action(() =>
                {
                    chatListBox.Items.Add(data);
                }));
            }
        });
        receiveThread.Start();
    }

    private void sendBtn_Click(object sender, EventArgs e)
    {
        string data = textBox.Text;
        writer.WriteLine(data);
        writer.Flush();
        chatListBox.Items.Add(data);
        textBox.Text = "";
    }
}

这个示例使用了Winform创建聊天客户端,在connectBtn_Click中建立到服务端的TCP连接,在sendBtn_Click中向服务端发送数据。在receiveThread线程中,
使用Invoke更新UI界面。

总结

以上就是“C#聊天程序服务端与客户端完整实例代码”的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#聊天程序服务端与客户端完整实例代码 - Python技术站

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

相关文章

  • .Net Core 3.1 Web API基础知识详解(收藏)

    .Net Core 3.1 Web API基础知识详解攻略 在本攻略中,我们将深入讲解.Net Core 3.1 Web API的基础知识,并提供两个示例说明。 什么是.Net Core 3.1 Web API? .Net Core 3.1 Web API是一种基于RESTful架构的Web服务,用于提供数据和功能给客户端应用程序。它是使用.Net Core…

    C# 2023年5月17日
    00
  • C#类中的属性使用总结(详解类的属性)

    让我来为你讲解C#类中的属性使用总结,包括什么是属性,如何定义属性,以及如何使用属性。 什么是属性 属性是一种在C#类中定义的成员,它提供了一种封装类成员变量的方式。使用属性可以控制类的成员变量的访问级别,实现对变量的可读性、可写性和可访问性的控制,从而提高类的安全性和稳定性。 在面向对象编程中,属性是类的属性(attributes)的一种表示方式。属性一般…

    C# 2023年5月31日
    00
  • c# 解决IIS写Excel的权限问题

    针对这个问题,我们需要先明确一下背景和原理。 背景 通常情况下,在我们开发 ASP.NET 程序时,会遇到需要生成 Excel 文件的情况。而在将 Excel 文件写入到服务器磁盘时,可能会面临权限不足的问题,导致写入失败。那么如何解决这个问题呢? 原理 在 IIS 中,每个应用程序池都有一个对应的身份标识,这个身份标识默认是 IIS AppPool{应用程…

    C# 2023年5月15日
    00
  • C#开发Windows服务实例之实现禁止QQ运行

    C#开发Windows服务实例之实现禁止QQ运行 1. 概述 在Windows操作系统下,我们可以通过禁止某些进程的运行来增强系统的安全性。比如,我们可以通过开发一个Windows服务程序,实现禁止QQ程序的运行。 2. 开发步骤 2.1 创建Windows服务 首先,我们需要在Visual Studio中创建一个Windows服务项目,具体步骤如下: 打开…

    C# 2023年5月15日
    00
  • C#索引器简单实例代码

    接下来我将为你详细讲解“C#索引器简单实例代码”的完整攻略。 1. 什么是C#索引器 C#索引器(indexer)是一种特殊的属性,允许类或结构中的对象通过类似于数组的方式进行索引和访问。可以理解为是类内部的一种自定义“数组”。声明一个索引器需要使用 this 关键字,接着在中括号内指定索引参数的数据类型。例如: public class MyClass {…

    C# 2023年6月3日
    00
  • ASP.NET JSON字符串与实体类的互转换示例代码

    我根据这个主题给出一份攻略。 引言 ASP.NET 是一种用于构建 Web 应用程序的框架,而 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,常用于前后端之间的数据传递。在 ASP.NET 中,我们有时候需要将 JSON 字符串转换为实体类,或者将实体类转换为 JSON 字符串。在这里,我们将会通过两个示例来…

    C# 2023年5月31日
    00
  • 解决navicat 链接oracle时出现的各种问题

    解决 Navicat 连接 Oracle 时出现的各种问题需要做以下几步: 1. 下载并安装 Oracle Instant Client 访问 Oracle 官网下载 Instant Client,需选择与你所使用操作系统相兼容的版本。下载的压缩包通常包含以下几个文件: instantclient-basiclite-linux.x64-xx.x.x.x.x…

    C# 2023年5月31日
    00
  • c#求两个数中最大值的方法

    下面是针对”C#求两个数中最大值的方法”问题的完整攻略,分为以下步骤: 1. 基本思路 我们可以使用if语句或三目运算符来比较两个数的大小,从而得到它们中的最大值。 2. 使用if语句求解 以下是使用if语句的C#代码示例: int a = 5; int b = 10; int max = 0; if (a > b) { max = a; } else…

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