Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2009, 03:22   #1
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию Чат на с#

Цель изучение сокетов
Мили цель: написание многопользовательского чата.
Что сделано: Имеется сервер(см. ниже) который слушает порт,при получении конекта на порт, создает асинхронно новый процесс который в дальнейшем получает сообщения и отправляет их(эхо сервер)
Все хорошо, но как сделать так чтобы сообщения уходило не только кто отправил, а всем кто приконекчен.
Имеется клиент(см. ниже) который отправляет и получает запросы
Но опять-же, но.... получает он от сервера сразу-же как отправил по клику...а как научить его ждать сообщений вообще...как эхо клиент он работает нормально но если доделать сервер чтобы сообщения приходили от других юзверов то он уже не будет принимать их. Пробывал на таймер тик ставить... виснет... что не мудрнено....а как иначе... пока идеек нету...
сервер:
Код:
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();
        }
    }
}
}
dampirik вне форума Ответить с цитированием
Старый 06.12.2009, 03:23   #2
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

клиент
Код:
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");
            }*/ 
        }
    }
}
dampirik вне форума Ответить с цитированием
Старый 14.12.2009, 15:33   #3
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

чат готов, если кому нужно могу поделиться...
dampirik вне форума Ответить с цитированием
Старый 16.12.2009, 16:46   #4
Arnezami
Форумчанин
 
Регистрация: 04.10.2009
Сообщений: 147
По умолчанию

можешь скинуть на Arnezami@ukr.net, а то впадлу избреать заного велосипед, я его допишу и расширю функционал и потом своей версие поедлючь))
Ув. Форумчане! Если мои советы были Вам полезны, не забывайте благодарить в виде повышение рейтинга!!!
http://vkontakte.ru/id6715558
Arnezami вне форума Ответить с цитированием
Старый 12.01.2010, 11:14   #5
Aexx
Программист тьмы
Форумчанин
 
Аватар для Aexx
 
Регистрация: 02.09.2009
Сообщений: 227
По умолчанию

Скинь на llaexx@gmail.com. Посмотрим. Хотя на RSDN был такой пример
Aexx вне форума Ответить с цитированием
Старый 12.01.2010, 12:17   #6
Horknee
Пользователь
 
Регистрация: 21.09.2008
Сообщений: 70
По умолчанию

Если не сложно, будь добр на horknee@mail.ru тоже)
Horknee вне форума Ответить с цитированием
Старый 12.01.2010, 21:50   #7
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию

И мне плиз mtm<>mail.kz
BOZKURT вне форума Ответить с цитированием
Старый 12.01.2010, 23:52   #8
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Готовый код был утерен после форс мажора с жеским но части кода нужные могу скинуть и обьяснить...301040873
dampirik вне форума Ответить с цитированием
Старый 09.01.2011, 16:40   #9
egorikem
 
Регистрация: 19.10.2010
Сообщений: 9
По умолчанию Скинь!

Цитата:
Сообщение от dampirik Посмотреть сообщение
чат готов, если кому нужно могу поделиться...
Поделись очень надо! Скинь на egorikem@yandex.ru
egorikem вне форума Ответить с цитированием
Старый 10.01.2011, 09:11   #10
Blourid
Форумчанин
 
Аватар для Blourid
 
Регистрация: 09.03.2010
Сообщений: 138
По умолчанию

Ура! И мне тоже пожалуйста blourid@gmail.com
здорово))
Вчера
Blourid вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чат eldar PHP 2 29.04.2009 00:30
Цветной чат Shouldercannon Общие вопросы Delphi 8 28.07.2008 10:29
Чат для 2 ПК aesoem Работа с сетью в Delphi 30 28.04.2008 09:33
Интернетовский чат vizor9 Фриланс 76 01.01.2008 22:30