(tools, client, server) feat: Complete ProtoBuf message transmission with both TCP and UDP
This commit is contained in:
@ -584,7 +584,7 @@ GameObject:
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &1388451206
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
|
@ -8,6 +8,8 @@ namespace Network
|
||||
{
|
||||
public class UnityTcpClient : Singleton<UnityTcpClient>, IDisposable
|
||||
{
|
||||
private const int TcpMaxPayloadSize = 1460;
|
||||
|
||||
private TcpClient _client;
|
||||
private bool _disposed;
|
||||
|
||||
@ -34,9 +36,9 @@ namespace Network
|
||||
|
||||
await stream.WriteAsync(data, 0, data.Length);
|
||||
|
||||
var buffer = new byte[1024];
|
||||
await stream.ReadAsync(buffer);
|
||||
return buffer;
|
||||
var buffer = new byte[TcpMaxPayloadSize];
|
||||
var len = await stream.ReadAsync(buffer);
|
||||
return buffer[..len];
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -30,11 +30,13 @@ namespace Protocol {
|
||||
"Eg8KB21lc3NhZ2UYAiABKAkiMwoNU2lnbnVwUmVxdWVzdBIQCgh1c2VybmFt",
|
||||
"ZRgBIAEoCRIQCghwYXNzd29yZBgCIAEoCSJKCg5TaWdudXBSZXNwb25zZRIn",
|
||||
"CgZyZXN1bHQYASABKA4yFy5wcm90b2NvbC5SZXF1ZXN0UmVzdWx0Eg8KB21l",
|
||||
"c3NhZ2UYAiABKAkqJgoNUmVxdWVzdFJlc3VsdBILCgdTdWNjZXNzEAASCAoE",
|
||||
"RmFpbBABYgZwcm90bzM="));
|
||||
"c3NhZ2UYAiABKAkqWQoLTWVzc2FnZVR5cGUSEAoMbG9naW5SZXF1ZXN0EAAS",
|
||||
"EQoNbG9naW5SZXNwb25zZRABEhEKDXNpZ251cFJlcXVlc3QQAhISCg5zaWdu",
|
||||
"dXBSZXNwb25zZRADKiYKDVJlcXVlc3RSZXN1bHQSCwoHU3VjY2VzcxAAEggK",
|
||||
"BEZhaWwQAWIGcHJvdG8z"));
|
||||
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
|
||||
new pbr::FileDescriptor[] { },
|
||||
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Protocol.RequestResult), }, null, new pbr::GeneratedClrTypeInfo[] {
|
||||
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Protocol.MessageType), typeof(global::Protocol.RequestResult), }, null, new pbr::GeneratedClrTypeInfo[] {
|
||||
new pbr::GeneratedClrTypeInfo(typeof(global::Protocol.LoginRequest), global::Protocol.LoginRequest.Parser, new[]{ "Username", "Password" }, null, null, null, null),
|
||||
new pbr::GeneratedClrTypeInfo(typeof(global::Protocol.LoginResponse), global::Protocol.LoginResponse.Parser, new[]{ "Result", "Message" }, null, null, null, null),
|
||||
new pbr::GeneratedClrTypeInfo(typeof(global::Protocol.SignupRequest), global::Protocol.SignupRequest.Parser, new[]{ "Username", "Password" }, null, null, null, null),
|
||||
@ -45,6 +47,13 @@ namespace Protocol {
|
||||
|
||||
}
|
||||
#region Enums
|
||||
public enum MessageType {
|
||||
[pbr::OriginalName("loginRequest")] LoginRequest = 0,
|
||||
[pbr::OriginalName("loginResponse")] LoginResponse = 1,
|
||||
[pbr::OriginalName("signupRequest")] SignupRequest = 2,
|
||||
[pbr::OriginalName("signupResponse")] SignupResponse = 3,
|
||||
}
|
||||
|
||||
public enum RequestResult {
|
||||
[pbr::OriginalName("Success")] Success = 0,
|
||||
[pbr::OriginalName("Fail")] Fail = 1,
|
||||
|
@ -1,5 +1,7 @@
|
||||
using Google.Protobuf;
|
||||
using Network;
|
||||
using System.Text;
|
||||
using Protocol;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Test
|
||||
@ -8,12 +10,30 @@ namespace Test
|
||||
{
|
||||
private async void Start()
|
||||
{
|
||||
var sendBytes = Encoding.UTF8.GetBytes("This is a test string sent via TCP.");
|
||||
var request = new LoginRequest
|
||||
{
|
||||
Username = "原神,启动!(通过TCP)",
|
||||
Password = "20200928",
|
||||
};
|
||||
|
||||
var receivedBytes = await UnityTcpClient.Instance.SendAndReceiveData(sendBytes);
|
||||
var receivedString = Encoding.UTF8.GetString(receivedBytes);
|
||||
var requestBytes = new byte[request.CalculateSize()];
|
||||
request.WriteTo(requestBytes);
|
||||
|
||||
Debug.Log($"Received string: {receivedString}");
|
||||
var sendBytes = new List<byte>
|
||||
{
|
||||
(byte)MessageType.LoginRequest
|
||||
};
|
||||
sendBytes.AddRange(requestBytes);
|
||||
|
||||
var responseBytes = await UnityTcpClient.Instance.SendAndReceiveData(sendBytes.ToArray());
|
||||
|
||||
if (responseBytes.Length == 0) return;
|
||||
else if (responseBytes[0] == (byte)MessageType.LoginResponse)
|
||||
{
|
||||
var response = LoginResponse.Parser.ParseFrom(responseBytes[1..]);
|
||||
|
||||
Debug.Log($"Received response: {response}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
using Google.Protobuf;
|
||||
using Network;
|
||||
using System.Text;
|
||||
using Protocol;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Test
|
||||
@ -8,12 +10,30 @@ namespace Test
|
||||
{
|
||||
private async void Start()
|
||||
{
|
||||
var sendBytes = Encoding.UTF8.GetBytes("This is a test string sent via UDP.");
|
||||
var request = new LoginRequest
|
||||
{
|
||||
Username = "原神,启动!(谁会通过UDP启动啊喂!)",
|
||||
Password = "20200928",
|
||||
};
|
||||
|
||||
var receivedBytes = await UnityUdpClient.Instance.SendAndReceiveData(sendBytes);
|
||||
var receivedString = Encoding.UTF8.GetString(receivedBytes);
|
||||
var requestBytes = new byte[request.CalculateSize()];
|
||||
request.WriteTo(requestBytes);
|
||||
|
||||
Debug.Log($"Received string: {receivedString}");
|
||||
var sendBytes = new List<byte>
|
||||
{
|
||||
(byte)MessageType.LoginRequest
|
||||
};
|
||||
sendBytes.AddRange(requestBytes);
|
||||
|
||||
var responseBytes = await UnityUdpClient.Instance.SendAndReceiveData(sendBytes.ToArray());
|
||||
|
||||
if (responseBytes.Length == 0) return;
|
||||
else if (responseBytes[0] == (byte)MessageType.LoginResponse)
|
||||
{
|
||||
var response = LoginResponse.Parser.ParseFrom(responseBytes[1..]);
|
||||
|
||||
Debug.Log($"Received response: {response}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user