justify"> {client=null;
try
{= m_listener. AcceptTcpClient ();
} (SocketException ex)
{. Log («Server: Failed to accept tcp client. Reason:» + ex. Message) ;;
}
. Log («Сервер: Підключення» + client. Client. RemoteEndPoint. ToString ());
thread=new Thread (new ParameterizedThreadStart (HandleClient)) ;. Start (client);// Запуск встановлення з'єднання
}
}
//Потік створення з'єднання з кліентомvoid HandleClient (object objClient)
{client=(TcpClient) objClient;
server=new ACNPServer (client);
//Отримуємо запит від клієнта і відповідно до запиту
//виконуємо авторизацію або підключення вхідного або вихідного потоків
Command command=server. RecieveCommand (); (command == null)
{;
}
handler; data; movedToReady=false; (command. Value)
{Command. CommandType. ClientLogin://Виконуємо авторізаціюloginData=server. GetLoginData (); (loginData == null)
{;
}
//Перевірюємо, чи зареєстрований пользовательfoundUser=GetUser (loginData. UserName, loginData. Password); (foundUser == null)
{. DenyLogin () ;;
}
else//Перевірюємо чи є в списку очікуючих клієнтів
{(IClientHandler clientHandler in m_waiting)
{(clientHandler. GetUserName () == loginData. UserName)
{. DenyLogin () ;;
}
}
(IClientHandler clientHandler in m_ready)
{(clientHandler. GetUserName () == loginData. UserName)
{. DenyLogin () ;;
}
}
id=m_random. Next (1000000);=new ClientHandler (server, foundUser, id) ;. SetCallbacks (this); _ waiting. Add (handler) ;. AcceptLogin (id);
}; Command. CommandType. ClientConnectInput://Реєстрація вхідного потоку=server. RecieveData lt; DataInteger gt; (); (data == null)
{;
}=GetWaitingHandler (data. Id); (handler == null)
{. SendDeny ();
}
inputServer=new ACNPServer (client) ;. SetOutput (inputServer); (handler. IsComplete ())
{(handler);=true;
}. SendAccept () ;;
//Реєстрація вихідного потоку
case Command. CommandType. ClientConnectOutput:=server. RecieveData lt; DataInteger gt; (); (data == null)
{;
}=GetWaitingHandler (data. Id); (handler == null)
{. SendDeny ();
}
outputServer=new ACNPServer (client) ;. SetInput (outputServer); (handler. IsComplete ())
{(handler);=true;
}. SendAccept () ;; :( «Сервер: Помилка.») ;;;
}
(! movedToReady)
{;
}
();
. ControlThread ();
}
//Оновлення списку пользователейvoid RefreshContactLists ()
{(m_ready)
{(IClientHandler clientHandler in m_ready)
{. RefreshContactList ();
}
}
}
//Отримати список пользователейUser GetUser (string name, string password)
{found=null; (m_usersMutex)
{(User user in m_users)
{(user. IsTheSame (name, password))
{= user ;;
}
}
}
found;
}
//Отримати обробник клієнта по ідентіфікаторуIClientHandler GetWaitingHandler (int id)
{(IClientHandler handler in m_waiting)
{(handler. IsYourId (id))
{handler;
}
}
null;
}
//Переміщення обробника клієнта зі списку...