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日

相关文章

  • C#中文件名或文件路径非法字符判断方法

    当我们在使用C#编程的时候,经常会遇到需要判断文件名或文件路径是否包含非法字符的情况。本文将介绍C#中文件名或文件路径非法字符的判断方法。 判断非法字符的常规方法 C#中提供了一种常规的方法来判断文件名或文件路径是否包含非法字符: var illegalChars = System.IO.Path.GetInvalidFileNameChars(); boo…

    C# 2023年6月1日
    00
  • C# DataTable常见用法汇总

    C# DataTable常见用法汇总 本攻略将详细讲解C# DataTable的常见用法,包括创建、增删改查、排序、筛选、数据类型转换等。 创建DataTable 创建DataTable之前需要先声明DataTable对象和数据列,并在表对象中添加数据列,代码如下: //声明表对象 DataTable dt = new DataTable(); //添加数据…

    C# 2023年5月31日
    00
  • c#创建浮动工具栏功能示例

    下面是关于“c#创建浮动工具栏功能示例”的完整攻略: 1. 理解浮动工具栏 浮动工具栏指的是一类在应用程序中可以自由移动的控件集合。在 C# 语言中,我们可以使用菜单和工具栏的组合来实现浮动工具栏的功能。 在实现浮动工具栏前,我们需要做以下准备工作: 在代码中创建菜单栏和工具栏,并设置相应的点击事件程序; 构建浮动工具栏并将其放置在应用程序窗口中。 下面,我…

    C# 2023年6月3日
    00
  • C#实现文本文件读写方法汇总

    关于“C#实现文本文件读写方法汇总”,我将会提供以下完整的攻略: C#实现文本文件读写方法汇总 一、写入文本文件 1. 使用StreamWriter 可以使用 System.IO.StreamWriter 类来写入文本文件。下面是一个简单的示例,演示了如何使用该类将字符串写入到文本文件中: using System.IO; string filePath =…

    C# 2023年6月6日
    00
  • C#中实现在32位、64位系统下自动切换不同的SQLite dll文件

    实现在32位、64位系统下自动切换不同的SQLite dll文件,需要做以下几个步骤: 导入SQLite.Interop.dll文件 在C#项目中使用SQLite时,需要引入SQLite.Interop.dll文件,该文件是SQLite官方提供的用于自动切换32位、64位dll文件的库文件。在VS中创建C#项目后,可以直接从NuGet中搜索SQLite.In…

    C# 2023年6月7日
    00
  • 利用C#实现进程管理器

    利用C#实现进程管理器 概述 进程管理器是一款常见的系统工具,用于查看当前系统正在运行的进程,以及进行操作,例如结束进程,查看进程详细信息等等。本文将利用C#语言,实现一个进程管理器。 实现步骤 获取系统中所有的进程 利用.NET Framework提供的System.Diagnostics命名空间,可以很方便地获取当前系统中正在运行的进程。可以使用Proc…

    C# 2023年6月6日
    00
  • C#实现无限级联下拉列表框

    下面是详细讲解“C#实现无限级联下拉列表框”的完整攻略: 1.准备工作 首先,我们需要在C#中创建一个Windows Forms应用程序。然后,在程序中创建一个ComboBox控件,作为第一级下拉列表框。同时,我们还需要准备一个数据表,用于存储下拉列表框的数据源。 2.绑定数据源 接下来,我们需要将数据表绑定到ComboBox控件中,这里可以使用DataSo…

    C# 2023年5月31日
    00
  • C# Directory.CreateDirectory(string path):创建目录

    Directory.CreateDirectory(string path)方法是C#中用于创建新目录的方法,它的作用是在指定路径下创建新目录。如果指定的目录已经存在,则该方法不会对该目录进行任何操作,而是返回一个DirectoryInfo对象,该对象表示已经存在的目录。 Directory.CreateDirectory(string path)方法的使用…

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