C#实现简单聊天程序的方法

C#是一种非常强大的编程语言,可以用来实现各种各样的应用程序,包括聊天程序。下面是实现简单聊天程序的方法:

第一步:创建Socket

在C#中实现聊天程序的第一步是创建Socket。Socket是通信协议的一个抽象概念,它提供了一种可以在网络上发送和接收数据的方法。在C#中,可以使用System.Net.Sockets.Socket类创建Socket。

using System.Net.Sockets;

...
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

以上代码创建了一个TCP Socket。

第二步:连接到服务器

要实现聊天程序,需要客户端连接到服务器。可以使用Socket.Connect方法连接到服务器。

IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); // 服务器IP地址
int port = 8888; // 服务器端口号
socket.Connect(ipAddress, port);

以上代码连接到了IP地址为127.0.0.1、端口号为8888的服务器。

第三步:发送和接收数据

连接成功后,客户端就可以发送和接收数据了。可以使用Socket.Send方法发送数据,Socket.Receive方法接收数据。

string message = "Hello, server!";
byte[] sendData = Encoding.UTF8.GetBytes(message);
socket.Send(sendData);

byte[] receiveData = new byte[1024];
int receiveLen = socket.Receive(receiveData);
string receiveMessage = Encoding.UTF8.GetString(receiveData, 0, receiveLen);
Console.WriteLine("Server says: " + receiveMessage);

以上代码发送了一条消息给服务器,并等待服务器回复。

示例一:基于命令行的聊天程序

以下示例展示了一个基于命令行的聊天程序。客户端可以向服务器发送消息,服务器将收到的消息转发给其他客户端。

服务器端代码:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

...

class Program
{
    static List<Socket> clients = new List<Socket>(); // 所有客户端Socket
    static void Main(string[] args)
    {
        int port = 8888;
        IPAddress ipAddress = IPAddress.Any;
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);
        Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        listener.Bind(localEndPoint);
        listener.Listen(10);

        Console.WriteLine($"Server started on {ipAddress}:{port}");

        while (true)
        {
            Socket clientSocket = listener.Accept();
            Console.WriteLine($"Connected from {clientSocket.RemoteEndPoint}");
            clients.Add(clientSocket);

            // 处理客户端消息
            Thread receiveThread = new Thread(ReceiveMessage);
            receiveThread.Start(clientSocket);
        }
    }

    static void ReceiveMessage(object clientObj)
    {
        Socket client = (Socket)clientObj;

        while (true)
        {
            byte[] data = new byte[1024];
            int len = client.Receive(data);
            string message = Encoding.UTF8.GetString(data, 0, len);
            Console.WriteLine($"Message from {client.RemoteEndPoint}: {message}");

            // 转发消息给其他客户端
            foreach (Socket otherClient in clients)
            {
                if (otherClient != client)
                {
                    otherClient.Send(data, len, SocketFlags.None);
                }
            }
        }
    }
}

客户端代码:

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

...

class Program
{
    static void Main(string[] args)
    {
        int port = 8888;
        string host = "127.0.0.1";
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.Connect(host, port);
        Console.WriteLine($"Connected to {host}:{port}");

        // 发送消息
        while (true)
        {
            Console.Write("Enter message: ");
            string message = Console.ReadLine();
            byte[] data = Encoding.UTF8.GetBytes(message);
            socket.Send(data);

            // 接收消息
            byte[] receiveData = new byte[1024];
            int receiveLen = socket.Receive(receiveData);
            string receiveMessage = Encoding.UTF8.GetString(receiveData, 0, receiveLen);
            Console.WriteLine(receiveMessage);
        }
    }
}

示例二:基于WinForm的聊天程序

以下示例展示了一个基于WinForm的聊天程序。客户端可以向服务器发送消息,服务器将收到的消息转发给其他客户端。

服务器端代码:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;

...

public partial class MainForm : Form
{
    private Socket serverSocket;
    private List<Socket> clients = new List<Socket>();

    public MainForm()
    {
        InitializeComponent();
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        int port = 8888;
        IPAddress ipAddress = IPAddress.Any;
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);
        serverSocket.Bind(localEndPoint);
        serverSocket.Listen(10);
        logTextBox.AppendText($"Server started on {ipAddress}:{port}");
    }

    private void acceptButton_Click(object sender, EventArgs e)
    {
        Socket clientSocket = serverSocket.Accept();
        clients.Add(clientSocket);
        string remoteEndPoint = clientSocket.RemoteEndPoint.ToString();
        logTextBox.AppendText($"\r\nConnected from {remoteEndPoint}");

        // 启动接收消息线程
        Thread receiveThread = new Thread(ReceiveMessage);
        receiveThread.Start(clientSocket);

        // 刷新在线客户端列表
        RefreshClients();
    }

    private void ReceiveMessage(object clientObj)
    {
        Socket client = (Socket)clientObj;

        while (true)
        {
            byte[] data = new byte[1024];
            int len = client.Receive(data);
            if (len == 0)
            {
                clients.Remove(client);
                client.Close();
                logTextBox.Invoke(new Action(() =>
                {
                    logTextBox.AppendText($"\r\nDisconnected from {client.RemoteEndPoint}");
                }));
                RefreshClients();
                return;
            }

            string message = Encoding.UTF8.GetString(data, 0, len);
            logTextBox.Invoke(new Action(() =>
            {
                logTextBox.AppendText($"\r\nMessage from {client.RemoteEndPoint}: {message}");
            }));

            // 转发消息给其他客户端
            foreach (Socket otherClient in clients)
            {
                if (otherClient != client)
                {
                    otherClient.Send(data, len, SocketFlags.None);
                }
            }
        }
    }

    private void RefreshClients()
    {
        clientsListBox.Invoke(new Action(() =>
        {
            clientsListBox.Items.Clear();
            foreach (Socket client in clients)
            {
                clientsListBox.Items.Add(client.RemoteEndPoint.ToString());
            }
        }));
    }
}

