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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2011, 15:42   #1
kestugar
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 28
Стрелка Графический чат через многопоточный сервер (С#)

Есть многопоточный сервер и клиент, который может общаться сам с собой. Т.е. несколько клиентов могут коннектится к одному серверу, нопереписыватсья между собой не могут-видят только свои сообщения.
Помогите сделать чат так, чтобы несколько клиентов могли общаться между собой.

Клиент
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
 
namespace ClientGr
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        TcpClient Client = new TcpClient();
        Socket Sock;
 
        private void button1_Click(object sender, EventArgs e)
        {
            
            string ip = comboBox1.Text;
            int port = Convert.ToInt32(textBox1.Text);
 
            try
            {
                Client.Connect(ip, port);
                MessageBox.Show("connect successful");
            }
 
            catch
            {
                MessageBox.Show("Cannot connect to remote host!");
                return;
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            string data;
            Sock = Client.Client;           
                data = textBox4.Text;
                if (data == "END")
                {//закрывает сокет//
                    Sock.Close();
                    Client.Close();
                    this.Close();
                    return;
                }
            data = textBox2.Text + ": " + data;
            //преобразование типов//             
            Sock.Send(Encoding.ASCII.GetBytes(data));
 
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            byte[] remdata = new byte[1024];
            int i;
            string sdata;
            i = Sock.Receive(remdata);
            sdata = Encoding.ASCII.GetString(remdata, 0, i).Trim();
            textBox3.Text = sdata + "\r\n" + textBox3.Text;
 
        }
    }
}
kestugar вне форума Ответить с цитированием
Старый 12.12.2011, 15:42   #2
kestugar
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 28
По умолчанию

Сервер
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net;
using System.Net.Sockets;
 
namespace MPserver
{
    class Program
    {
        static void Main(string[] args)
        {
            int port = 9999;
            string cmd;
            serverMN smn = new serverMN(port);
            smn.Start();
            Console.WriteLine("Creating server...");
            while (true)
            {
                Console.WriteLine("Created. Type EXIT to close server");
                cmd = Console.ReadLine();
                if (cmd == "EXIT")
                {
                    return;
                }
            }
        }
    }
    class serverMN
    {
        private Socket s;
        private int Port;
        public serverMN(int port)
        {
            Port = port;
        }
 
        private class ConnectionInfo
        {
            public Socket Socket;
            public Thread Thread;
        }
 
        private Thread Th;
        private List<ConnectionInfo> connect = new List<ConnectionInfo>();
 
        public void Start()
        {
            SetupServerSocket();
            Th = new Thread(AcceptConnections);
            Th.IsBackground = true;
            Th.Start();
        }
 
        private void SetupServerSocket()
        {
            //Получаем информацию о локальном компьютере
            IPEndPoint myEndPort = new IPEndPoint(IPAddress.Any, Port);
            //Создаем сокет, привязываем его к адресу
            s = new Socket(myEndPort.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            s.Bind(myEndPort);
            s.Listen((int)SocketOptionName.MaxConnections);
        }
        private void AcceptConnections()
        {
            while (true)
            {
                //Принимаем соединение
                Socket socket = s.Accept();
                ConnectionInfo connection = new ConnectionInfo(); 
                connection.Socket = socket;
                //Создаем поток для получения данных
                connection.Thread = new Thread(ProcessConnection);
                connection.Thread.IsBackground = true;
                connection.Thread.Start(connection);
                //Сохраняем сокет
                lock (connect) connect.Add(connection);
            }
        }
        private void ProcessConnection(object state)
        {
            ConnectionInfo connection = (ConnectionInfo)state;
            byte[] bufer = new byte[1024];
            string data;
            try
            {
                while (true)
                {
                    int i = connection.Socket.Receive(bufer);
                    if (i > 0)
                    {
                        data = Encoding.ASCII.GetString(bufer, 0, i).Trim();
                        connection.Socket.Send(Encoding.ASCII.GetBytes(data));
                        Console.WriteLine(data);
                    }
                    else if (i == 0)
                        return;
                }
            }
            catch (SocketException exc)
            {
                Console.WriteLine("Socket exception:" + exc.SocketErrorCode);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Exception:" + exc);
            }
            finally
            {
                connection.Socket.Close();
                lock (connect) connect.Remove(connection);
            }
        }
    }
}
kestugar вне форума Ответить с цитированием
Старый 19.12.2011, 23:06   #3
kestugar
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 28
По умолчанию

Тема актуальна
kestugar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточный чат на winsock btf Visual C++ 15 28.12.2012 06:15
клиент-сервер чат djetx Работа с сетью в Delphi 8 12.10.2010 20:37
Многопоточный сервер FAiver Работа с сетью в Delphi 18 31.03.2008 08:51
многопоточный сервер мандарин Работа с сетью в Delphi 6 24.04.2007 07:22