まず第一に、私がここでやろうとしていることを正確に説明するタイトルが見つかりませんでした。
私が理解できないように見えるのは、メッセージに複数の部分があるメッセージを tcp クライアントからサーバーに送信する方法です。例えば:
*(msgID = 1 / ユーザー名: vincent / パスワード: 123admin) <-- これが完全なメッセージです。
ご覧のとおり、ログイン システムを作成しようとしています。質問に戻ると、私の問題は、各セクションを配列に追加して、配列が受信されたときにメッセージ ID ect の文字列をチェックすることなく各セクションを分割できるようにすることです。
また、反射について聞いたことがありますか?ネットワークを介してリモートでメソッドを呼び出すようなものだと思いますか? CheckLoginDetails(int ID, string username,string password) などの私の状況では、このメソッドの方が適している可能性があります。詳細が正しい場合、このメソッドは true または false をクライアントに返しますか? この方法がより適していると思われる場合は、この方法を学びたいと思います! 私はUnity3Dを使用していましたが、ネットワークにはこのようなものが含まれていました。
これが私が今いる場所です:
サーバ:
private void HandleClient(TcpClient c)
{
byte[] packetIDData = new byte[2];
c.GetStream().Read(packetIDData, 0, 2);
ushort packetID = BitConverter.ToUInt16(packetIDData,0);
Console.WriteLine("PacketID: " + packetID.ToString());
switch (packetID)
{
case 0:
break;
case (int)RequestTypeEnum.login:
break;
case (int)RequestTypeEnum.logout:
break;
case (int)RequestTypeEnum.ping:
break;
case (int)RequestTypeEnum.update:
byte[] data = new byte[4];
c.GetStream().Read(data, 0, 4);
int length = BitConverter.ToInt32(data, 0);
data = new byte[length];
c.GetStream().Read(data, 0, length);
List<byte> backData = new List<byte>();
backData.AddRange(BitConverter.GetBytes((short)0));
string response = Encoding.ASCII.GetString(data);
backData.AddRange(BitConverter.GetBytes(Encoding.ASCII.GetByteCount(response)));
backData.AddRange(Encoding.ASCII.GetBytes(response));
c.GetStream().Write(backData.ToArray(), 0, backData.ToArray().Length);
break;
}
c.Close();
}
クライアント:
List<byte> updateData = new List<byte>();
updateData.AddRange(BitConverter.GetBytes((short)RequestTypeEnum.login));
updateData.AddRange(StringMethods.MakeString(username));
updateData.AddRange(StringMethods.MakeString(password)); // this needs encryption
client.GetStream().Write(updateData.ToArray(), 0, updateData.Count);
client.GetStream().Read(new byte[2], 0, 2);
string answer = StringMethods.ReadString(client);
switch (answer)
{
case "success":
return true;
case "failed":
return false;
default:
return false;
}