163 lines
3.7 KiB
C#
163 lines
3.7 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
using NativeWebSocket;
|
|
|
|
public class GIWebSocket
|
|
{
|
|
|
|
private WebSocket websocket;
|
|
|
|
private Queue inputStream;
|
|
|
|
|
|
|
|
// Start is called before the first frame update
|
|
public GIWebSocket()
|
|
{
|
|
inputStream = new Queue();
|
|
}
|
|
|
|
public async System.Threading.Tasks.Task<bool> connect(string serverIP, int port)
|
|
{
|
|
//Debug.Log("attempting to connect");
|
|
websocket = new WebSocket("ws://" + serverIP + ":" + port);
|
|
|
|
websocket.OnOpen += () =>
|
|
{
|
|
closed = false;
|
|
Debug.Log("Connection open!");
|
|
PacketManager.sendLoginRequest(Client.Instance.myUsername, Client.Instance.myPassword);
|
|
};
|
|
|
|
websocket.OnError += (e) =>
|
|
{
|
|
Debug.Log("Error! " + e);
|
|
//set the login message
|
|
UIManager.Instance.LoginMessage.text = "Error connecting to server.";
|
|
};
|
|
|
|
websocket.OnClose += (e) =>
|
|
{
|
|
Debug.Log("Connection closed!");
|
|
closed = true;
|
|
};
|
|
|
|
websocket.OnMessage += (bytes) =>
|
|
{
|
|
// Reading a plain text message
|
|
//var message = System.Text.Encoding.UTF8.GetString(bytes);
|
|
//Debug.Log("Received OnMessage! (" + bytes.Length + " bytes) ");
|
|
String data = "";
|
|
if (bytes.Length == 2)
|
|
{
|
|
if (bytes[1] == 2)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
for (int i = 0; i < bytes.Length; i++)
|
|
{
|
|
data += bytes[i] + " ";
|
|
this.inputStream.Enqueue(bytes[i]);
|
|
}
|
|
//Debug.Log(data);
|
|
};
|
|
|
|
|
|
// waiting for messages
|
|
await websocket.Connect();
|
|
|
|
//run this after 1 second
|
|
//Client.Instance.pushOutStreamCR();
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
public void Update()
|
|
{
|
|
#if !UNITY_WEBGL || UNITY_EDITOR
|
|
if (websocket != null)
|
|
{
|
|
websocket.DispatchMessageQueue();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
public async void SendWebSocketMessage()
|
|
{
|
|
if (websocket.State == WebSocketState.Open)
|
|
{
|
|
// Sending bytes
|
|
await websocket.Send(new byte[] { 10, 20, 30 });
|
|
|
|
// Sending plain text
|
|
await websocket.SendText("plain text message");
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("not connected.");
|
|
}
|
|
}
|
|
|
|
public void readInputStream(ref byte[] data, int size)
|
|
{
|
|
if (size > inputStream.Count)
|
|
{
|
|
throw new System.IO.IOException("EOF");
|
|
}
|
|
if (websocket.State == WebSocketState.Open)
|
|
{
|
|
for (int i = 0; i < size; i++)
|
|
{
|
|
data[i] = (byte)inputStream.Dequeue();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void send(byte[] packet)
|
|
{
|
|
if (websocket == null)
|
|
return;
|
|
|
|
if (websocket.State == WebSocketState.Open)
|
|
{
|
|
//uncomment to prefix size
|
|
// Sending bytes
|
|
// short size = (short)(packet.Length - 1);
|
|
// byte[] payload = new byte[packet.Length + 2];
|
|
// payload[0] = (byte)(size >> 8);
|
|
// payload[1] = (byte)size;
|
|
//
|
|
// for (int i = 0; i < packet.Length; i++)
|
|
// {
|
|
// payload[i + 2] = packet[i];
|
|
// }
|
|
|
|
websocket.Send(packet);
|
|
}
|
|
}
|
|
|
|
public int available()
|
|
{
|
|
return inputStream.Count;
|
|
}
|
|
|
|
public void close()
|
|
{
|
|
websocket.Close();
|
|
closed = true;
|
|
}
|
|
|
|
public bool isClosed()
|
|
{
|
|
return closed;
|
|
}
|
|
|
|
private bool closed;
|
|
}
|
|
|