Здравствуйте, использую компонент отного человека для тцп сервера. Вот все уже испробовал но как только подключается новый клиент, то старый отключается, или новый не подключается, вопщем работать может только один одновременно. В чем проблема? Код | using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading;
namespace TCPServerSocket { /// <summary> /// Класс для простой работы с сокетами.Протокол TCP. Компонент "Сервер" /// </summary> public class TCPServerSocket : Component { TcpListener server = null; byte[] Bytes = new byte[8192]; TcpClient client = new TcpClient(); int localport = 0; NetworkStream stream = null; int i = 0; Form onForm = null; Thread NewThread = null; bool starting = false; bool manadgedstop = false; bool kick = false;
public delegate void ConnectEventHandler(IPEndPoint RemoteHost); //Событие возникает при подключении клиента public event ConnectEventHandler Connect;
public delegate void DisconnectEventHandler(IPEndPoint RemoteHost); //Событие возникает при отключении клиента public event DisconnectEventHandler Disconnect;
public delegate void ReceiveDataHandler(byte[] data, int totalbytes, IPEndPoint RemoteHost); //Событие возникает при приеме данных от хоста public event ReceiveDataHandler ReceiveData;
public delegate void ServerErrorHandler(string texterror); //Событие возникает при ошибке в работе сервера public event ServerErrorHandler ServerError;
/// <summary> /// Порт для прослушки /// </summary> public int LocalPort { get { return localport; } set { localport = value; } }
/// <summary> /// Размер буфера для приема данных /// </summary> public int BufferSize { get { return Bytes.Length; } set { Bytes = new byte[value]; } }
/// <summary> /// Метод отправлет данные удаленному хосту /// </summary> /// <param name="data">Байтовый массив</param> /// <returns>Возвратит true в случае успешной отправки данных</returns> public bool SendData(byte[] data) { try { client.Client.Send(data); return true; } catch { return false; }
}
/// <summary> /// Метод отправлет строку удаленному хосту /// </summary> /// <param name="data">Строка</param> /// <returns>Возвратит true в случае успешной отправки данных</returns> public bool SendString(string data) { try { client.Client.Send(Encoding.Default.GetBytes(data)); return true; } catch { return false; }
}
/// <summary> /// Метод запускает прослушку порта /// </summary> /// <returns>Возвратит true в случае успешного запуска</returns> public bool StartServer() {
try { if (starting) { return false; } server = new TcpListener(IPAddress.Any, localport); server.Start(); NewThread = new Thread(new ThreadStart(StartListen)); NewThread.Start(); starting = true; return true; } catch { return false; }
}
/// <summary> /// Метод запускает прослушку порта на определенном интерфейсе /// </summary> /// <param name="LocalIP">Привязка к интерфейсу</param> /// <returns>Возвратит true в случае успешного запуска</returns> public bool StartServer(string LocalIP) {
try { if (starting) { return false; } server = new TcpListener(IPAddress.Parse(LocalIP), localport); server.Start(); NewThread = new Thread(new ThreadStart(StartListen)); NewThread.Start(); starting = true; return true; } catch { return false; }
}
/// <summary> /// Метод позволяет проверить статус сервера /// </summary> /// <returns>Возвратит true в случае если сервер запущен и false если он не запущен.</returns> public bool StatusServer() { return starting; }
/// <summary> /// Метод останавливает прослушку порта /// </summary> /// <returns>Возвратит true в случае успешной остановки</returns> public bool StopServer() {
if (starting) { manadgedstop = true; client.Client.Close(); server.Stop(); return true; } else { return false; }
}
/// <summary> /// Метод отключает подключенного клиента /// </summary> public void DisconnectHost() { kick = true; client.Client.Shutdown(SocketShutdown.Both); }
/// <summary> /// Привязка к форме /// </summary> /// <param name="ParentForm">Форма на которой находится компонент</param> public void OnForm(Form ParentForm) { onForm = ParentForm; }
//Делегат и функция для передачи данных основному потоку delegate void ConnectEventDelegate(IPEndPoint RemoteHost); private void ConnectEvent(IPEndPoint RemoteHost) { if (onForm.InvokeRequired) { ConnectEventDelegate Invoker = new ConnectEventDelegate(ConnectEvent); onForm.Invoke(Invoker, new object[] { RemoteHost }); } else { Connect(RemoteHost); } }
//Делегат и функция для передачи данных основному потоку delegate void DisconnectEventDelegate(IPEndPoint RemoteHost); private void DisconnectEvent(IPEndPoint RemoteHost) { if (onForm.InvokeRequired) { DisconnectEventDelegate Invoker = new DisconnectEventDelegate(DisconnectEvent); onForm.Invoke(Invoker, new object[] { RemoteHost }); } else { Disconnect(RemoteHost); } }
//Делегат и функция для передачи данных основному потоку delegate void ReceiveEventDelegate(byte[] data, int totalbytes, IPEndPoint RemoteHost); private void ReceiveEvent(byte[] data, int totalbytes, IPEndPoint RemoteHost) { if (onForm.InvokeRequired) { ReceiveEventDelegate Invoker = new ReceiveEventDelegate(ReceiveEvent); onForm.Invoke(Invoker, new object[] { data, totalbytes, RemoteHost }); } else { ReceiveData(data, totalbytes, RemoteHost); } }
//Делегат и функция для передачи данных основному потоку delegate void ServerErrorEventDelegate(string texterror); private void ServerErrorEvent(string texterror) { if (onForm.InvokeRequired) { ServerErrorEventDelegate Invoker = new ServerErrorEventDelegate(ServerErrorEvent); onForm.Invoke(Invoker, new object[] { texterror }); } else { ServerError(texterror); } }
/// <summary> /// Обработка приема соединений и получения данных от клиента /// </summary> private void StartListen() { IPEndPoint IP = null;
try { while (true) { client = server.AcceptTcpClient(); IP = (IPEndPoint)client.Client.RemoteEndPoint; ConnectEvent(IP);
server.Stop(); stream = client.GetStream();
i = stream.Read(Bytes, 0, Bytes.Length);
while (i != 0) { ReceiveEvent(Bytes, i, IP); Array.Clear(Bytes, 0, Bytes.Length); i = stream.Read(Bytes, 0, Bytes.Length); }
DisconnectEvent(IP);
client.Close(); server.Start(); } } catch (Exception ex) {
if (!manadgedstop) { if (!kick) { DisconnectEvent(IP); ServerErrorEvent(ex.Message); } else { kick = false; }
server = null; starting = false; this.StartServer(); return; }
server = null; starting = false; manadgedstop = false; } }
} }
|
|