WebSocket.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Collections;
  8. using UnityEngine;
  9. using System.Runtime.InteropServices;
  10. public class WebSocket
  11. {
  12. private Uri mUrl;
  13. public WebSocket(Uri url)
  14. {
  15. mUrl = url;
  16. string protocol = mUrl.Scheme;
  17. if (!protocol.Equals("ws") && !protocol.Equals("wss"))
  18. throw new ArgumentException("Unsupported protocol: " + protocol);
  19. }
  20. public void SendString(string str)
  21. {
  22. Send(Encoding.UTF8.GetBytes (str));
  23. }
  24. public string RecvString()
  25. {
  26. byte[] retval = Recv();
  27. if (retval == null)
  28. return null;
  29. return Encoding.UTF8.GetString (retval);
  30. }
  31. #if UNITY_WEBGL && !UNITY_EDITOR
  32. [DllImport("__Internal")]
  33. private static extern int SocketCreate (string url);
  34. [DllImport("__Internal")]
  35. private static extern int SocketState (int socketInstance);
  36. [DllImport("__Internal")]
  37. private static extern void SocketSend (int socketInstance, byte[] ptr, int length);
  38. [DllImport("__Internal")]
  39. private static extern void SocketRecv (int socketInstance, byte[] ptr, int length);
  40. [DllImport("__Internal")]
  41. private static extern int SocketRecvLength (int socketInstance);
  42. [DllImport("__Internal")]
  43. private static extern void SocketClose (int socketInstance);
  44. [DllImport("__Internal")]
  45. private static extern int SocketError (int socketInstance, byte[] ptr, int length);
  46. int m_NativeRef = 0;
  47. public void Send(byte[] buffer)
  48. {
  49. SocketSend (m_NativeRef, buffer, buffer.Length);
  50. }
  51. public byte[] Recv()
  52. {
  53. int length = SocketRecvLength (m_NativeRef);
  54. if (length == 0)
  55. return null;
  56. byte[] buffer = new byte[length];
  57. SocketRecv (m_NativeRef, buffer, length);
  58. return buffer;
  59. }
  60. public IEnumerator Connect()
  61. {
  62. m_NativeRef = SocketCreate (mUrl.ToString());
  63. while (SocketState(m_NativeRef) == 0)
  64. yield return 0;
  65. }
  66. public void Close()
  67. {
  68. SocketClose(m_NativeRef);
  69. }
  70. public string error
  71. {
  72. get {
  73. const int bufsize = 1024;
  74. byte[] buffer = new byte[bufsize];
  75. int result = SocketError (m_NativeRef, buffer, bufsize);
  76. if (result == 0)
  77. return null;
  78. return Encoding.UTF8.GetString (buffer);
  79. }
  80. }
  81. #else
  82. WebSocketSharp.WebSocket m_Socket;
  83. Queue<byte[]> m_Messages = new Queue<byte[]>();
  84. bool m_IsConnected = false;
  85. string m_Error = null;
  86. public IEnumerator Connect()
  87. {
  88. m_Socket = new WebSocketSharp.WebSocket(mUrl.ToString());
  89. m_Socket.OnMessage += (sender, e) => m_Messages.Enqueue (e.RawData);
  90. m_Socket.OnOpen += (sender, e) => m_IsConnected = true;
  91. m_Socket.OnError += (sender, e) => m_Error = e.Message;
  92. m_Socket.ConnectAsync();
  93. while (!m_IsConnected && m_Error == null)
  94. yield return 0;
  95. }
  96. public void Send(byte[] buffer)
  97. {
  98. m_Socket.Send(buffer);
  99. }
  100. public byte[] Recv()
  101. {
  102. if (m_Messages.Count == 0)
  103. return null;
  104. return m_Messages.Dequeue();
  105. }
  106. public void Close()
  107. {
  108. m_Socket.Close();
  109. }
  110. public string error
  111. {
  112. get {
  113. return m_Error;
  114. }
  115. }
  116. #endif
  117. }