first commit
This commit is contained in:
parent
67d3585285
commit
97c51bcc8f
12
websocket-sharp.userprefs
Normal file
12
websocket-sharp.userprefs
Normal file
@ -0,0 +1,12 @@
|
||||
<Properties>
|
||||
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug_Ubuntu" ctype="Workspace" />
|
||||
<MonoDevelop.Ide.Workbench ActiveDocument="websocket-sharp/WebSocket.cs" ctype="Workbench">
|
||||
<Files>
|
||||
<File FileName="websocket-sharp/WebSocket.cs" Line="5" Column="54" />
|
||||
</Files>
|
||||
</MonoDevelop.Ide.Workbench>
|
||||
<MonoDevelop.Ide.DebuggingService.Breakpoints>
|
||||
<BreakpointStore />
|
||||
</MonoDevelop.Ide.DebuggingService.Breakpoints>
|
||||
<MonoDevelop.Ide.DebuggingService.PinnedWatches ctype="PinnedWatchStore" />
|
||||
</Properties>
|
27
websocket-sharp/AssemblyInfo.cs
Normal file
27
websocket-sharp/AssemblyInfo.cs
Normal file
@ -0,0 +1,27 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
// Information about this assembly is defined by the following attributes.
|
||||
// Change them to the values specific to your project.
|
||||
|
||||
[assembly: AssemblyTitle("websocket-sharp")]
|
||||
[assembly: AssemblyDescription("A C# implementation of a WebSocket protocol client")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("websocket-sharp.dll")]
|
||||
[assembly: AssemblyCopyright("sta.blockhead")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
||||
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
||||
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
||||
|
||||
[assembly: AssemblyVersion("1.0.0.*")]
|
||||
|
||||
// The following attributes are used to specify the signing key for the assembly,
|
||||
// if desired. See the Mono documentation for more information about signing.
|
||||
|
||||
//[assembly: AssemblyDelaySign(false)]
|
||||
//[assembly: AssemblyKeyFile("")]
|
||||
|
51
websocket-sharp/Ext.cs
Normal file
51
websocket-sharp/Ext.cs
Normal file
@ -0,0 +1,51 @@
|
||||
#region MIT License
|
||||
/**
|
||||
* Ext.cs
|
||||
*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2010 sta.blockhead
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace WebSocketSharp
|
||||
{
|
||||
public static class Ext
|
||||
{
|
||||
public static bool EqualsWithSaveTo(this int asbyte, char c, List<byte> dist)
|
||||
{
|
||||
byte b = (byte)asbyte;
|
||||
dist.Add(b);
|
||||
return b == Convert.ToByte(c);
|
||||
}
|
||||
|
||||
public static void NotEqualsDo(this string a, string b, Action<string> action)
|
||||
{
|
||||
if (a != b)
|
||||
{
|
||||
action(a);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
41
websocket-sharp/IWsStream.cs
Normal file
41
websocket-sharp/IWsStream.cs
Normal file
@ -0,0 +1,41 @@
|
||||
#region MIT License
|
||||
/**
|
||||
* IWsStream.cs
|
||||
*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2010 sta.blockhead
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
|
||||
namespace WebSocketSharp
|
||||
{
|
||||
public interface IWsStream : IDisposable
|
||||
{
|
||||
void Close();
|
||||
int Read(byte[] buffer, int offset, int size);
|
||||
int ReadByte();
|
||||
void Write(byte[] buffer, int offset, int count);
|
||||
void WriteByte(byte value);
|
||||
}
|
||||
}
|
450
websocket-sharp/WebSocket.cs
Normal file
450
websocket-sharp/WebSocket.cs
Normal file
@ -0,0 +1,450 @@
|
||||
#region MIT License
|
||||
/**
|
||||
* WebSocket.cs
|
||||
*
|
||||
* A C# implementation of a WebSocket protocol client.
|
||||
* This code derived from WebSocket.java (http://github.com/adamac/Java-WebSocket-client).
|
||||
*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2009 Adam MacBeth
|
||||
* Copyright (c) 2010 sta.blockhead
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
#if NOTIFY
|
||||
using Notifications;
|
||||
#endif
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Security;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
namespace WebSocketSharp
|
||||
{
|
||||
public delegate void MessageEventHandler(object sender, string eventdata);
|
||||
|
||||
public class WebSocket : IDisposable
|
||||
{
|
||||
private Uri uri;
|
||||
public string Url
|
||||
{
|
||||
get
|
||||
{
|
||||
return uri.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
private volatile WsState readyState;
|
||||
public WsState ReadyState
|
||||
{
|
||||
get
|
||||
{
|
||||
return readyState;
|
||||
}
|
||||
|
||||
private set
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
case WsState.OPEN:
|
||||
if (OnOpen != null)
|
||||
{
|
||||
OnOpen(this, EventArgs.Empty);
|
||||
}
|
||||
goto default;
|
||||
case WsState.CLOSING:
|
||||
case WsState.CLOSED:
|
||||
close(value);
|
||||
break;
|
||||
default:
|
||||
readyState = value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private StringBuilder unTransmittedBuffer;
|
||||
public String UnTransmittedBuffer
|
||||
{
|
||||
get { return unTransmittedBuffer.ToString(); }
|
||||
}
|
||||
|
||||
private long bufferedAmount;
|
||||
public long BufferedAmount
|
||||
{
|
||||
get { return bufferedAmount; }
|
||||
}
|
||||
|
||||
private string protocol;
|
||||
public string Protocol
|
||||
{
|
||||
get { return protocol; }
|
||||
}
|
||||
|
||||
private TcpClient tcpClient;
|
||||
private NetworkStream netStream;
|
||||
private SslStream sslStream;
|
||||
private IWsStream wsStream;
|
||||
private Thread msgThread;
|
||||
#if NOTIFY
|
||||
private Notification msgNf;
|
||||
public Notification MsgNf
|
||||
{
|
||||
get { return msgNf; }
|
||||
}
|
||||
#endif
|
||||
public event EventHandler OnOpen;
|
||||
public event MessageEventHandler OnMessage;
|
||||
public event MessageEventHandler OnError;
|
||||
public event EventHandler OnClose;
|
||||
|
||||
public WebSocket(string url)
|
||||
: this(url, String.Empty)
|
||||
{
|
||||
}
|
||||
|
||||
public WebSocket(string url, string protocol)
|
||||
{
|
||||
this.uri = new Uri(url);
|
||||
string scheme = uri.Scheme;
|
||||
|
||||
if (scheme != "ws" && scheme != "wss")
|
||||
{
|
||||
throw new ArgumentException("Unsupported scheme: " + scheme);
|
||||
}
|
||||
|
||||
this.readyState = WsState.CONNECTING;
|
||||
this.unTransmittedBuffer = new StringBuilder();
|
||||
this.bufferedAmount = 0;
|
||||
this.protocol = protocol;
|
||||
}
|
||||
|
||||
public void Connect()
|
||||
{
|
||||
createConnection();
|
||||
doHandshake();
|
||||
|
||||
this.msgThread = new Thread(new ThreadStart(message));
|
||||
msgThread.IsBackground = true;
|
||||
msgThread.Start();
|
||||
}
|
||||
|
||||
public void Send(string data)
|
||||
{
|
||||
if (readyState == WsState.CONNECTING)
|
||||
{
|
||||
throw new InvalidOperationException("Handshake not complete.");
|
||||
}
|
||||
|
||||
byte[] dataBuffer = Encoding.UTF8.GetBytes(data);
|
||||
|
||||
try
|
||||
{
|
||||
wsStream.WriteByte(0x00);
|
||||
wsStream.Write(dataBuffer, 0, dataBuffer.Length);
|
||||
wsStream.WriteByte(0xff);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
unTransmittedBuffer.Append(data);
|
||||
bufferedAmount += dataBuffer.Length;
|
||||
|
||||
if (OnError != null)
|
||||
{
|
||||
OnError(this, e.Message);
|
||||
}
|
||||
#if DEBUG
|
||||
Console.WriteLine("WS: Error @Send: {0}", e.Message);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
ReadyState = WsState.CLOSING;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
private void close(WsState state)
|
||||
{
|
||||
#if DEBUG
|
||||
Console.WriteLine("WS: Info @close: Current thread IsBackground: {0}", Thread.CurrentThread.IsBackground);
|
||||
#endif
|
||||
if (readyState == WsState.CLOSING ||
|
||||
readyState == WsState.CLOSED)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
readyState = state;
|
||||
|
||||
if (OnClose != null)
|
||||
{
|
||||
OnClose(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
if (wsStream != null && tcpClient.Connected)
|
||||
{
|
||||
try
|
||||
{
|
||||
wsStream.WriteByte(0xff);
|
||||
wsStream.WriteByte(0x00);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
#if DEBUG
|
||||
Console.WriteLine("WS: Error @close: {0}", e.Message);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (!(Thread.CurrentThread.IsBackground) &&
|
||||
msgThread != null && msgThread.IsAlive)
|
||||
{
|
||||
msgThread.Join();
|
||||
}
|
||||
|
||||
if (wsStream != null)
|
||||
{
|
||||
wsStream.Dispose();
|
||||
wsStream = null;
|
||||
}
|
||||
|
||||
if (tcpClient != null)
|
||||
{
|
||||
tcpClient.Close();
|
||||
tcpClient = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void createConnection()
|
||||
{
|
||||
string scheme = uri.Scheme;
|
||||
string host = uri.DnsSafeHost;
|
||||
int port = uri.Port;
|
||||
|
||||
if (port <= 0)
|
||||
{
|
||||
if (scheme == "wss")
|
||||
{
|
||||
port = 443;
|
||||
}
|
||||
else
|
||||
{
|
||||
port = 80;
|
||||
}
|
||||
}
|
||||
|
||||
this.tcpClient = new TcpClient(host, port);
|
||||
this.netStream = tcpClient.GetStream();
|
||||
|
||||
if (scheme == "wss")
|
||||
{
|
||||
this.sslStream = new SslStream(netStream);
|
||||
sslStream.AuthenticateAsClient(host);
|
||||
this.wsStream = new WsStream<SslStream>(sslStream);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.wsStream = new WsStream<NetworkStream>(netStream);
|
||||
}
|
||||
}
|
||||
|
||||
private void doHandshake()
|
||||
{
|
||||
string path = uri.PathAndQuery;
|
||||
string host = uri.DnsSafeHost;
|
||||
string origin = "http://" + host;
|
||||
|
||||
int port = ((IPEndPoint)tcpClient.Client.RemoteEndPoint).Port;
|
||||
if (port != 80)
|
||||
{
|
||||
host += ":" + port;
|
||||
}
|
||||
|
||||
string subprotocol = protocol != String.Empty
|
||||
? String.Format("Sec-WebSocket-Protocol: {0}\r\n", protocol)
|
||||
: protocol;
|
||||
|
||||
string request = "GET " + path + " HTTP/1.1\r\n" +
|
||||
"Upgrade: WebSocket\r\n" +
|
||||
"Connection: Upgrade\r\n" +
|
||||
subprotocol +
|
||||
"Host: " + host + "\r\n" +
|
||||
"Origin: " + origin + "\r\n" +
|
||||
"\r\n";
|
||||
#if DEBUG
|
||||
Console.WriteLine("WS: Info @doHandshake: Handshake from client: \n{0}", request);
|
||||
#endif
|
||||
byte[] sendBuffer = Encoding.UTF8.GetBytes(request);
|
||||
wsStream.Write(sendBuffer, 0, sendBuffer.Length);
|
||||
|
||||
string[] response;
|
||||
List<byte> rawdata = new List<byte>();
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (wsStream.ReadByte().EqualsWithSaveTo('\r', rawdata) &&
|
||||
wsStream.ReadByte().EqualsWithSaveTo('\n', rawdata) &&
|
||||
wsStream.ReadByte().EqualsWithSaveTo('\r', rawdata) &&
|
||||
wsStream.ReadByte().EqualsWithSaveTo('\n', rawdata))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
response = Encoding.UTF8.GetString(rawdata.ToArray())
|
||||
.Replace("\r\n", "\n").Replace("\n\n", "\n")
|
||||
.Split('\n');
|
||||
#if DEBUG
|
||||
Console.WriteLine("WS: Info @doHandshake: Handshake from server:");
|
||||
foreach (string s in response)
|
||||
{
|
||||
Console.WriteLine("{0}", s);
|
||||
}
|
||||
#endif
|
||||
Action<string> action = s => { throw new IOException("Invalid handshake response: " + s); };
|
||||
response[0].NotEqualsDo("HTTP/1.1 101 Web Socket Protocol Handshake", action);
|
||||
response[1].NotEqualsDo("Upgrade: WebSocket", action);
|
||||
response[2].NotEqualsDo("Connection: Upgrade", action);
|
||||
|
||||
for (int i = 3; i < response.Length; i++)
|
||||
{
|
||||
if (response[i].Contains("WebSocket-Protocol:"))
|
||||
// if (response[i].Contains("Sec-WebSocket-Protocol:"))
|
||||
{
|
||||
int j = response[i].IndexOf(":");
|
||||
protocol = response[i].Substring(j + 1).Trim();
|
||||
}
|
||||
}
|
||||
#if DEBUG
|
||||
Console.WriteLine("WS: Info @doHandshake: Sub protocol: {0}", protocol);
|
||||
#endif
|
||||
|
||||
ReadyState = WsState.OPEN;
|
||||
}
|
||||
|
||||
private void message()
|
||||
{
|
||||
#if DEBUG
|
||||
Console.WriteLine("WS: Info @message: Current thread IsBackground: {0}", Thread.CurrentThread.IsBackground);
|
||||
#endif
|
||||
string data;
|
||||
#if NOTIFY
|
||||
this.msgNf = new Notification();
|
||||
msgNf.AddHint("append", "allowed");
|
||||
#endif
|
||||
while (readyState == WsState.OPEN)
|
||||
{
|
||||
while (readyState == WsState.OPEN && netStream.DataAvailable)
|
||||
{
|
||||
data = receive();
|
||||
|
||||
if (OnMessage != null && data != null)
|
||||
{
|
||||
OnMessage(this, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
#if DEBUG
|
||||
Console.WriteLine("WS: Info @message: Exit message method.");
|
||||
#endif
|
||||
}
|
||||
|
||||
private string receive()
|
||||
{
|
||||
try
|
||||
{
|
||||
byte frame_type = (byte)wsStream.ReadByte();
|
||||
byte b;
|
||||
|
||||
if ((frame_type & 0x80) == 0x80)
|
||||
{
|
||||
// Skip data frame
|
||||
int len = 0;
|
||||
int b_v;
|
||||
|
||||
do
|
||||
{
|
||||
b = (byte)wsStream.ReadByte();
|
||||
b_v = b & 0x7f;
|
||||
len = len * 128 + b_v;
|
||||
}
|
||||
while ((b & 0x80) == 0x80);
|
||||
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
wsStream.ReadByte();
|
||||
}
|
||||
|
||||
if (frame_type == 0xff && len == 0)
|
||||
{
|
||||
ReadyState = WsState.CLOSED;
|
||||
#if DEBUG
|
||||
Console.WriteLine("WS: Info @receive: Server start closing handshake.");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else if (frame_type == 0x00)
|
||||
{
|
||||
List<byte> raw_data = new List<byte>();
|
||||
|
||||
while (true)
|
||||
{
|
||||
b = (byte)wsStream.ReadByte();
|
||||
|
||||
if (b == 0xff)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
raw_data.Add(b);
|
||||
}
|
||||
|
||||
return Encoding.UTF8.GetString(raw_data.ToArray());
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (OnError != null)
|
||||
{
|
||||
OnError(this, e.Message);
|
||||
}
|
||||
|
||||
ReadyState = WsState.CLOSED;
|
||||
#if DEBUG
|
||||
Console.WriteLine("WS: Error @receive: {0}", e.Message);
|
||||
#endif
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
40
websocket-sharp/WsState.cs
Normal file
40
websocket-sharp/WsState.cs
Normal file
@ -0,0 +1,40 @@
|
||||
#region MIT License
|
||||
/**
|
||||
* WsState.cs
|
||||
*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2010 sta.blockhead
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
|
||||
namespace WebSocketSharp
|
||||
{
|
||||
public enum WsState
|
||||
{
|
||||
CONNECTING,
|
||||
OPEN,
|
||||
CLOSING,
|
||||
CLOSED
|
||||
}
|
||||
}
|
90
websocket-sharp/WsStream.cs
Normal file
90
websocket-sharp/WsStream.cs
Normal file
@ -0,0 +1,90 @@
|
||||
#region MIT License
|
||||
/**
|
||||
* WsStream.cs
|
||||
*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2010 sta.blockhead
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net.Security;
|
||||
using System.Net.Sockets;
|
||||
using System.Reflection;
|
||||
|
||||
namespace WebSocketSharp
|
||||
{
|
||||
public class WsStream<T> : IWsStream
|
||||
where T : Stream
|
||||
{
|
||||
private T innerStream;
|
||||
|
||||
public WsStream(T innerStream)
|
||||
{
|
||||
if (innerStream == null)
|
||||
{
|
||||
throw new ArgumentNullException("innerStream");
|
||||
}
|
||||
|
||||
Type streamType = innerStream.GetType();
|
||||
if (streamType != typeof(NetworkStream) &&
|
||||
streamType != typeof(SslStream))
|
||||
{
|
||||
throw new ArgumentException("Unsupported Stream type: " + streamType.ToString());
|
||||
}
|
||||
|
||||
this.innerStream = innerStream;
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
innerStream.Close();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
innerStream.Dispose();
|
||||
}
|
||||
|
||||
public int Read(byte[] buffer, int offset, int size)
|
||||
{
|
||||
return innerStream.Read(buffer, offset, size);
|
||||
}
|
||||
|
||||
public int ReadByte()
|
||||
{
|
||||
return innerStream.ReadByte();
|
||||
}
|
||||
|
||||
public void Write(byte[] buffer, int offset, int count)
|
||||
{
|
||||
innerStream.Write(buffer, offset, count);
|
||||
}
|
||||
|
||||
public void WriteByte(byte value)
|
||||
{
|
||||
innerStream.WriteByte(value);
|
||||
}
|
||||
}
|
||||
}
|
BIN
websocket-sharp/bin/Debug/websocket-sharp.dll
Executable file
BIN
websocket-sharp/bin/Debug/websocket-sharp.dll
Executable file
Binary file not shown.
BIN
websocket-sharp/bin/Debug/websocket-sharp.dll.mdb
Normal file
BIN
websocket-sharp/bin/Debug/websocket-sharp.dll.mdb
Normal file
Binary file not shown.
BIN
websocket-sharp/bin/Debug_Ubuntu/websocket-sharp.dll
Executable file
BIN
websocket-sharp/bin/Debug_Ubuntu/websocket-sharp.dll
Executable file
Binary file not shown.
BIN
websocket-sharp/bin/Debug_Ubuntu/websocket-sharp.dll.mdb
Normal file
BIN
websocket-sharp/bin/Debug_Ubuntu/websocket-sharp.dll.mdb
Normal file
Binary file not shown.
BIN
websocket-sharp/bin/Release/websocket-sharp.dll
Executable file
BIN
websocket-sharp/bin/Release/websocket-sharp.dll
Executable file
Binary file not shown.
BIN
websocket-sharp/bin/Release_Ubuntu/websocket-sharp.dll
Executable file
BIN
websocket-sharp/bin/Release_Ubuntu/websocket-sharp.dll
Executable file
Binary file not shown.
67
websocket-sharp/websocket-sharp.csproj
Normal file
67
websocket-sharp/websocket-sharp.csproj
Normal file
@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.21022</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{B357BAC7-529E-4D81-A0D2-71041B19C8DE}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>WebSocketSharp</RootNamespace>
|
||||
<AssemblyName>websocket-sharp</AssemblyName>
|
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug</OutputPath>
|
||||
<DefineConstants>DEBUG</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<ConsolePause>false</ConsolePause>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>none</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Release</OutputPath>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<ConsolePause>false</ConsolePause>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_Ubuntu|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug_Ubuntu</OutputPath>
|
||||
<DefineConstants>DEBUG,NOTIFY</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<ConsolePause>false</ConsolePause>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_Ubuntu|AnyCPU' ">
|
||||
<DebugType>none</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Release_Ubuntu</OutputPath>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<ConsolePause>false</ConsolePause>
|
||||
<DefineConstants>NOTIFY</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="notify-sharp, Version=0.4.0.0, Culture=neutral, PublicKeyToken=2df29c54e245917a">
|
||||
<Package>notify-sharp</Package>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
<Compile Include="Ext.cs" />
|
||||
<Compile Include="WebSocket.cs" />
|
||||
<Compile Include="WsState.cs" />
|
||||
<Compile Include="IWsStream.cs" />
|
||||
<Compile Include="WsStream.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
BIN
websocket-sharp/websocket-sharp.pidb
Normal file
BIN
websocket-sharp/websocket-sharp.pidb
Normal file
Binary file not shown.
27
wsclient/AssemblyInfo.cs
Normal file
27
wsclient/AssemblyInfo.cs
Normal file
@ -0,0 +1,27 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
// Information about this assembly is defined by the following attributes.
|
||||
// Change them to the values specific to your project.
|
||||
|
||||
[assembly: AssemblyTitle("wsclient")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("")]
|
||||
[assembly: AssemblyCopyright("")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
||||
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
||||
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
||||
|
||||
[assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
// The following attributes are used to specify the signing key for the assembly,
|
||||
// if desired. See the Mono documentation for more information about signing.
|
||||
|
||||
//[assembly: AssemblyDelaySign(false)]
|
||||
//[assembly: AssemblyKeyFile("")]
|
||||
|
BIN
wsclient/bin/Debug/websocket-sharp.dll
Executable file
BIN
wsclient/bin/Debug/websocket-sharp.dll
Executable file
Binary file not shown.
BIN
wsclient/bin/Debug/websocket-sharp.dll.mdb
Normal file
BIN
wsclient/bin/Debug/websocket-sharp.dll.mdb
Normal file
Binary file not shown.
BIN
wsclient/bin/Debug/wsclient.exe
Executable file
BIN
wsclient/bin/Debug/wsclient.exe
Executable file
Binary file not shown.
BIN
wsclient/bin/Debug/wsclient.exe.mdb
Normal file
BIN
wsclient/bin/Debug/wsclient.exe.mdb
Normal file
Binary file not shown.
BIN
wsclient/bin/Debug_Ubuntu/websocket-sharp.dll
Executable file
BIN
wsclient/bin/Debug_Ubuntu/websocket-sharp.dll
Executable file
Binary file not shown.
BIN
wsclient/bin/Debug_Ubuntu/websocket-sharp.dll.mdb
Normal file
BIN
wsclient/bin/Debug_Ubuntu/websocket-sharp.dll.mdb
Normal file
Binary file not shown.
BIN
wsclient/bin/Debug_Ubuntu/wsclient.exe
Executable file
BIN
wsclient/bin/Debug_Ubuntu/wsclient.exe
Executable file
Binary file not shown.
BIN
wsclient/bin/Debug_Ubuntu/wsclient.exe.mdb
Normal file
BIN
wsclient/bin/Debug_Ubuntu/wsclient.exe.mdb
Normal file
Binary file not shown.
BIN
wsclient/bin/Release/websocket-sharp.dll
Executable file
BIN
wsclient/bin/Release/websocket-sharp.dll
Executable file
Binary file not shown.
BIN
wsclient/bin/Release/wsclient.exe
Executable file
BIN
wsclient/bin/Release/wsclient.exe
Executable file
Binary file not shown.
BIN
wsclient/bin/Release_Ubuntu/websocket-sharp.dll
Executable file
BIN
wsclient/bin/Release_Ubuntu/websocket-sharp.dll
Executable file
Binary file not shown.
BIN
wsclient/bin/Release_Ubuntu/wsclient.exe
Executable file
BIN
wsclient/bin/Release_Ubuntu/wsclient.exe
Executable file
Binary file not shown.
77
wsclient/wsclient.cs
Normal file
77
wsclient/wsclient.cs
Normal file
@ -0,0 +1,77 @@
|
||||
using Notifications;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using WebSocketSharp;
|
||||
|
||||
namespace Example
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
//using (WebSocket ws = new WebSocket("ws://localhost:8000/"))
|
||||
using (WebSocket ws = new WebSocket("ws://localhost:8000/", "chat"))
|
||||
{
|
||||
/*ws.OnOpen += (o, e) =>
|
||||
{
|
||||
//Do something.
|
||||
};
|
||||
*/
|
||||
ws.OnMessage += (o, e) =>
|
||||
{
|
||||
#if LINUX
|
||||
#if NOTIFY
|
||||
ws.MsgNf.Summary = "[WebSocket] Message";
|
||||
ws.MsgNf.Body = e;
|
||||
ws.MsgNf.IconName = "notification-message-im";
|
||||
ws.MsgNf.Show();
|
||||
#else
|
||||
Notification nf = new Notification("[WebSocket] Message",
|
||||
e,
|
||||
"notification-message-im");
|
||||
nf.Show();
|
||||
#endif
|
||||
#else
|
||||
Console.WriteLine(e);
|
||||
#endif
|
||||
};
|
||||
|
||||
ws.OnError += (o, e) =>
|
||||
{
|
||||
#if LINUX
|
||||
Notification nf = new Notification("[WebSocket] Error",
|
||||
e,
|
||||
"notification-network-disconnected");
|
||||
nf.Show();
|
||||
#else
|
||||
Console.WriteLine("Error: ", e);
|
||||
#endif
|
||||
};
|
||||
/*ws.OnClose += (o, e) =>
|
||||
{
|
||||
//Do something.
|
||||
};
|
||||
*/
|
||||
ws.Connect();
|
||||
|
||||
Thread.Sleep(500);
|
||||
Console.WriteLine("\nType \"exit\" to exit.\n");
|
||||
|
||||
string data;
|
||||
while (true)
|
||||
{
|
||||
Thread.Sleep(500);
|
||||
|
||||
Console.Write("> ");
|
||||
data = Console.ReadLine();
|
||||
if (data == "exit")
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
ws.Send(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
1
wsclient/wsclient.csproj
Normal file
1
wsclient/wsclient.csproj
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{52805AEC-EFB1-4F42-BB8E-3ED4E692C568}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>WsClient</RootNamespace>
<AssemblyName>wsclient</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Externalconsole>true</Externalconsole>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Externalconsole>true</Externalconsole>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_Ubuntu|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug_Ubuntu</OutputPath>
<DefineConstants>DEBUG,LINUX,NOTIFY</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Externalconsole>true</Externalconsole>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_Ubuntu|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Release_Ubuntu</OutputPath>
<DefineConstants>LINUX,NOTIFY</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Externalconsole>true</Externalconsole>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="notify-sharp, Version=0.4.0.0, Culture=neutral, PublicKeyToken=2df29c54e245917a">
<Package>notify-sharp</Package>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="wsclient.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\websocket-sharp\websocket-sharp.csproj">
<Project>{B357BAC7-529E-4D81-A0D2-71041B19C8DE}</Project>
<Name>websocket-sharp</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
|
BIN
wsclient/wsclient.pidb
Normal file
BIN
wsclient/wsclient.pidb
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user