C#实现简单的聊天窗体

C#实现简单的聊天窗体

1. 确定窗体样式和布局

简单的聊天窗体通常包含一个用于显示聊天记录的文本框,一个用于输入聊天信息的文本框和一个发送按钮。布局可以使用WinForm中自带的TableLayoutPanel或者Panel组件自行进行布局设置。

2. 实现简单的网络通信

为了实现聊天功能,我们需要使用一些网络通信相关的库来帮助我们达成通信的目标,例如.NET自带的Socket编程库。可以使用TCP/IP协议来实现即时通信。这里我们使用Socket库实现简单的网络通信。

网络通信有两个主要角色:客户端和服务端。客户端负责发送聊天信息,而服务端负责接收聊天信息并将其广播给所有客户端。对于简单的聊天窗体,我们可以将客户端和服务端作为同一个程序运行。

以下是服务器代码示例:

IPAddress ipAddress = IPAddress.Parse("127.0.0.1");  // 服务器IP地址
int portNumber = 8000;  // 服务器端口号

TcpListener listener = new TcpListener(ipAddress, portNumber);
listener.Start();  // 开始监听客户端连接请求

while (true)
{
    TcpClient client = listener.AcceptTcpClient();  // 等待客户端连接

    // TODO: 处理客户端连接
}

以下是客户端代码示例:

string serverIpAddress = "127.0.0.1";  // 服务器IP地址
int serverPortNumber = 8000;  // 服务器端口号

TcpClient client = new TcpClient(serverIpAddress, serverPortNumber);
NetworkStream stream = client.GetStream();

// TODO: 发送聊天信息

3. 实现发送聊天信息的功能

在窗体类中创建UI组件,如文本框和按钮,并注册按钮的Click事件。当用户在文本框中输入聊天信息,并点击发送按钮时,将聊天信息发送给服务器。

以下是发送聊天信息的代码示例:

// 点击发送按钮
private void btnSend_Click(object sender, EventArgs e)
{
    string message = txtMessage.Text;
    byte[] messageBytes = Encoding.UTF8.GetBytes(message);
    stream.Write(messageBytes, 0, messageBytes.Length);  // 发送聊天信息到服务器

    // 清空聊天信息输入框
    txtMessage.Text = "";
}

4. 实现接收聊天信息的功能

客户端通过网络流接收来自服务器的聊天信息。当收到信息时,使用Invoke方法将文本框的Text属性更改为接收到的信息。因为Invoke方法是在UI线程上运行的,所以该方法可以安全地更改UI组件状态。

以下是接收聊天信息的代码示例:

// 在窗体初始化时启动接收线程
private void Form1_Load(object sender, EventArgs e)
{
    Thread receiveThread = new Thread(ReceiveMessages);
    receiveThread.Start();
}

// 启动接收线程
private void ReceiveMessages()
{
    while (true)
    {
        byte[] buffer = new byte[1024];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);

        if (bytesRead > 0)
        {
            // 将聊天信息添加到聊天记录文本框
            string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            AppendToChatLog(message);
        }
    }
}

// 将聊天信息添加到聊天记录文本框
private void AppendToChatLog(string message)
{
    if (txtChatLog.InvokeRequired)
    {
        txtChatLog.Invoke(new Action<string>(AppendToChatLog), message);
    }
    else
    {
        txtChatLog.AppendText(message + Environment.NewLine);
    }
}

