Буду разбираться, опыта не имею в этих делах, думал treadpool сам потоки распределяет)) Только что расписывал подключение к БД в итоге ноут перезагружаться надумал, все в топку
Так что буду выкладывать код с небольшими комментариями просто..
Создал новый проект в нем класс для работы с БД, подключил библиотеки
MySQL.Data
System.Data
Вот сам класс Database.cs
Используется csharp
using System;
using MySql.Data.MySqlClient;
namespace MMO_SERVER
{
public class Database
{
string _dbHostName = "sql2.freemysqlhosting.net";
string _dbName = "sql22****";
string _dbUserName = "sql22****";
string _dbPassword = "qwerty123";
string _dbTableName = "players";
MySqlConnection _dbConnection;
// создаю подключение
public Database ()
{
_dbConnection = new MySqlConnection(
"server=" + _dbHostName + ";" +
"user=" + _dbUserName + ";" +
"database=" + _dbName + ";" +
"password=" +_dbPassword + ";"
);
_dbConnection.Open ();
Console.WriteLine ("Connected to Database: " + _dbName);
//RegisterNewPlayer ("Karloss", "qwerty", "karloss@gmail.com"); // пример запроса на регистрацию
//LoginUser("Bob", "0000"); // пример запроса на авторизацию
Console.ReadKey ();
_dbConnection.Close ();
Console.WriteLine ("Database connection closed!");
}
// проверяем имя на совпадение
private bool CheckUserName(string _userName)
{
string checkSQL = "SELECT `name` FROM `"+ _dbTableName +"`" +
"WHERE `name` = '" + _userName + "'";
MySqlCommand checkCommand = new MySqlCommand (checkSQL, _dbConnection);
string result = (String)checkCommand.ExecuteScalar ();
Console.WriteLine (result);
if (result == _userName)
return true;
else
return false;
}
// проверяем не зарегистрирован ли уже емейл
private bool CheckUserEmail(string _userEmail)
{
string checkSQL = "SELECT `email` FROM `"+ _dbTableName +"`" +
"WHERE `email` = '" + _userEmail + "'";
MySqlCommand checkCommand = new MySqlCommand (checkSQL, _dbConnection);
string result = (String)checkCommand.ExecuteScalar ();
if (result == _userEmail)
return true;
else
return false;
}
// проверка для авторизации зарегистрирован ли игрок
private bool CheckUser(string _userName, string _userPassword)
{
string checkSQL = "SELECT * FROM `"+ _dbTableName +"`" +
"WHERE `password` = '" + _userPassword + "' AND `name` = '" + _userName + "'";
MySqlCommand checkCommand = new MySqlCommand (checkSQL, _dbConnection);
MySqlDataReader MyDataReader = checkCommand.ExecuteReader();
string _readName = null;
string _readPass = null;
while (MyDataReader.Read())
{
_readName = MyDataReader.GetString(1);
_readPass = MyDataReader.GetString(2);
}
MyDataReader.Close();
if (_readName == _userName && _readPass == _userPassword)
return true;
else
return false;
}
// сама регистрация, сначала проверяем нету ли в базе логина и мейла, потом проверяем пароль и если ок - регистрируем
public void RegisterNewPlayer(string _name, string _password, string _email)
{
if (CheckUserName (_name))
Console.WriteLine ("User name already registered!");
else if (CheckUserEmail (_email))
Console.WriteLine ("User email already registered!");
else if (_password.Length < 6)
Console.WriteLine ("Password must have 6 or more chars!");
else
{
string registerSQL = "INSERT INTO `"+ _dbTableName +"`(`id`, `name`, `password`, `email`) " +
"VALUES ('','"+ _name +"','"+ _password +"','"+ _email +"')";
MySqlCommand regCommand = new MySqlCommand(registerSQL, _dbConnection);
regCommand.ExecuteNonQuery ();
Console.WriteLine (string.Format("Registered new player: nickname = {0}, email = {1}", _name, _email));
}
}
// авторизация
public void LoginUser(string _name, string _password)
{
if (CheckUser (_name, _password))
{
Console.WriteLine ("User: [" + _name + "] join to server!");
}
else
Console.WriteLine ("Incorrect name or password!");
}
}
}
Теперь нужно подумать об защите от SQL инъекций и шифровании пароля.
Вопрос к разбирающимся в этих делах:
-защитит ли SqlCommand.Parameters от SQL inject?
-когда нужно открывать/закрывать подключение к БД? На старте сервера и при завершении работы или я не прав?
-существует ли метод отвечающий за завершение работы консольного приложения, что то вроде OnApplicationQuit() как в юньке, или же нужно создать ивент?
UPD. Еще вопрос подъехал: как считаете стоит ли использовать SSL/TLS протокол для защиты передачи данных клиент-сервер или достаточно будет их шифрования простыми способами?