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 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; }