Unity .net socket + protobuf问题

时间:2016-05-11 10:05:15

标签: c# sockets unity3d

目前我正在尝试使用Unity开发多人游戏。我检查了Unity的内置网络和NetworkManager,但我需要服务器专用。因此我开发了一个java服务器并实现了由Google提供的protolbuf。它适用于我的cocos项目,但不适用于这个Unity项目。

两个问题,首先,无论我发送到服务器的是什么,服务器端都有一个InvalidProtolBufferException:

  

在解析协议消息时,输入意外地在中间结束>一个领域。这可能意味着要么输入被截断,要么意味着>嵌入式消息误报了自己的长度。

第二,stream.read方法总是让我的团结没有回应。这是我的客户端代码:

public class SocketClient : MonoBehaviour {

public Text send;
public Text read;

const string ipAddress = "192.168.0.233";
const int port = 8080;

TcpClient socket;
NetworkStream stream;
BinaryWriter bw;
BinaryReader br;

// Use this for initialization
void Start () {
    SetupSocket();    
}

void SetupSocket() {
    socket = new TcpClient(ipAddress, port);
    stream = socket.GetStream();
    bw = new BinaryWriter(socket.GetStream());
    br = new BinaryReader(socket.GetStream());
}

// Update is called once per frame
void Update () {
    ReadMessage();
}

public void SendMessage() {
    //NetworkStream stream = new NetworkStream(socket.Client);

    MessagesProto msg = new MessagesProto();
    msg.id = int.Parse(send.text);
    using (MemoryStream ms = new MemoryStream())
    {

        Serializer.Serialize<MessagesProto>(ms, msg);
        ms.Position = 0;
        byte[] data = ms.ToArray();
        ms.Position = 0;
        //foreach (byte d in data) {
        //    Debug.Log(d);
        //}

        stream.Write(data, 0 , data.Length);
    } 
}

public void ReadMessage() {
    if (stream.CanRead) {
        //byte[] receiveData = new byte[socket.ReceiveBufferSize];
        byte[] receiveData = new byte[4];
        socket.GetStream().Read(receiveData, 0, 4);
        Debug.Log("Loading...");
        using (MemoryStream ms = new MemoryStream()) {
            ms.Write(receiveData, 0, receiveData.Length);
            ms.Position = 0;
            var msg = Serializer.Deserialize<MessagesProto>(ms);
            read.text = msg.data + "";
        }
    }
}

}

我尝试将stream.CanRead设置为stream.DataAvailable,不再崩溃但不读任何东西,这些.Net套接字问题让我发疯,有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

它没有响应,因为您的套接字代码是synchronous(阻塞)。您可以通过使用asynchronous版本的套接字函数或使用线程来完成所有接收内容来解决此问题。这已被多次回答,我将链接到答案。

TCP Server in Unity 只需将代码移植到客户端。

UDP