using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace Server
{
class Server
{
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr handle, int minimumWorkingSetSize, int maximumWorkingSetSize);
const int port = 9051;
public const int bufferSize = 512;
static void Main(string[] args)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
TcpListener Listener = new TcpListener(IPAddress.Any, port);
Listener.Start();
while (true)
{
while (!Listener.Pending())
{
Thread.Sleep(1000);
}
Connection NewConnection = new Connection(Listener);
ThreadPool.QueueUserWorkItem(new WaitCallback(NewConnection.StartRead));
}
}
}
class Connection
{
TcpListener Listener;
TcpClient Client;
NetworkStream Stream;
static int NumConnections = 0;
public Connection(TcpListener L)
{
try
{
NumConnections++;
Console.WriteLine("{0} active connections", 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.bufferSize];
int bytesRead = Stream.Read(byteData, 0, byteData.Length);
string InputData = Encoding.Default.GetString(byteData, 0, bytesRead);
Console.WriteLine(InputData);
}
}
catch
{
Stream.Close();
Client.Close();
Thread.CurrentThread.Abort();
}
}
}
}
клиентЫ и сервер
Есть некая база данных (БД) и в фирме имеется около 100+ клиентов (КБД) которые коннектятся к базе данных и работают с ней. Идея такова... Когда 100+ юзеров запускают клиент(КБД) который работает с базой данных они запускают в паралельном патоке клиент(К) который каждые 60 сек шлет на сервер сообщения типа (60 секунд полет нормальный и свой логин и айпи). Соответственно перестал слать клиент (К) пакеты - значит интернета у юзера нету либо выключил клиент(КБД) который с БД работает. Далее руководство решает уволить кого нить из этих 100+ юзеров. Сервер который принимает сообщения от клиентов(К) посылает всем клиентам(К) сообщения если ты такойта (логин либ еще чтото) то выключить клиент(КБД) и сменить в БД пароль этого юзера. В связи с этим та мне и не подходят большенство примеров которые я видел:
- Либо коннектятся только 1 клиент как 2+ запустиш так труба начинается...
- Когда теряет клиент связь с сервером он вырубается...
- Когда потом после утери сигнала сигнал возвращается тоже куча проблем...
- Сервер теряет клиентов и после возвращения сигнала не может им ничего выслать...
- Реализация на консоле менее удобна для этого чем нежели в оконном режиме видеть список юзеров онлайн и видеть что кто шлет...
Вот такая пролемка... Нашел более менее подходящий пример в нем все нормально... И принимает сигналы от многих юзеров... И при потере сигнала возвращается когда соединение клиент продолжает все высылать.... НО ОНО НА КОНСОЛЕ МНЕ НА ВИН ФОРМЕ НАДА... А сам не осилю изменить...
Это сервер
Код:
И клиент
Код:
using System;
using System.Text;
using System.Net.Sockets;
using System.Threading;
namespace Client
{
class Client
{
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr handle, int minimumWorkingSetSize, int maximumWorkingSetSize);
const int bufferSize = 512;
static byte[] byteData = new byte[bufferSize];
static NetworkStream Stream;
static System.Net.IPAddress IP = System.Net.IPAddress.Parse("127.0.0.1");
const int port = 9051;
static void Main(string[] args)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
tryConnect:
TcpClient tcpClient = new TcpClient();
try
{
tcpClient.Connect(IP, port);
Stream = tcpClient.GetStream();
while (true)
{
Console.WriteLine(DateTime.Now.ToString());
Write(DateTime.Now.ToString());
Thread.Sleep(5000);
}
}
catch
{
Console.WriteLine("[X] Server not available!");
Thread.Sleep(3000);
goto tryConnect;
}
}
static void Write(string s)
{
try
{
byteData = new byte[bufferSize];
byteData = Encoding.Default.GetBytes(s);
Stream.Write(byteData, 0, byteData.Length);
Thread.Sleep(100);
}
catch
{
Console.WriteLine("[X] Server not available!");
}
}
}
}
using System.Text;
using System.Net.Sockets;
using System.Threading;
namespace Client
{
class Client
{
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr handle, int minimumWorkingSetSize, int maximumWorkingSetSize);
const int bufferSize = 512;
static byte[] byteData = new byte[bufferSize];
static NetworkStream Stream;
static System.Net.IPAddress IP = System.Net.IPAddress.Parse("127.0.0.1");
const int port = 9051;
static void Main(string[] args)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
tryConnect:
TcpClient tcpClient = new TcpClient();
try
{
tcpClient.Connect(IP, port);
Stream = tcpClient.GetStream();
while (true)
{
Console.WriteLine(DateTime.Now.ToString());
Write(DateTime.Now.ToString());
Thread.Sleep(5000);
}
}
catch
{
Console.WriteLine("[X] Server not available!");
Thread.Sleep(3000);
goto tryConnect;
}
}
static void Write(string s)
{
try
{
byteData = new byte[bufferSize];
byteData = Encoding.Default.GetBytes(s);
Stream.Write(byteData, 0, byteData.Length);
Thread.Sleep(100);
}
catch
{
Console.WriteLine("[X] Server not available!");
}
}
}
}
ЛИБ ПОМОГИТЕ ПРИМЕРОМ НА С# В ВИНФОРМЕ.. Где мого клиентов шлет серверу сообщение и получает ответ.....