客户端代码:

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

...

public partial class MainForm : Form
{
    private Socket clientSocket;

    public MainForm()
    {
        InitializeComponent();
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
        int port = 8888;
        string host = "127.0.0.1";
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        clientSocket.Connect(host, port);
        logTextBox.AppendText($"\r\nConnected to {host}:{port}");

        // 启动接收消息线程
        Thread receiveThread = new Thread(ReceiveMessage);
        receiveThread.Start();

        // 发送一条欢迎消息
        string welcomeMessage = "Welcome to chat room!";
        byte[] data = Encoding.UTF8.GetBytes(welcomeMessage);
        clientSocket.Send(data);
    }

    private void ReceiveMessage()
    {
        while (true)
        {
            byte[] receiveData = new byte[1024];
            int receiveLen = clientSocket.Receive(receiveData);
            string receiveMessage = Encoding.UTF8.GetString(receiveData, 0, receiveLen);
            logTextBox.Invoke(new Action(() =>
            {
                logTextBox.AppendText($"\r\n{receiveMessage}");
            }));
        }
    }

    private void sendButton_Click(object sender, EventArgs e)
    {
        string message = messageTextBox.Text;
        byte[] data = Encoding.UTF8.GetBytes(message);
        clientSocket.Send(data);
        messageTextBox.Clear();
    }
}

以上就是C#实现简单聊天程序的攻略,希望对你有所帮助。

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

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

相关文章

  • asp.net程序编译调试时偶尔出现访问被拒绝的错误的解决方法

    当我们在使用asp.net程序进行编译和调试时,有时候会出现访问被拒绝的错误,这可能是由于权限设置不当或操作系统安全设置问题造成的,下面我们来讲解具体的解决方法。 一、检查应用程序池的身份验证设置 访问被拒绝的错误有时可能是由于应用程序池的身份验证设置没有正确配置造成的,我们可以通过以下步骤检查应用程序池的身份验证设置进行解决: 打开Internet Inf…

    C# 2023年5月15日
    00
  • Netcore Webapi返回数据的三种方式示例

    下面我来介绍一下“Netcore Webapi返回数据的三种方式示例”的完整攻略。 概述 在开发Webapi时经常需要返回各种数据,例如字符串、Json格式数据、XML格式数据、二进制文件、图片等等。本篇文章将介绍Netcore Webapi返回数据的三种方式示例,分别为返回字符串、返回Json格式数据和返回文件。 返回字符串 在Webapi中,返回字符串最…

    C# 2023年6月3日
    00
  • C# Winfom 中ListBox的简单用法详解

    C# Winform 中 ListBox 的简单用法详解 ListBox 控件是 C# Winform 中常用的列表选择控件之一,适用于显示一组选项,并且可以使用户进行选择。 ListBox 控件的常用属性包括 Items、SelectedIndex 和 SelectedItems 等。 1. Items 属性 Items 属性是 ListBox 中的所有选…

    C# 2023年5月31日
    00
  • Linux Ubuntu系统上手动安装.NET Core SDK的方法

    在Linux Ubuntu系统上手动安装.NET Core SDK的方法如下: 添加Microsoft包存储库:首先,我们需要添加Microsoft包存储库。我们可以使用以下命令来添加: wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb…

    C# 2023年5月16日
    00
  • VC小技巧汇总之控件技巧

    VC小技巧汇总之控件技巧 简介 本篇攻略主要介绍VC小技巧汇总之控件技巧。在Windows程序编写中,控件是GUI界面中重要的元素之一。本篇攻略介绍了一些控件技巧,帮助开发者更好地使用控件。 控件技巧列表 以下是本篇攻略所涉及的控件技巧列表: 动态创建控件 在程序运行过程中动态创建控件,可以灵活地添加和移除控件。动态创建控件需要使用MFC控件类的Create…

    C# 2023年5月31日
    00
  • SMTP客户端未通过身份验证等多种错误解决方案分享

    下面是SMTP客户端未通过身份验证等多种错误解决方案分享的完整攻略: 什么是SMTP客户端未通过身份验证错误? SMTP客户端未通过身份验证错误表示,在向SMTP服务器发送邮件时,客户端未能通过身份验证,导致发送邮件失败。通常这种情况会引起SMTP服务器的拒收邮件,发件人收到类似“550 Authentication Required”的错误消息。 如何解决…

    C# 2023年5月15日
    00
  • .Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用

    下面我就来详细讲解“.Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用”的完整攻略: Winform程序运行结构图 在Winform程序的运行结构图中,分为用户界面层、业务逻辑层和数据访问层三层。用户界面层是Winform界面,它通过调用业务逻辑层的方法实现需要的功能。业务逻辑层是Winform程序中的核心…

    C# 2023年6月7日
    00
  • DataReader、DataSet、DataAdapter和DataView使用介绍

    DataReader、DataSet、DataAdapter和DataView是数据访问中常用的几个对象,下面我会详细介绍它们的作用和使用方法。 一、DataReader DataReader是一种只读的、前向的数据流,用于对数据库进行查询操作。它可以一行一行地读取查询结果,不支持对数据进行修改,适用于大数据量查询,可以最大程度减少内存占用。使用DataRe…

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