본문 바로가기

카테고리 없음

C# 다중 채팅 TCP 소스코드

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Firebase.Database;
using Firebase.Database.Query;

class TcpIpMultiChattingServer
{
    static TcpListener listener;
    static List<NetworkStream> clients = new List<NetworkStream>();
    static FirebaseClient firebaseClient;

    public static void Main()
    {
        // Firebase 초기화
        firebaseClient = new FirebaseClient("https://your-database-name.firebaseio.com/");

        listener = new TcpListener(IPAddress.Any, 7777);
        listener.Start();
        Console.WriteLine("서버가 시작되었습니다.");

        while (true)
        {
            TcpClient client = listener.AcceptTcpClient();
            NetworkStream stream = client.GetStream();
            clients.Add(stream);
            Console.WriteLine("새 클라이언트가 접속했습니다.");

            Thread clientThread = new Thread(HandleClient);
            clientThread.Start(stream);
        }
    }

    static async void HandleClient(object obj)
    {
        NetworkStream stream = (NetworkStream)obj;
        StreamReader reader = new StreamReader(stream);
        StreamWriter writer = new StreamWriter(stream) { AutoFlush = true };

        string clientName = await reader.ReadLineAsync();
        await BroadcastMessageAsync($"#{clientName}님이 입장했습니다.");

        while (true)
        {
            try
            {
                string message = await reader.ReadLineAsync();
                if (message == null) break;
                await BroadcastMessageAsync(message);
            }
            catch
            {
                break;
            }
        }

        clients.Remove(stream);
        await BroadcastMessageAsync($"#{clientName}님이 퇴장했습니다.");
        stream.Close();
    }

    static async Systehttp://m.Threading.Tasks.Task BroadcastMessageAsync(string message)
    {
        await firebaseClient
            .Child("messages")
            .PostAsync(new { Message = message });

        foreach (var client in clients)
        {
            StreamWriter writer = new StreamWriter(client) { AutoFlush = true };
            await writer.WriteLineAsync(message);
        }
    }
}