none
Чат на с# RRS feed

  • Вопрос

  • Цель изучение сокетов
    Мили цель: написание многопользовательского чата.
    Что сделано: Имеется сервер(см. ниже) который слушает порт,при получении конекта на порт, создает асинхронно новый процесс который в дальнейшем получает сообщения и отправляет их(эхо сервер)
    Все хорошо, но как сделать так чтобы сообщения уходило не только кто отправил, а всем кто приконекчен.
    Имеется клиент(см. ниже) который отправляет и получает запросы
    Но опять-же, но.... получает он от сервера сразу-же как отправил по клику...а как научить его ждать сообщений вообще...как эхо клиент он работает нормально но если доделать сервер чтобы сообщения приходили от других юзверов то он уже не будет принимать их. Пробывал на таймер тик ставить... виснет... что не мудрнено....а как иначе... пока идеек нету...
    сервер:
    namespace Server
    {
        
        class Server
        {
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
            public static extern bool SetProcessWorkingSetSize(IntPtr handle, int minimumWorkingSetSize, int maximumWorkingSetSize);
            
            public static int NumConnections = 0;
            const int port = 13000; 
            public const int buferSize = 512;
            
            static void Main(string[] args)
            {
                IPAddress adrIP = IPAddress.Parse("127.0.0.1"); 
                SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, 1);
                TcpListener Listener = new TcpListener(adrIP, port);
                Listener.Start();
                
                while (true)
                {
                    while (!Listener.Pending())
                    {
                        Thread.Sleep(2000);
                    }
                    Connection NewConnection = new Connection(Listener); 
                    ThreadPool.QueueUserWorkItem(new WaitCallback(NewConnection.StartRead)); 
                    
                }
            }
        }
    
    class Connection
    {
        TcpListener Listener;
        TcpClient Client;
        NetworkStream Stream;
        public static string InputData=null;
        public Connection(TcpListener L)
        {
            try
            {
                Server.NumConnections++;
                Console.WriteLine("{0} active connections", Server.NumConnections.ToString());
                Listener = L;
                Client = Listener.AcceptTcpClient();
                
                Stream = Client.GetStream();
            }
            catch
            {
                Stream.Close();
                Client.Close();
                Thread.CurrentThread.Abort();
            }
        }
        public void StartRead(object obj)
        {
            try
            {
                while (true)
                {
                    byte[] byteData= new byte[Server.buferSize];
                    Stream.Read(byteData, 0, byteData.Length);
                    
    
                    string InputData = Encoding.UTF8.GetString(byteData, 0, byteData.Length);
                    Console.WriteLine("Ñåðâåð ïðèíÿë {0}", InputData);
                    
                    byte[] msg = Encoding.UTF8.GetBytes(InputData);
                    Stream.Write(msg, 0, msg.Length);
                    Console.WriteLine("Ñåðâåð îòïð {0}", InputData);
                }
            }
            catch
            {
                Server.NumConnections--;
                Console.WriteLine("{0} active connections", Server.NumConnections.ToString());
                
                Stream.Close();
                Client.Close();
                Thread.CurrentThread.Abort();
            }
        }
    }
    }
    namespace client
    {
        
        public partial class Form1 : Form
        {
            TcpClient Client;
            public Form1()
            {            
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    NetworkStream stream = Client.GetStream();
                    byte[] Buff = Encoding.UTF8.GetBytes(this.textBox2.Text);
                    this.textBox1.AppendText(this.textBox2.Text + "\n");
                    this.textBox2.Text = "";
                    stream.Write(Buff, 0, Buff.Length);
    
                    NetworkStream Stream = Client.GetStream();
                    byte[] Buff2 = new byte[512];
                    Stream.Read(Buff2, 0, Buff2.Length);
    
                    this.textBox1.AppendText(Encoding.UTF8.GetString(Buff2, 0, Buff2.Length)+"\n");
                }
                catch (Exception exc)
                {
                    this.textBox1.AppendText("Exception: {0}" + exc.Message + "\n");
                }
                
    
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                
                timer1.Enabled = true;
                Client = new TcpClient();
                try
                {
                    Client.Connect("127.0.0.1", 13000);
                    this.textBox1.AppendText("Ïðèêîíåêòåëèñü...\n");
                }
                catch (Exception exc)
                {
                    this.textBox1.AppendText("Exception: {0}" + exc.Message + "\n");
                }
                
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                /*Thread.Sleep(3000);   
                try
                {
                    NetworkStream Stream = Client.GetStream();
                    byte[] Buff = new byte[512];
                    Stream.Read(Buff, 0, Buff.Length);
                    if (Stream.Read(Buff, 0, Buff.Length) != 0)
                        this.textBox1.AppendText(Encoding.UTF8.GetString(Buff, 0, Buff.Length));
                    
    
                }
                catch (Exception exc)
                {
                    this.textBox1.AppendText("Exception: {0}" + exc.Message + "\n");
                }*/ 
            }
        }
    }

    • Перемещено Siddharth Chavan 1 октября 2010 г. 22:10 MSDN Forums Consolidation (От:Visual C#)
    7 декабря 2009 г. 13:59

Ответы