Maxim

Статус
  • Активный

Последние сообщения Maxim

  • C/C++ и C#C# №3: Работа с сетью. Sockets. • 7 мая 2012 г. 22:04

    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;using System.Net.Sockets;using System.Threading;namespace Server{ public partial class Form1 : Form ...
    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;
    using System.Net.Sockets;
    using System.Threading;


    namespace Server
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    // Здесь будет хранится статус сервера
    bool isServerRunning;
    // Здесь будет список наших клиентов
    private Hashtable clients;
    // Это сокет нашего сервера
    Socket listener;
    // Порт, на котором будем прослушивать входящие соединения
    int port = 1991;
    // Точка для прослушки входящих соединений (состоит из адреса и порта)
    IPEndPoint Point;
    // Список потоков
    private List<Thread> threads = new List<Thread>();

    private void ServerStart()
    {
    clients = new Hashtable(30);
    isServerRunning = true;
    listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    // Определяем конечную точку, IPAddress.Any означает что наш сервер будет принимать входящие соединения с любых адресов
    Point = new IPEndPoint(IPAddress.Any, port);
    // Связываем сокет с конечной точкой
    listener.Bind(Point);
    // Начинаем слушать входящие соединения
    listener.Listen(10);

    SocketAccepter();
    }

    private void SocketAccepter()
    {
    // Запускаем цикл в отдельном потоке, чтобы приложение не зависло
    Thread th = new Thread(delegate()
    {
    while (isServerRunning)
    {
    // Создаем новый сокет, по которому мы сможем обращаться клиенту
    // Этот цикл остановится, пока какой-нибудь клиент не попытается присоединиться к серверу
    Socket client = listener.Accept();
    // Теперь, обратившись к объекту client, мы сможем отсылать и принимать пакеты от последнего подключившегося пользователя.
    // Добавляем подключенного клиента в список всех клиентов, для дальнейшей массовой рассылки пакетов
    clients.Add(client, "");
    // Начинаем принимать входящие пакеты
    Thread thh = new Thread(delegate()
    {
    MessageReceiver(client);
    });
    thh.Start();
    }
    });
    // Приведенный выше цикл пока что не работает, запускаем поток. Теперь цикл работает.
    th.Start();
    threads.Add(th);
    }

    private void MessageReceiver(Socket r_client)
    {
    // Для каждого нового подключения, будет создан свой поток для приема пакетов
    Thread th = new Thread(delegate()
    {
    while (isServerRunning)
    {
    try
    {
    // Сюда будем записывать принятые байты
    byte[] bytes = new byte[1024];
    // Принимаем
    r_client.Receive(bytes);
    if (bytes.Length != 0)
    {
    // Отсылаем принятый пакет от клиента всем клиентам
    foreach (Socket s_client in clients.Keys)
    {
    MessageSender(s_client, bytes);
    }
    }
    }
    catch { }
    }
    });
    th.Start();
    threads.Add(th);
    }

    private void MessageSender(Socket c_client, byte[] bytes)
    {
    try
    {
    // Отправляем пакет
    c_client.Send(bytes);

    }
    catch { }
    }
    }
    }

    при создании сервака, выдает ошибку: Не удалось найти имя типа или пространство имен "Hashtable"(пропущена директива using или ссылка на сборку?)
  • C/C++ и C#C# №3: Работа с сетью. Sockets. • 5 мая 2012 г. 21:26

    Подскажите, когда создаем сервер, форму надо создавать??? Так же при создании клиента скажите нужна форма????
    Подскажите, когда создаем сервер, форму надо создавать??? Так же при создании клиента скажите нужна форма????