目前我正在尝试使用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套接字问题让我发疯,有人可以帮我这个吗?
答案 0 :(得分:1)
它没有响应,因为您的套接字代码是synchronous
(阻塞)。您可以通过使用asynchronous
版本的套接字函数或使用线程来完成所有接收内容来解决此问题。这已被多次回答,我将链接到答案。
TCP Server in Unity 只需将代码移植到客户端。