using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using Sy"> using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using Sy">
legongju.com
我们一直在努力
2025-01-10 09:58 | 星期五

C#实现基于TCP/IP的聊天室

要在C#中实现一个基于TCP/IP的聊天室,你需要创建一个服务器端和客户端

  1. 首先,创建一个新的C#控制台应用程序项目,命名为"ChatServer"。

  2. 在项目中添加以下命名空间:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
  1. 在Program类中添加以下代码:
class Program
{
    private static TcpListener _listener;
    private static List _clients = new List();

    static void Main(string[] args)
    {
        StartServer();
    }

    private static void StartServer()
    {
        _listener = new TcpListener(IPAddress.Any, 8000);
        _listener.Start();
        Console.WriteLine("服务器已启动,正在监听端口8000...");

        while (true)
        {
            TcpClient client = _listener.AcceptTcpClient();
            _clients.Add(client);
            Console.WriteLine($"客户端 {client.Client.RemoteEndPoint} 已连接");

            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClient));
            clientThread.Start(client);
        }
    }

    private static void HandleClient(object obj)
    {
        TcpClient client = (TcpClient)obj;
        NetworkStream stream = client.GetStream();

        while (true)
        {
            try
            {
                byte[] buffer = new byte[1024];
                int bytesRead = stream.Read(buffer, 0, buffer.Length);
                string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);

                if (message == "exit")
                {
                    _clients.Remove(client);
                    client.Close();
                    Console.WriteLine($"客户端 {client.Client.RemoteEndPoint} 已断开连接");
                    break;
                }

                BroadcastMessage(client, message);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"客户端 {client.Client.RemoteEndPoint} 发生错误: {ex.Message}");
                _clients.Remove(client);
                client.Close();
                break;
            }
        }
    }

    private static void BroadcastMessage(TcpClient sender, string message)
    {
        foreach (TcpClient client in _clients)
        {
            if (client != sender)
            {
                NetworkStream stream = client.GetStream();
                byte[] buffer = Encoding.UTF8.GetBytes(message);
                stream.Write(buffer, 0, buffer.Length);
            }
        }
    }
}
  1. 保存并运行ChatServer项目。服务器将开始监听端口8000。

  2. 创建一个新的C#控制台应用程序项目,命名为"ChatClient"。

  3. 在项目中添加以下命名空间:

using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
  1. 在Program类中添加以下代码:
class Program
{
    private static TcpClient _client;
    private static NetworkStream _stream;

    static void Main(string[] args)
    {
        ConnectToServer();
    }

    private static void ConnectToServer()
    {
        _client = new TcpClient("127.0.0.1", 8000);
        _stream = _client.GetStream();
        Console.WriteLine("已连接到服务器");

        Thread receiveThread = new Thread(ReceiveMessages);
        receiveThread.Start();

        SendMessages();
    }

    private static void ReceiveMessages()
    {
        while (true)
        {
            try
            {
                byte[] buffer = new byte[1024];
                int bytesRead = _stream.Read(buffer, 0, buffer.Length);
                string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                Console.WriteLine(message);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"发生错误: {ex.Message}");
                _client.Close();
                break;
            }
        }
    }

    private static void SendMessages()
    {
        while (true)
        {
            Console.Write("请输入消息: ");
            string message = Console.ReadLine();

            if (message == "exit")
            {
                _client.Close();
                break;
            }

            byte[] buffer = Encoding.UTF8.GetBytes(message);
            _stream.Write(buffer, 0, buffer.Length);
        }
    }
}
  1. 保存并运行ChatClient项目。多个客户端可以同时连接到服务器并发送消息。

这个示例展示了如何使用C#创建一个基本的TCP/IP聊天室。你可以根据需要对其进行扩展和优化。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/88975.html

相关推荐

  • 如何在C++中使用strftime输出日期和时间

    如何在C++中使用strftime输出日期和时间

    strftime 是 C++ 标准库中的一个函数,用于将日期和时间格式化为字符串。以下是如何在 C++ 中使用 strftime 输出日期和时间的示例:
    #include
    #includ...

  • 如何在C++中使用strftime格式化时间

    如何在C++中使用strftime格式化时间

    strftime 是 C++ 标准库中的一个函数,用于将 tm 结构体(包含日期和时间信息)格式化为字符串。以下是如何在 C++ 中使用 strftime 的示例:
    #include

  • strftime函数在C++中的使用方法是什么

    strftime函数在C++中的使用方法是什么

    strftime 是一个 C 语言库函数,用于将时间格式化为字符串。在 C++ 中,你可以通过 头文件使用这个函数。以下是 strftime 函数在 C++ 中的基本用法:
    #incl...

  • 如何在C++中使用strftime进行日期计算

    如何在C++中使用strftime进行日期计算

    strftime 是 C++ 标准库中的一个函数,用于将 tm 结构(包含日期和时间信息)格式化为字符串。但是,strftime 本身并不执行日期计算。要在 C++ 中进行日期计算,...

  • C# TCP/IP数据包如何捕获

    C# TCP/IP数据包如何捕获

    在C#中,要捕获TCP/IP数据包,可以使用System.Net.Sockets命名空间中的Socket类
    using System;
    using System.Net;
    using System.Net.Sockets; na...

  • 如何在C#中调试TCP/IP程序

    如何在C#中调试TCP/IP程序

    在C#中调试TCP/IP程序,可以使用Visual Studio的内置调试工具和技巧 创建一个新的C#控制台应用程序项目。
    添加对System.Net和System.Net.Sockets命名空间的...

  • C# TCP/IP协议栈能自定义吗

    C# TCP/IP协议栈能自定义吗

    是的,C# 中的 TCP/IP 协议栈可以进行自定义。.NET Framework 和 .NET Core 提供了一些类和接口,可以用于实现自定义的 TCP/IP 协议栈。以下是一些关键类和接口:...

  • C#客户端TCP/IP连接如何管理

    C#客户端TCP/IP连接如何管理

    在C#中,使用TCP/IP连接的客户端可以通过System.Net.Sockets命名空间中的TcpClient和NetworkStream类进行管理 引入命名空间: using System.Net;
    using Sys...