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