Сообщений: 538
Тем: 76
Зарегистрирован: Aug 2012
Репутация:
7
Programmator не мог бы ты еще немного помочь.
Я начал писать подключение к БД и возник вопрос.
После отправки пакета PROTOCOL_LOGIN_ACK, мне надо что то вызывать чтобы подключиться к БД и пошла загрузка инф из БД в PROTOCOL_BASE_GET_USER_INFO_ACK?
И не мог бы подсказать что нужно для написание BattleServer с UDP 3?
Ошибка так и осталась, хоть я и изменил
ClientConnection
public void BeginRead(IAsyncResult asyncResult)
{
try
{
int received = Stream.EndRead(asyncResult);
if (received != 0)
{
while (received >= 6)
{
int length = BitConverter.ToUInt16(buffer, 0) & 0x7FFF;
byte[] temp = new byte[length + 2];
Array.Copy(buffer, 2, temp, 0, temp.Length);
int bits = Id % 7 + 1;
BitShift.Unshift(temp, bits);
byte[] opcode = new byte[] { temp[0], temp[1] };
RecvOpcode packet = (RecvOpcode)BitConverter.ToUInt16(opcode, 0);
Type t = Type.GetType("PiercingBlow.Login.Network.Recv." + packet.ToString());
if (t != null)
{
ClientPacket clientpacket = (ClientPacket)Activator.CreateInstance(t);
clientpacket.Client = this;
clientpacket.Process(temp);
}
else
{
Log.Info("PacketId = {0}", BitConverter.ToUInt16(opcode, 0), buffer.Length);
Log.Trace(temp.ToHex());
}
received -= length + 4;
Array.Copy(buffer, length + 4, buffer, 0, received);
}
Stream.BeginRead(buffer, 0, buffer.Length, BeginRead, Stream);
}
else
{
OnDisconnected(this);
}
}
catch (IOException)
{
OnDisconnected(this);
}
catch (Exception ex)
{
OnDisconnected(this);
Log.Error("Disconnect",ex);
}
}
Сообщений: 322
Тем: 6
Зарегистрирован: Nov 2015
Репутация:
505
Boris2105, Для udp3 сервера надо,
Пакет подключения игрока, вот Connect
Пакет о комнате,
Пакет о состояние боя,
И структуру динамического боя.
Это все есть тут
______________________________
Boris2105 Написал:Programmator не мог бы ты еще немного помочь.
Я начал писать подключение к БД и возник вопрос.
После отправки пакета PROTOCOL_LOGIN_ACK, мне надо что то вызывать чтобы подключиться к БД и пошла загрузка инф из БД в PROTOCOL_BASE_GET_USER_INFO_ACK?
А что там такого?
Пишешь коннектор, создаешь таблицу и указываешь аккаунт ид.
потом потом ее кидаешь в цикл, получится типо такого
private Player player;
player = PlayerTable.Players[account.AccountID];
Сообщений: 6,450
Тем: 262
Зарегистрирован: Nov 2007
Репутация:
44,165
Boris2105, предположу, что MySQL? Через NuGet ставишь MySql.Data, и по примеру Awiion пишешь примерно следующее:
[SRC="csharp"]using (var reader = MySqlHelper.ExecuteReader(ConnectionString, "SELECT * FROM `accounts`"))
{
while (reader.Read())
{
var account = new Account()
{
Id = reader.GetUInt64("Id"),
Name = reader.GetString("Name"),
Password = reader.GetString("Password"),
Email = reader.GetString("Email"),
// ...
};
accounts.Add(account);
}
}
[/SRC]
Или доставить ещё Dapper и тогда можно так:
[SRC="csharp"]using (var connection = Cached.GetConnection) // connection = MySqlConnection
{
var accounts = SqlMapper.Query<AccountModel>(connection, "SELECT * FROM `accounts`");
return accounts;
}
[/SRC]
И выбираешь при авторизации по логину (токену если нужно):
[SRC="csharp"]var account = accounts.FirstOrDefault(x => x.Login == login);
[/SRC]
ConnectionString имеет следующий вид:
Код: $"server={server};port={port};database={database};Character Set={encoding};User Id={user};password={password}"
Сообщений: 538
Тем: 76
Зарегистрирован: Aug 2012
Репутация:
7
PROGRAMMATOR Написал:Boris2105, предположу, что MySQL? Через NuGet ставишь MySql.Data, и по примеру Awiion пишешь примерно следующее:
[SRC="csharp"]using (var reader = MySqlHelper.ExecuteReader(ConnectionString, "SELECT * FROM `accounts`"))
{
while (reader.Read())
{
var account = new Account()
{
Id = reader.GetUInt64("Id"),
Name = reader.GetString("Name"),
Password = reader.GetString("Password"),
Email = reader.GetString("Email"),
// ...
};
accounts.Add(account);
}
}
[/SRC]
Или доставить ещё Dapper и тогда можно так:
[SRC="csharp"]using (var connection = Cached.GetConnection) // connection = MySqlConnection
{
var accounts = SqlMapper.Query<AccountModel>(connection, "SELECT * FROM `accounts`");
return accounts;
}
[/SRC]
И выбираешь при авторизации по логину (токену если нужно):
[SRC="csharp"]var account = accounts.FirstOrDefault(x => x.Login == login);
[/SRC]
ConnectionString имеет следующий вид:
Код: $"server={server};port={port};database={database};Character Set={encoding};User Id={user};password={password}"
Спасибо , а вот на счет этого?
Цитата:Ошибка так и осталась, хоть я и изменил
ClientConnection
public void BeginRead(IAsyncResult asyncResult)
{
try
{
int received = Stream.EndRead(asyncResult);
if (received != 0)
{
while (received >= 6)
{
int length = BitConverter.ToUInt16(buffer, 0) & 0x7FFF;
byte[] temp = new byte[length + 2];
Array.Copy(buffer, 2, temp, 0, temp.Length);
int bits = Id % 7 + 1;
BitShift.Unshift(temp, bits);
byte[] opcode = new byte[] { temp[0], temp[1] };
RecvOpcode packet = (RecvOpcode)BitConverter.ToUInt16(opcode, 0);
Type t = Type.GetType("PiercingBlow.Login.Network.Recv." + packet.ToString());
if (t != null)
{
ClientPacket clientpacket = (ClientPacket)Activator.CreateInstance(t);
clientpacket.Client = this;
clientpacket.Process(temp);
}
else
{
Log.Info("PacketId = {0}", BitConverter.ToUInt16(opcode, 0), buffer.Length);
Log.Trace(temp.ToHex());
}
received -= length + 4;
Array.Copy(buffer, length + 4, buffer, 0, received);
}
Stream.BeginRead(buffer, 0, buffer.Length, BeginRead, Stream);
}
else
{
OnDisconnected(this);
}
}
catch (IOException)
{
OnDisconnected(this);
}
catch (Exception ex)
{
OnDisconnected(this);
Log.Error("Disconnect",ex);
}
}
Сообщений: 6,450
Тем: 262
Зарегистрирован: Nov 2007
Репутация:
44,165
Тебе виднее, я же не вижу, как себя ведёт клиент.
Может после подключения он валится от какой-то ошибки.
Сообщений: 538
Тем: 76
Зарегистрирован: Aug 2012
Репутация:
7
При попытке войти , клиент сразу отключает.
ClientPacket
public string ReadS(int length)
{
string text = "";
try
{
text = Encoding.Default.GetString(_buffer, _offset, length);
int _length = text.IndexOf(char.MinValue);
if (_length != -1)
{
text = text.Substring(0, _length);
}
_offset += length;
}
catch (Exception e)
{
Log.Error(e.ToString());
}
return text;
}
PROTOCOL_LOGIN_REQ
public override void ReadImpl()
{
ReadB(100);
PasswordLength = ReadC();
Password = ReadS(PasswordLength);
LoginLength = ReadC();
Login = ReadS(LoginLength);
}
public override void RunImpl()
{
var manager = AccountManager.Instance;
Client.Account = manager.GetAccount(Login);
Client.SendPacket(new PROTOCOL_LOGIN_ACK(manager.IsValidAccount(Login, Password), Client.Account));
}
PROTOCOL_LOGIN_ACK
WriteB(new byte[15]);
string id = account.Id.ToString();
WriteC(0);
WriteS(id, id.Length);
WriteC(0);
WriteC(account.Login.Length);
WriteS(account.Login);
WriteQ(account.Id);
WriteD((int)state);
Сообщений: 6,450
Тем: 262
Зарегистрирован: Nov 2007
Репутация:
44,165
Открой для себя BinaryReader и BinaryWriter и не нужно будет париться об офсетах.
Код: int _length = text.IndexOf(char.MinValue);
if (_length != -1)
{
text = text.Substring(0, _length);
}
Это не длина, а индекс (IndexOf как бы намекает).
[SRC="csharp"]int index = text.IndexOf('\0');
if (index != -1)
{
text = text.Remove(index);
}
[/SRC]
P.S. Незачем новую тему создавать, ты же пару дней назад с таким же названием создал.
Сообщений: 538
Тем: 76
Зарегистрирован: Aug 2012
Репутация:
7
PROGRAMMATOR Написал:Открой для себя BinaryReader и BinaryWriter и не нужно будет париться об офсетах.
Код: int _length = text.IndexOf(char.MinValue);
if (_length != -1)
{
text = text.Substring(0, _length);
}
Это не длина, а индекс (IndexOf как бы намекает).
[SRC="csharp"]int index = text.IndexOf('\0');
if (index != -1)
{
text = text.Remove(index);
}
[/SRC]
P.S. Незачем новую тему создавать, ты же пару дней назад с таким же названием создал.
ты имеешь ввиду что-то типа такого?
Код: private BinaryReader reader;
private byte[] _buffer;
private int _offset;
public int Remaining { get { return (int)(_buffer - _offset); } }
public int ReadInt()
{
if (Remaining < 4)
throw new IndexOutOfRangeException();
return reader.ReadInt32();
}
Сообщений: 6,450
Тем: 262
Зарегистрирован: Nov 2007
Репутация:
44,165
Типа такого:
[SRC="csharp"]public class PacketReader
{
MemoryStream stream;
BinaryReader reader;
/// <summary>
///
/// </summary>
/// <param name="buffer"></param>
public void Init(byte[] buffer)
{
stream = new MemoryStream(buffer);
reader = new BinaryReader(stream);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
protected int ReadInt() => reader.ReadInt();
/// ...
}
[/SRC]
Сообщений: 538
Тем: 76
Зарегистрирован: Aug 2012
Репутация:
7
то есть вместо ReadD будет использоваться protected int ReadInt() => reader.ReadInt(); ?
|