5. 完整的源代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace SimpleChatApp
{
    public partial class MainForm : Form
    {
        private TcpClient client;
        private NetworkStream stream;

        public MainForm()
        {
            InitializeComponent();
        }

        // 窗体加载时开始连接服务器
        private void MainForm_Load(object sender, EventArgs e)
        {
            ConnectToServer();
        }

        // 连接服务器
        private void ConnectToServer()
        {
            string serverIpAddress = "127.0.0.1";  // 服务器IP地址
            int serverPortNumber = 8000;  // 服务器端口号

            client = new TcpClient(serverIpAddress, serverPortNumber);
            stream = client.GetStream();
        }

        // 点击发送按钮
        private void btnSend_Click(object sender, EventArgs e)
        {
            string message = txtMessage.Text;
            byte[] messageBytes = Encoding.UTF8.GetBytes(message);
            stream.Write(messageBytes, 0, messageBytes.Length);  // 发送聊天信息到服务器

            // 清空聊天信息输入框
            txtMessage.Text = "";
        }

        // 在窗体初始化时启动接收线程
        private void MainForm_Shown(object sender, EventArgs e)
        {
            Thread receiveThread = new Thread(ReceiveMessages);
            receiveThread.Start();
        }

        // 启动接收线程
        private void ReceiveMessages()
        {
            while (true)
            {
                byte[] buffer = new byte[1024];
                int bytesRead = stream.Read(buffer, 0, buffer.Length);

                if (bytesRead > 0)
                {
                    // 将聊天信息添加到聊天记录文本框
                    string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                    AppendToChatLog(message);
                }
            }
        }

        // 将聊天信息添加到聊天记录文本框
        private void AppendToChatLog(string message)
        {
            if (txtChatLog.InvokeRequired)
            {
                txtChatLog.Invoke(new Action<string>(AppendToChatLog), message);
            }
            else
            {
                txtChatLog.AppendText(message + Environment.NewLine);
            }
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现简单的聊天窗体 - Python技术站

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

相关文章

  • C#10的13个特性

    下面是关于C#10的13个特性的详细讲解: 新特性列表 以下是C#10中的全部13个特性: 全局 修饰符 元组投影初始值设定项 第一级模式 物化值参数 元素增强 特殊的 GetEnums() 统一处理的命名参数 异步流的增加 数组分配表达式 const 局部变量 用于对象初始化函数的 With 操作符 使用, When, And <合成> 记法来…

    C# 2023年6月1日
    00
  • Winform项目中TextBox控件DataBindings属性

    详细讲解Winform项目中TextBox控件DataBindings属性的完整攻略,包括以下几点: DataBindings属性是什么? 如何使用DataBindings属性绑定数据? 示例说明 1. DataBindings属性是什么? DataBindings是Winform中常用的一个属性,可以将控件和数据进行绑定。使用DataBindings属性可…

    C# 2023年5月31日
    00
  • C#二分查找算法实例分析

    C#二分查找算法实例分析 什么是二分查找算法? 二分查找是一种基于比较目标值和数组中间元素的教科书式算法。它只适用于已经排序的数组或者集合,并利用了数组的有序性质折半搜索。如果目标值等于中间元素,则找到目标值。如果目标值较小,继续在左侧搜索;如果目标值较大,则在右侧搜索。 二分查找算法的时间复杂度 二分查找算法的时间复杂度是O(log n),其中n是要查找的…

    C# 2023年6月8日
    00
  • C#动态绘制多条曲线的方法

    下面是详细讲解C#动态绘制多条曲线的方法的完整攻略。 标题 C#动态绘制多条曲线的方法 步骤 1. 准备工作 首先,我们需要在项目中添加Windows.Form控件和Chart控件。同时,需要引用System.Windows.Forms.DataVisualization库。 using System.Windows.Forms.DataVisualizat…

    C# 2023年6月1日
    00
  • C# 关于AppDomain的一些总结

    关于C#中的AppDomain,我来进行详细的说明和总结。 一、什么是AppDomain 在C#中,每个线程都属于一个应用程序域(AppDomain)。AppDomain是.NET中用于进程隔离的一种技术,可以将应用程序分隔为不同的域,从而提高了程序的安全性和稳定性。 AppDomain可以看作是CLR(公共语言运行库)中的一个隔离容器,它可以加载和执行单独…

    C# 2023年5月14日
    00
  • C#实现将应用程序设置为开机启动的方法

    下面我会详细讲解如何用 C# 实现将应用程序设置为开机启动的方法。 方法一:使用注册表 Windows 操作系统允许我们通过修改注册表的方式来设置开机启动程序。下面是具体的步骤: 打开注册表编辑器。在 Windows 搜索框中键入 “regedit” 并回车即可打开。 找到以下注册表路径:HKEY_CURRENT_USER\SOFTWARE\Microsof…

    C# 2023年6月7日
    00
  • C# Path.GetFileNameWithoutExtension(string path):获取指定路径的文件名(不包括扩展名)

    知识点讲解 Path.GetFileNameWithoutExtension(string path) 方法是 C# 中 Path 类的静态方法之一,这个方法的作用是获取指定路径下文件的文件名,但不包括扩展名。该方法的返回值类型是 string。 方法参数 Path.GetFileNameWithoutExtension() 方法只接受一个 string 类…

    C# 2023年4月19日
    00
  • C#实现的字符串转MD5码函数实例

    C#实现字符串转MD5码函数的攻略 什么是MD5码? MD5码(也称为MD5哈希)是一种用于数据加密的技术,它将任意长度的消息通过运算生成一个128位的输出,通常用16进制的形式表示。MD5码在信息安全领域中广泛应用,例如在网站密码的存储和校验,文件数据的完整性验证等。 在C#中实现字符串转MD5码的函数 在C#中,我们可以使用System.Security…

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