Create gh-pages branch via GitHub
This commit is contained in:
commit
64ec8cd4f4
BIN
images/body-bg.jpg
Normal file
BIN
images/body-bg.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
BIN
images/download-button.png
Normal file
BIN
images/download-button.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
BIN
images/github-button.png
Normal file
BIN
images/github-button.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
BIN
images/header-bg.jpg
Normal file
BIN
images/header-bg.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
BIN
images/highlight-bg.jpg
Normal file
BIN
images/highlight-bg.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
images/sidebar-bg.jpg
Normal file
BIN
images/sidebar-bg.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
508
index.html
Normal file
508
index.html
Normal file
@ -0,0 +1,508 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset='utf-8'>
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link href='https://fonts.googleapis.com/css?family=Architects+Daughter' rel='stylesheet' type='text/css'>
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen" />
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/pygment_trac.css" media="screen" />
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/print.css" media="print" />
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<title>websocket-sharp by sta</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<div class="inner">
|
||||
<h1>websocket-sharp</h1>
|
||||
<h2>A C# implementation of the WebSocket protocol client and server</h2>
|
||||
<a href="https://github.com/sta/websocket-sharp" class="button"><small>View project on</small>GitHub</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div id="content-wrapper">
|
||||
<div class="inner clearfix">
|
||||
<section id="main-content">
|
||||
<h2>
|
||||
<a name="usage" class="anchor" href="#usage"><span class="octicon octicon-link"></span></a>Usage</h2>
|
||||
|
||||
<h3>
|
||||
<a name="websocket-client" class="anchor" href="#websocket-client"><span class="octicon octicon-link"></span></a>WebSocket Client</h3>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
|
||||
<span class="k">using</span> <span class="nn">WebSocketSharp</span><span class="p">;</span>
|
||||
|
||||
<span class="k">namespace</span> <span class="nn">Example</span>
|
||||
<span class="p">{</span>
|
||||
<span class="k">public</span> <span class="k">class</span> <span class="nc">Program</span>
|
||||
<span class="p">{</span>
|
||||
<span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span> <span class="p">(</span><span class="kt">string</span> <span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">ws</span> <span class="p">=</span> <span class="k">new</span> <span class="n">WebSocket</span> <span class="p">(</span><span class="s">"ws://dragonsnest.far/Laputa"</span><span class="p">))</span>
|
||||
<span class="p">{</span>
|
||||
<span class="n">ws</span><span class="p">.</span><span class="n">OnMessage</span> <span class="p">+=</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="p">=></span>
|
||||
<span class="p">{</span>
|
||||
<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span> <span class="p">(</span><span class="s">"Laputa says: "</span> <span class="p">+</span> <span class="n">e</span><span class="p">.</span><span class="n">Data</span><span class="p">);</span>
|
||||
<span class="p">};</span>
|
||||
|
||||
<span class="n">ws</span><span class="p">.</span><span class="n">Connect</span> <span class="p">();</span>
|
||||
<span class="n">ws</span><span class="p">.</span><span class="n">Send</span> <span class="p">(</span><span class="s">"BALUS"</span><span class="p">);</span>
|
||||
<span class="n">Console</span><span class="p">.</span><span class="n">ReadKey</span> <span class="p">(</span><span class="k">true</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div>
|
||||
|
||||
<h4>
|
||||
<a name="step-1" class="anchor" href="#step-1"><span class="octicon octicon-link"></span></a>Step 1</h4>
|
||||
|
||||
<p>Required namespace.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="k">using</span> <span class="nn">WebSocketSharp</span><span class="p">;</span>
|
||||
</pre></div>
|
||||
|
||||
<p>The <code>WebSocket</code> class exists in the <code>WebSocketSharp</code> namespace.</p>
|
||||
|
||||
<h4>
|
||||
<a name="step-2" class="anchor" href="#step-2"><span class="octicon octicon-link"></span></a>Step 2</h4>
|
||||
|
||||
<p>Creating an instance of the <code>WebSocket</code> class with the specified WebSocket URL to connect.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">ws</span> <span class="p">=</span> <span class="k">new</span> <span class="n">WebSocket</span> <span class="p">(</span><span class="s">"ws://example.com"</span><span class="p">))</span>
|
||||
<span class="p">{</span>
|
||||
<span class="p">...</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div>
|
||||
|
||||
<p>The <code>WebSocket</code> class inherits the <code>IDisposable</code> interface, so you can use the <code>using</code> statement.</p>
|
||||
|
||||
<h4>
|
||||
<a name="step-3" class="anchor" href="#step-3"><span class="octicon octicon-link"></span></a>Step 3</h4>
|
||||
|
||||
<p>Setting the <code>WebSocket</code> events.</p>
|
||||
|
||||
<h5>
|
||||
<a name="websocketonopen-event" class="anchor" href="#websocketonopen-event"><span class="octicon octicon-link"></span></a>WebSocket.OnOpen Event</h5>
|
||||
|
||||
<p>A <code>WebSocket.OnOpen</code> event occurs when the WebSocket connection has been established.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">OnOpen</span> <span class="p">+=</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="p">=></span>
|
||||
<span class="p">{</span>
|
||||
<span class="p">...</span>
|
||||
<span class="p">};</span>
|
||||
</pre></div>
|
||||
|
||||
<p><code>e</code> has passed as <code>EventArgs.Empty</code>, so you don't use <code>e</code>.</p>
|
||||
|
||||
<h5>
|
||||
<a name="websocketonmessage-event" class="anchor" href="#websocketonmessage-event"><span class="octicon octicon-link"></span></a>WebSocket.OnMessage Event</h5>
|
||||
|
||||
<p>A <code>WebSocket.OnMessage</code> event occurs when the <code>WebSocket</code> receives a WebSocket data frame.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">OnMessage</span> <span class="p">+=</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="p">=></span>
|
||||
<span class="p">{</span>
|
||||
<span class="p">...</span>
|
||||
<span class="p">};</span>
|
||||
</pre></div>
|
||||
|
||||
<p><code>e.Type</code> (<code>WebSocketSharp.MessageEventArgs.Type</code>, its type is <code>WebSocketSharp.Opcode</code>) indicates the type of a received data. So by checking it, you determine which item you should use.</p>
|
||||
|
||||
<p>If <code>e.Type</code> equals <code>Opcode.TEXT</code>, you use <code>e.Data</code> (<code>WebSocketSharp.MessageEventArgs.Data</code>, its type is <code>string</code>) that contains a received <strong>Text</strong> data.</p>
|
||||
|
||||
<p>If <code>e.Type</code> equals <code>Opcode.BINARY</code>, you use <code>e.RawData</code> (<code>WebSocketSharp.MessageEventArgs.RawData</code>, its type is <code>byte []</code>) that contains a received <strong>Binary</strong> data.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">Type</span> <span class="p">==</span> <span class="n">Opcode</span><span class="p">.</span><span class="n">TEXT</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="c1">// Do something with e.Data</span>
|
||||
<span class="k">return</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">Type</span> <span class="p">==</span> <span class="n">Opcode</span><span class="p">.</span><span class="n">BINARY</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="c1">// Do something with e.RawData</span>
|
||||
<span class="k">return</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div>
|
||||
|
||||
<h5>
|
||||
<a name="websocketonerror-event" class="anchor" href="#websocketonerror-event"><span class="octicon octicon-link"></span></a>WebSocket.OnError Event</h5>
|
||||
|
||||
<p>A <code>WebSocket.OnError</code> event occurs when the <code>WebSocket</code> gets an error.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">OnError</span> <span class="p">+=</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="p">=></span>
|
||||
<span class="p">{</span>
|
||||
<span class="p">...</span>
|
||||
<span class="p">};</span>
|
||||
</pre></div>
|
||||
|
||||
<p><code>e.Message</code> (<code>WebSocketSharp.ErrorEventArgs.Message</code>, its type is <code>string</code>) contains an error message, so you use it.</p>
|
||||
|
||||
<h5>
|
||||
<a name="websocketonclose-event" class="anchor" href="#websocketonclose-event"><span class="octicon octicon-link"></span></a>WebSocket.OnClose Event</h5>
|
||||
|
||||
<p>A <code>WebSocket.OnClose</code> event occurs when the WebSocket connection has been closed.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">OnClose</span> <span class="p">+=</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="p">=></span>
|
||||
<span class="p">{</span>
|
||||
<span class="p">...</span>
|
||||
<span class="p">};</span>
|
||||
</pre></div>
|
||||
|
||||
<p><code>e.Code</code> (<code>WebSocketSharp.CloseEventArgs.Code</code>, its type is <code>ushort</code>) contains a status code indicating the reason for closure and <code>e.Reason</code> (<code>WebSocketSharp.CloseEventArgs.Reason</code>, its type is <code>string</code>) contains the reason for closure, so you use them.</p>
|
||||
|
||||
<h4>
|
||||
<a name="step-4" class="anchor" href="#step-4"><span class="octicon octicon-link"></span></a>Step 4</h4>
|
||||
|
||||
<p>Connecting to the WebSocket server.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">Connect</span> <span class="p">();</span>
|
||||
</pre></div>
|
||||
|
||||
<h4>
|
||||
<a name="step-5" class="anchor" href="#step-5"><span class="octicon octicon-link"></span></a>Step 5</h4>
|
||||
|
||||
<p>Sending a data.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">Send</span> <span class="p">(</span><span class="n">data</span><span class="p">);</span>
|
||||
</pre></div>
|
||||
|
||||
<p>The <code>Send</code> method is overloaded.</p>
|
||||
|
||||
<p>The types of <code>data</code> are <code>string</code>, <code>byte []</code> and <code>System.IO.FileInfo</code> class.</p>
|
||||
|
||||
<p>In addition, the <code>Send (stream, length)</code> method exists, too.</p>
|
||||
|
||||
<p>These methods don't wait for the send to be complete. This means that these methods behave asynchronously.</p>
|
||||
|
||||
<p>If you want to do something when the send is complete, you use any of some <code>Send (data, completed)</code> methods.</p>
|
||||
|
||||
<h4>
|
||||
<a name="step-6" class="anchor" href="#step-6"><span class="octicon octicon-link"></span></a>Step 6</h4>
|
||||
|
||||
<p>Closing the WebSocket connection.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">Close</span> <span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">reason</span><span class="p">);</span>
|
||||
</pre></div>
|
||||
|
||||
<p>If you want to close the WebSocket connection explicitly, you use the <code>Close</code> method.</p>
|
||||
|
||||
<p>The <code>Close</code> method is overloaded.</p>
|
||||
|
||||
<p>The types of <code>code</code> are <code>WebSocketSharp.CloseStatusCode</code> and <code>ushort</code>, and the type of <code>reason</code> is <code>string</code>.</p>
|
||||
|
||||
<p>In addition, the <code>Close ()</code> and <code>Close (code)</code> methods exist, too.</p>
|
||||
|
||||
<h3>
|
||||
<a name="websocket-server" class="anchor" href="#websocket-server"><span class="octicon octicon-link"></span></a>WebSocket Server</h3>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
|
||||
<span class="k">using</span> <span class="nn">WebSocketSharp</span><span class="p">;</span>
|
||||
<span class="k">using</span> <span class="nn">WebSocketSharp.Server</span><span class="p">;</span>
|
||||
|
||||
<span class="k">namespace</span> <span class="nn">Example</span>
|
||||
<span class="p">{</span>
|
||||
<span class="k">public</span> <span class="k">class</span> <span class="nc">Laputa</span> <span class="p">:</span> <span class="n">WebSocketService</span>
|
||||
<span class="p">{</span>
|
||||
<span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnMessage</span> <span class="p">(</span><span class="n">MessageEventArgs</span> <span class="n">e</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="kt">var</span> <span class="n">msg</span> <span class="p">=</span> <span class="n">e</span><span class="p">.</span><span class="n">Data</span><span class="p">.</span><span class="n">ToLower</span> <span class="p">()</span> <span class="p">==</span> <span class="s">"balus"</span>
|
||||
<span class="p">?</span> <span class="s">"I've been balused already..."</span>
|
||||
<span class="p">:</span> <span class="s">"I'm not available now."</span><span class="p">;</span>
|
||||
|
||||
<span class="n">Send</span> <span class="p">(</span><span class="n">msg</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="k">public</span> <span class="k">class</span> <span class="nc">Program</span>
|
||||
<span class="p">{</span>
|
||||
<span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span> <span class="p">(</span><span class="kt">string</span> <span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="kt">var</span> <span class="n">wssv</span> <span class="p">=</span> <span class="k">new</span> <span class="n">WebSocketServer</span> <span class="p">(</span><span class="s">"ws://dragonsnest.far"</span><span class="p">);</span>
|
||||
<span class="n">wssv</span><span class="p">.</span><span class="n">AddWebSocketService</span><span class="p"><</span><span class="n">Laputa</span><span class="p">></span> <span class="p">(</span><span class="s">"/Laputa"</span><span class="p">);</span>
|
||||
<span class="n">wssv</span><span class="p">.</span><span class="n">Start</span> <span class="p">();</span>
|
||||
<span class="n">Console</span><span class="p">.</span><span class="n">ReadKey</span> <span class="p">(</span><span class="k">true</span><span class="p">);</span>
|
||||
<span class="n">wssv</span><span class="p">.</span><span class="n">Stop</span> <span class="p">();</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div>
|
||||
|
||||
<h4>
|
||||
<a name="step-1-1" class="anchor" href="#step-1-1"><span class="octicon octicon-link"></span></a>Step 1</h4>
|
||||
|
||||
<p>Required namespace.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="k">using</span> <span class="nn">WebSocketSharp.Server</span><span class="p">;</span>
|
||||
</pre></div>
|
||||
|
||||
<p>The <code>WebSocketService</code> and <code>WebSocketServer</code> classes exist in the <code>WebSocketSharp.Server</code> namespace.</p>
|
||||
|
||||
<h4>
|
||||
<a name="step-2-1" class="anchor" href="#step-2-1"><span class="octicon octicon-link"></span></a>Step 2</h4>
|
||||
|
||||
<p>Creating the class that inherits the <code>WebSocketService</code> class.</p>
|
||||
|
||||
<p>For example, if you want to provide an echo service,</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
|
||||
<span class="k">using</span> <span class="nn">WebSocketSharp</span><span class="p">;</span>
|
||||
<span class="k">using</span> <span class="nn">WebSocketSharp.Server</span><span class="p">;</span>
|
||||
|
||||
<span class="k">public</span> <span class="k">class</span> <span class="nc">Echo</span> <span class="p">:</span> <span class="n">WebSocketService</span>
|
||||
<span class="p">{</span>
|
||||
<span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnMessage</span> <span class="p">(</span><span class="n">MessageEventArgs</span> <span class="n">e</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="n">Send</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">Data</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div>
|
||||
|
||||
<p>And if you want to provide a chat service,</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
|
||||
<span class="k">using</span> <span class="nn">WebSocketSharp</span><span class="p">;</span>
|
||||
<span class="k">using</span> <span class="nn">WebSocketSharp.Server</span><span class="p">;</span>
|
||||
|
||||
<span class="k">public</span> <span class="k">class</span> <span class="nc">Chat</span> <span class="p">:</span> <span class="n">WebSocketService</span>
|
||||
<span class="p">{</span>
|
||||
<span class="k">private</span> <span class="kt">string</span> <span class="n">_suffix</span><span class="p">;</span>
|
||||
|
||||
<span class="k">public</span> <span class="nf">Chat</span> <span class="p">()</span>
|
||||
<span class="p">:</span> <span class="k">this</span> <span class="p">(</span><span class="n">String</span><span class="p">.</span><span class="n">Empty</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="k">public</span> <span class="nf">Chat</span> <span class="p">(</span><span class="kt">string</span> <span class="n">suffix</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="n">_suffix</span> <span class="p">=</span> <span class="n">suffix</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnMessage</span> <span class="p">(</span><span class="n">MessageEventArgs</span> <span class="n">e</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="n">Sessions</span><span class="p">.</span><span class="n">Broadcast</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">Data</span> <span class="p">+</span> <span class="n">_suffix</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div>
|
||||
|
||||
<p>If you override the <code>OnMessage</code> method, it is bound to the server side <code>WebSocket.OnMessage</code> event.</p>
|
||||
|
||||
<p>In addition, if you override the <code>OnOpen</code>, <code>OnError</code> and <code>OnClose</code> methods, each of them is bound to each server side event of <code>WebSocket.OnOpen</code>, <code>WebSocket.OnError</code> and <code>WebSocket.OnClose</code>.</p>
|
||||
|
||||
<h4>
|
||||
<a name="step-3-1" class="anchor" href="#step-3-1"><span class="octicon octicon-link"></span></a>Step 3</h4>
|
||||
|
||||
<p>Creating an instance of the <code>WebSocketServer</code> class.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="kt">var</span> <span class="n">wssv</span> <span class="p">=</span> <span class="k">new</span> <span class="n">WebSocketServer</span> <span class="p">(</span><span class="m">4649</span><span class="p">);</span>
|
||||
<span class="n">wssv</span><span class="p">.</span><span class="n">AddWebSocketService</span><span class="p"><</span><span class="n">Echo</span><span class="p">></span> <span class="p">(</span><span class="s">"/Echo"</span><span class="p">);</span>
|
||||
<span class="n">wssv</span><span class="p">.</span><span class="n">AddWebSocketService</span><span class="p"><</span><span class="n">Chat</span><span class="p">></span> <span class="p">(</span><span class="s">"/Chat"</span><span class="p">);</span>
|
||||
<span class="n">wssv</span><span class="p">.</span><span class="n">AddWebSocketService</span><span class="p"><</span><span class="n">Chat</span><span class="p">></span> <span class="p">(</span><span class="s">"/ChatWithNiceBoat"</span><span class="p">,</span> <span class="p">()</span> <span class="p">=></span> <span class="k">new</span> <span class="n">Chat</span> <span class="p">(</span><span class="s">" Nice boat."</span><span class="p">));</span>
|
||||
</pre></div>
|
||||
|
||||
<p>You can add any WebSocket service with a specified path to the service to your <code>WebSocketServer</code> by using the <code>WebSocketServer.AddWebSocketService<TWithNew></code> or <code>WebSocketServer.AddWebSocketService<T></code> method.</p>
|
||||
|
||||
<p>The type of <code>TWithNew</code> must inherit the <code>WebSocketService</code> class and must have a public parameterless constructor.</p>
|
||||
|
||||
<p>The type of <code>T</code> must inherit <code>WebSocketService</code> class.</p>
|
||||
|
||||
<p>So you can use the classes created in <strong>Step 2</strong>.</p>
|
||||
|
||||
<p>If you create an instance of the <code>WebSocketServer</code> class without the port number, the <code>WebSocketServer</code> set the port number to <strong>80</strong> automatically. So it is necessary to run with root permission.</p>
|
||||
|
||||
<pre><code>$ sudo mono example2.exe
|
||||
</code></pre>
|
||||
|
||||
<h4>
|
||||
<a name="step-4-1" class="anchor" href="#step-4-1"><span class="octicon octicon-link"></span></a>Step 4</h4>
|
||||
|
||||
<p>Starting the server.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">wssv</span><span class="p">.</span><span class="n">Start</span> <span class="p">();</span>
|
||||
</pre></div>
|
||||
|
||||
<h4>
|
||||
<a name="step-5-1" class="anchor" href="#step-5-1"><span class="octicon octicon-link"></span></a>Step 5</h4>
|
||||
|
||||
<p>Stopping the server.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">wssv</span><span class="p">.</span><span class="n">Stop</span> <span class="p">();</span>
|
||||
</pre></div>
|
||||
|
||||
<h3>
|
||||
<a name="http-server-with-the-websocket" class="anchor" href="#http-server-with-the-websocket"><span class="octicon octicon-link"></span></a>HTTP Server with the WebSocket</h3>
|
||||
|
||||
<p>I modified the <code>System.Net.HttpListener</code>, <code>System.Net.HttpListenerContext</code> and some other classes of <a href="http://www.mono-project.com/">Mono</a> to create the HTTP server that can upgrade the connection to the WebSocket connection when receives a WebSocket connection request.</p>
|
||||
|
||||
<p>You can add any WebSocket service with a specified path to the service to your <code>HttpServer</code> by using the <code>HttpServer.AddWebSocketService<TWithNew></code> or <code>HttpServer.AddWebSocketService<T></code> method.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="kt">var</span> <span class="n">httpsv</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpServer</span> <span class="p">(</span><span class="m">4649</span><span class="p">);</span>
|
||||
<span class="n">httpsv</span><span class="p">.</span><span class="n">AddWebSocketService</span><span class="p"><</span><span class="n">Echo</span><span class="p">></span> <span class="p">(</span><span class="s">"/Echo"</span><span class="p">);</span>
|
||||
<span class="n">httpsv</span><span class="p">.</span><span class="n">AddWebSocketService</span><span class="p"><</span><span class="n">Chat</span><span class="p">></span> <span class="p">(</span><span class="s">"/Chat"</span><span class="p">);</span>
|
||||
<span class="n">httpsv</span><span class="p">.</span><span class="n">AddWebSocketService</span><span class="p"><</span><span class="n">Chat</span><span class="p">></span> <span class="p">(</span><span class="s">"/ChatWithNiceBoat"</span><span class="p">,</span> <span class="p">()</span> <span class="p">=></span> <span class="k">new</span> <span class="n">Chat</span> <span class="p">(</span><span class="s">" Nice boat."</span><span class="p">));</span>
|
||||
</pre></div>
|
||||
|
||||
<p>For more information, could you see <strong><a href="https://github.com/sta/websocket-sharp/tree/master/Example3">Example3</a></strong>?</p>
|
||||
|
||||
<h3>
|
||||
<a name="websocket-extensions" class="anchor" href="#websocket-extensions"><span class="octicon octicon-link"></span></a>WebSocket Extensions</h3>
|
||||
|
||||
<h4>
|
||||
<a name="per-message-compression" class="anchor" href="#per-message-compression"><span class="octicon octicon-link"></span></a>Per-message Compression</h4>
|
||||
|
||||
<p><strong>websocket-sharp</strong> supports <strong><a href="http://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-09">Per-message Compression</a></strong> extension. (But, does not support with <a href="http://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-09#section-8.1">extension parameters</a>.)</p>
|
||||
|
||||
<p>If you want to enable this extension as a WebSocket client, you should do like the following.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">Compression</span> <span class="p">=</span> <span class="n">CompressionMethod</span><span class="p">.</span><span class="n">DEFLATE</span><span class="p">;</span>
|
||||
</pre></div>
|
||||
|
||||
<p>And then your client sends the following header in the opening handshake to a WebSocket server.</p>
|
||||
|
||||
<pre><code>Sec-WebSocket-Extensions: permessage-deflate
|
||||
</code></pre>
|
||||
|
||||
<p>If the server supports this extension, responds the same header. And when your client receives the header, enables this extension.</p>
|
||||
|
||||
<h3>
|
||||
<a name="secure-connection" class="anchor" href="#secure-connection"><span class="octicon octicon-link"></span></a>Secure Connection</h3>
|
||||
|
||||
<p>As a <strong>WebSocket Client</strong>, creating an instance of the <code>WebSocket</code> class with the WebSocket URL with <strong>wss</strong> scheme.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">ws</span> <span class="p">=</span> <span class="k">new</span> <span class="n">WebSocket</span> <span class="p">(</span><span class="s">"wss://example.com"</span><span class="p">))</span>
|
||||
<span class="p">{</span>
|
||||
<span class="p">...</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div>
|
||||
|
||||
<p>If you want to set the custom validation for the server certificate, you use the <code>WebSocket.ServerCertificateValidationCallback</code> property.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">ServerCertificateValidationCallback</span> <span class="p">=</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">certificate</span><span class="p">,</span> <span class="n">chain</span><span class="p">,</span> <span class="n">sslPolicyErrors</span><span class="p">)</span> <span class="p">=></span>
|
||||
<span class="p">{</span>
|
||||
<span class="c1">// Do something to validate the server certificate.</span>
|
||||
<span class="k">return</span> <span class="k">true</span><span class="p">;</span> <span class="c1">// The server certificate is valid.</span>
|
||||
<span class="p">};</span>
|
||||
</pre></div>
|
||||
|
||||
<p>If you set this property to nothing, the validation does nothing with the server certificate, always returns valid.</p>
|
||||
|
||||
<p>As a <strong>WebSocket Server</strong>, creating an instance of the <code>WebSocketServer</code> or <code>HttpServer</code> class with some settings for the secure connection.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="kt">var</span> <span class="n">wssv</span> <span class="p">=</span> <span class="k">new</span> <span class="n">WebSocketServer</span> <span class="p">(</span><span class="m">4649</span><span class="p">,</span> <span class="k">true</span><span class="p">);</span>
|
||||
<span class="n">wssv</span><span class="p">.</span><span class="n">Certificate</span> <span class="p">=</span> <span class="k">new</span> <span class="n">X509Certificate2</span> <span class="p">(</span><span class="s">"/path/to/cert.pfx"</span><span class="p">,</span> <span class="s">"password for cert.pfx"</span><span class="p">);</span>
|
||||
</pre></div>
|
||||
|
||||
<h3>
|
||||
<a name="logging" class="anchor" href="#logging"><span class="octicon octicon-link"></span></a>Logging</h3>
|
||||
|
||||
<p>The <code>WebSocket</code> class includes own logging functions.</p>
|
||||
|
||||
<p>The <code>WebSocket.Log</code> property provides the logging functions.</p>
|
||||
|
||||
<p>If you want to change the current logging level (the default is <code>LogLevel.ERROR</code>), you use the <code>WebSocket.Log.Level</code> property.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">Log</span><span class="p">.</span><span class="n">Level</span> <span class="p">=</span> <span class="n">LogLevel</span><span class="p">.</span><span class="n">DEBUG</span><span class="p">;</span>
|
||||
</pre></div>
|
||||
|
||||
<p>The above means that the logging outputs with a less than <code>LogLevel.DEBUG</code> are not outputted.</p>
|
||||
|
||||
<p>And if you want to output a log, you use any of some output methods. The following outputs a log with <code>LogLevel.DEBUG</code>.</p>
|
||||
|
||||
<div class="highlight highlight-cs"><pre><span class="n">ws</span><span class="p">.</span><span class="n">Log</span><span class="p">.</span><span class="n">Debug</span> <span class="p">(</span><span class="s">"This is a debug message."</span><span class="p">);</span>
|
||||
</pre></div>
|
||||
|
||||
<p>The <code>WebSocketServer</code> and <code>HttpServer</code> classes include the same logging functions.</p>
|
||||
|
||||
<h2>
|
||||
<a name="required-environment" class="anchor" href="#required-environment"><span class="octicon octicon-link"></span></a>Required Environment</h2>
|
||||
|
||||
<p>C# <strong>3.0</strong>, .NET <strong>3.5</strong> compatible or later.</p>
|
||||
|
||||
<h2>
|
||||
<a name="examples" class="anchor" href="#examples"><span class="octicon octicon-link"></span></a>Examples</h2>
|
||||
|
||||
<p>Examples using <strong>websocket-sharp</strong>.</p>
|
||||
|
||||
<h3>
|
||||
<a name="example" class="anchor" href="#example"><span class="octicon octicon-link"></span></a>Example</h3>
|
||||
|
||||
<p><a href="https://github.com/sta/websocket-sharp/tree/master/Example">Example</a> connects to the <a href="http://www.websocket.org/echo.html">Echo server</a> using the WebSocket.</p>
|
||||
|
||||
<h3>
|
||||
<a name="example1" class="anchor" href="#example1"><span class="octicon octicon-link"></span></a>Example1</h3>
|
||||
|
||||
<p><a href="https://github.com/sta/websocket-sharp/tree/master/Example1">Example1</a> connects to the <a href="http://agektmr.node-ninja.com:3000/">Audio Data delivery server</a> using the WebSocket (<a href="https://github.com/sta/websocket-sharp/tree/master/Example1">Example1</a> is only implemented the chat feature, still unfinished).</p>
|
||||
|
||||
<p>And <a href="https://github.com/sta/websocket-sharp/tree/master/Example1">Example1</a> uses <a href="http://james.newtonking.com/projects/json-net.aspx">Json.NET</a>.</p>
|
||||
|
||||
<h3>
|
||||
<a name="example2" class="anchor" href="#example2"><span class="octicon octicon-link"></span></a>Example2</h3>
|
||||
|
||||
<p><a href="https://github.com/sta/websocket-sharp/tree/master/Example2">Example2</a> starts a WebSocket server.</p>
|
||||
|
||||
<h3>
|
||||
<a name="example3" class="anchor" href="#example3"><span class="octicon octicon-link"></span></a>Example3</h3>
|
||||
|
||||
<p><a href="https://github.com/sta/websocket-sharp/tree/master/Example3">Example3</a> starts an HTTP server that can upgrade the connection to the WebSocket connection.</p>
|
||||
|
||||
<p>Could you access to <a href="http://localhost:4649">http://localhost:4649</a> to do <strong>WebSocket Echo Test</strong> with your web browser after <a href="https://github.com/sta/websocket-sharp/tree/master/Example3">Example3</a> running?</p>
|
||||
|
||||
<h2>
|
||||
<a name="websocket-sharp-for-unity" class="anchor" href="#websocket-sharp-for-unity"><span class="octicon octicon-link"></span></a>websocket-sharp for Unity</h2>
|
||||
|
||||
<p><strong>websocket-sharp</strong> has now been displayed on the <strong>Unity Asset Store</strong>!</p>
|
||||
|
||||
<ul>
|
||||
<li><strong><a href="http://u3d.as/content/sta-blockhead/websocket-sharp-for-unity">websocket-sharp for Unity</a></strong></li>
|
||||
</ul><h2>
|
||||
<a name="supported-websocket-specifications" class="anchor" href="#supported-websocket-specifications"><span class="octicon octicon-link"></span></a>Supported WebSocket Specifications</h2>
|
||||
|
||||
<p><strong>websocket-sharp</strong> supports <strong><a href="http://tools.ietf.org/html/rfc6455">RFC 6455</a></strong>.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<strong><a href="https://github.com/sta/websocket-sharp/tree/hybi-00">branch: hybi-00</a></strong> supports older draft-ietf-hybi-thewebsocketprotocol-00 ( <strong><a href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-00">hybi-00</a></strong> ).</li>
|
||||
<li>
|
||||
<strong><a href="https://github.com/sta/websocket-sharp/tree/draft75">branch: draft75</a></strong> supports even more old draft-hixie-thewebsocketprotocol-75 ( <strong><a href="http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75">hixie-75</a></strong> ).</li>
|
||||
</ul><p><strong>websocket-sharp</strong> is based on the following WebSocket references.</p>
|
||||
|
||||
<ul>
|
||||
<li><strong><a href="http://tools.ietf.org/html/rfc6455">The WebSocket Protocol</a></strong></li>
|
||||
<li><strong><a href="http://www.w3.org/TR/websockets/">The WebSocket API</a></strong></li>
|
||||
<li><strong><a href="http://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-09">Compression Extensions for WebSocket</a></strong></li>
|
||||
</ul><p>Thanks for translating to japanese.</p>
|
||||
|
||||
<ul>
|
||||
<li><strong><a href="http://www.hcn.zaq.ne.jp/___/WEB/RFC6455-ja.html">The WebSocket Protocol 日本語訳</a></strong></li>
|
||||
<li><strong><a href="http://www.hcn.zaq.ne.jp/___/WEB/WebSocket-ja.html">The WebSocket API 日本語訳</a></strong></li>
|
||||
</ul><h2>
|
||||
<a name="license" class="anchor" href="#license"><span class="octicon octicon-link"></span></a>License</h2>
|
||||
|
||||
<p><strong>websocket-sharp</strong> is provided under <strong><a href="LICENSE.txt">The MIT License</a></strong>.</p>
|
||||
</section>
|
||||
|
||||
<aside id="sidebar">
|
||||
<a href="https://github.com/sta/websocket-sharp/zipball/master" class="button">
|
||||
<small>Download</small>
|
||||
.zip file
|
||||
</a>
|
||||
<a href="https://github.com/sta/websocket-sharp/tarball/master" class="button">
|
||||
<small>Download</small>
|
||||
.tar.gz file
|
||||
</a>
|
||||
|
||||
<p class="repo-owner"><a href="https://github.com/sta/websocket-sharp"></a> is maintained by <a href="https://github.com/sta">sta</a>.</p>
|
||||
|
||||
<p>This page was generated by <a href="pages.github.com">GitHub Pages</a> using the Architect theme by <a href="https://twitter.com/jasonlong">Jason Long</a>.</p>
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
1
javascripts/main.js
Normal file
1
javascripts/main.js
Normal file
@ -0,0 +1 @@
|
||||
console.log('This would be the main JS file.');
|
1
params.json
Normal file
1
params.json
Normal file
File diff suppressed because one or more lines are too long
226
stylesheets/print.css
Normal file
226
stylesheets/print.css
Normal file
@ -0,0 +1,226 @@
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||
article, aside, canvas, details, embed,
|
||||
figure, figcaption, footer, header, hgroup,
|
||||
menu, nav, output, ruby, section, summary,
|
||||
time, mark, audio, video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
/* HTML5 display-role reset for older browsers */
|
||||
article, aside, details, figcaption, figure,
|
||||
footer, header, hgroup, menu, nav, section {
|
||||
display: block;
|
||||
}
|
||||
body {
|
||||
line-height: 1;
|
||||
}
|
||||
ol, ul {
|
||||
list-style: none;
|
||||
}
|
||||
blockquote, q {
|
||||
quotes: none;
|
||||
}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: '';
|
||||
content: none;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
body {
|
||||
font-size: 13px;
|
||||
line-height: 1.5;
|
||||
font-family: 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #d5000d;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
header {
|
||||
padding-top: 35px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
font-weight: bold;
|
||||
letter-spacing: -1px;
|
||||
font-size: 48px;
|
||||
color: #303030;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
header h2 {
|
||||
letter-spacing: -1px;
|
||||
font-size: 24px;
|
||||
color: #aaa;
|
||||
font-weight: normal;
|
||||
line-height: 1.3;
|
||||
}
|
||||
#downloads {
|
||||
display: none;
|
||||
}
|
||||
#main_content {
|
||||
padding-top: 20px;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal;
|
||||
color: #222;
|
||||
margin-bottom: 30px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
code {
|
||||
padding: 0 3px;
|
||||
}
|
||||
|
||||
pre {
|
||||
border: solid 1px #ddd;
|
||||
padding: 20px;
|
||||
overflow: auto;
|
||||
}
|
||||
pre code {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ul, ol, dl {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
|
||||
/* COMMON STYLES */
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border: 1px solid #ebebeb;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
td {
|
||||
border: 1px solid #ebebeb;
|
||||
text-align: center;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
form {
|
||||
background: #f2f2f2;
|
||||
padding: 20px;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* GENERAL ELEMENT TYPE STYLES */
|
||||
|
||||
h1 {
|
||||
font-size: 2.8em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
color: #303030;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #d5000d;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 16px;
|
||||
color: #303030;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1em;
|
||||
color: #303030;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: .8em;
|
||||
color: #303030;
|
||||
}
|
||||
|
||||
p {
|
||||
font-weight: 300;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
p a {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
font-size: 1.6em;
|
||||
border-left: 10px solid #e9e9e9;
|
||||
margin-bottom: 20px;
|
||||
padding: 0 0 0 30px;
|
||||
}
|
||||
|
||||
ul li {
|
||||
list-style: disc inside;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
ol li {
|
||||
list-style: decimal inside;
|
||||
padding-left: 3px;
|
||||
}
|
||||
|
||||
dl dd {
|
||||
font-style: italic;
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-top: 40px;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 30px;
|
||||
font-size: 13px;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
/* MISC */
|
||||
.clearfix:after {
|
||||
clear: both;
|
||||
content: '.';
|
||||
display: block;
|
||||
visibility: hidden;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.clearfix {display: inline-block;}
|
||||
* html .clearfix {height: 1%;}
|
||||
.clearfix {display: block;}
|
69
stylesheets/pygment_trac.css
Normal file
69
stylesheets/pygment_trac.css
Normal file
@ -0,0 +1,69 @@
|
||||
.highlight { background: #ffffff; }
|
||||
.highlight .c { color: #999988; font-style: italic } /* Comment */
|
||||
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
|
||||
.highlight .k { font-weight: bold } /* Keyword */
|
||||
.highlight .o { font-weight: bold } /* Operator */
|
||||
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
||||
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
|
||||
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
|
||||
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
|
||||
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
||||
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
|
||||
.highlight .ge { font-style: italic } /* Generic.Emph */
|
||||
.highlight .gr { color: #aa0000 } /* Generic.Error */
|
||||
.highlight .gh { color: #999999 } /* Generic.Heading */
|
||||
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
||||
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
|
||||
.highlight .go { color: #888888 } /* Generic.Output */
|
||||
.highlight .gp { color: #555555 } /* Generic.Prompt */
|
||||
.highlight .gs { font-weight: bold } /* Generic.Strong */
|
||||
.highlight .gu { color: #800080; font-weight: bold; } /* Generic.Subheading */
|
||||
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
|
||||
.highlight .kc { font-weight: bold } /* Keyword.Constant */
|
||||
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
|
||||
.highlight .kn { font-weight: bold } /* Keyword.Namespace */
|
||||
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
|
||||
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
|
||||
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
||||
.highlight .m { color: #009999 } /* Literal.Number */
|
||||
.highlight .s { color: #d14 } /* Literal.String */
|
||||
.highlight .na { color: #008080 } /* Name.Attribute */
|
||||
.highlight .nb { color: #0086B3 } /* Name.Builtin */
|
||||
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
|
||||
.highlight .no { color: #008080 } /* Name.Constant */
|
||||
.highlight .ni { color: #800080 } /* Name.Entity */
|
||||
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
|
||||
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
|
||||
.highlight .nn { color: #555555 } /* Name.Namespace */
|
||||
.highlight .nt { color: #000080 } /* Name.Tag */
|
||||
.highlight .nv { color: #008080 } /* Name.Variable */
|
||||
.highlight .ow { font-weight: bold } /* Operator.Word */
|
||||
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
|
||||
.highlight .mf { color: #009999 } /* Literal.Number.Float */
|
||||
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
|
||||
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
|
||||
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
|
||||
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
|
||||
.highlight .sc { color: #d14 } /* Literal.String.Char */
|
||||
.highlight .sd { color: #d14 } /* Literal.String.Doc */
|
||||
.highlight .s2 { color: #d14 } /* Literal.String.Double */
|
||||
.highlight .se { color: #d14 } /* Literal.String.Escape */
|
||||
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
|
||||
.highlight .si { color: #d14 } /* Literal.String.Interpol */
|
||||
.highlight .sx { color: #d14 } /* Literal.String.Other */
|
||||
.highlight .sr { color: #009926 } /* Literal.String.Regex */
|
||||
.highlight .s1 { color: #d14 } /* Literal.String.Single */
|
||||
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
|
||||
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
|
||||
.highlight .vc { color: #008080 } /* Name.Variable.Class */
|
||||
.highlight .vg { color: #008080 } /* Name.Variable.Global */
|
||||
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
|
||||
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
|
||||
|
||||
.type-csharp .highlight .k { color: #0000FF }
|
||||
.type-csharp .highlight .kt { color: #0000FF }
|
||||
.type-csharp .highlight .nf { color: #000000; font-weight: normal }
|
||||
.type-csharp .highlight .nc { color: #2B91AF }
|
||||
.type-csharp .highlight .nn { color: #000000 }
|
||||
.type-csharp .highlight .s { color: #A31515 }
|
||||
.type-csharp .highlight .sc { color: #A31515 }
|
479
stylesheets/stylesheet.css
Normal file
479
stylesheets/stylesheet.css
Normal file
@ -0,0 +1,479 @@
|
||||
/* http://meyerweb.com/eric/tools/css/reset/
|
||||
v2.0 | 20110126
|
||||
License: none (public domain)
|
||||
*/
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||
article, aside, canvas, details, embed,
|
||||
figure, figcaption, footer, header, hgroup,
|
||||
menu, nav, output, ruby, section, summary,
|
||||
time, mark, audio, video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
/* HTML5 display-role reset for older browsers */
|
||||
article, aside, details, figcaption, figure,
|
||||
footer, header, hgroup, menu, nav, section {
|
||||
display: block;
|
||||
}
|
||||
body {
|
||||
line-height: 1;
|
||||
}
|
||||
ol, ul {
|
||||
list-style: none;
|
||||
}
|
||||
blockquote, q {
|
||||
quotes: none;
|
||||
}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: '';
|
||||
content: none;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
/* LAYOUT STYLES */
|
||||
body {
|
||||
font-size: 15px;
|
||||
line-height: 1.5;
|
||||
background: #fafafa url(../images/body-bg.jpg) 0 0 repeat;
|
||||
font-family: 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-weight: 400;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #2879d0;
|
||||
}
|
||||
a:hover {
|
||||
color: #2268b2;
|
||||
}
|
||||
|
||||
header {
|
||||
padding-top: 40px;
|
||||
padding-bottom: 40px;
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
background: #2e7bcf url(../images/header-bg.jpg) 0 0 repeat-x;
|
||||
border-bottom: solid 1px #275da1;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
letter-spacing: -1px;
|
||||
font-size: 72px;
|
||||
color: #fff;
|
||||
line-height: 1;
|
||||
margin-bottom: 0.2em;
|
||||
width: 540px;
|
||||
}
|
||||
|
||||
header h2 {
|
||||
font-size: 26px;
|
||||
color: #9ddcff;
|
||||
font-weight: normal;
|
||||
line-height: 1.3;
|
||||
width: 540px;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
.inner {
|
||||
position: relative;
|
||||
width: 940px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#content-wrapper {
|
||||
border-top: solid 1px #fff;
|
||||
padding-top: 30px;
|
||||
}
|
||||
|
||||
#main-content {
|
||||
width: 690px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#main-content img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
aside#sidebar {
|
||||
width: 200px;
|
||||
padding-left: 20px;
|
||||
min-height: 504px;
|
||||
float: right;
|
||||
background: transparent url(../images/sidebar-bg.jpg) 0 0 no-repeat;
|
||||
font-size: 12px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
aside#sidebar p.repo-owner,
|
||||
aside#sidebar p.repo-owner a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#downloads {
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
a.button {
|
||||
width: 134px;
|
||||
height: 58px;
|
||||
line-height: 1.2;
|
||||
font-size: 23px;
|
||||
color: #fff;
|
||||
padding-left: 68px;
|
||||
padding-top: 22px;
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
}
|
||||
a.button small {
|
||||
display: block;
|
||||
font-size: 11px;
|
||||
}
|
||||
header a.button {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
background: transparent url(../images/github-button.png) 0 0 no-repeat;
|
||||
}
|
||||
aside a.button {
|
||||
width: 138px;
|
||||
padding-left: 64px;
|
||||
display: block;
|
||||
background: transparent url(../images/download-button.png) 0 0 no-repeat;
|
||||
margin-bottom: 20px;
|
||||
font-size: 21px;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
|
||||
color: #222;
|
||||
margin-bottom: 30px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
code {
|
||||
background-color: #f2f8fc;
|
||||
border: solid 1px #dbe7f3;
|
||||
padding: 0 3px;
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 20px;
|
||||
background: #fff;
|
||||
text-shadow: none;
|
||||
overflow: auto;
|
||||
border: solid 1px #f2f2f2;
|
||||
}
|
||||
pre code {
|
||||
color: #2879d0;
|
||||
background-color: #fff;
|
||||
border: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ul, ol, dl {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
|
||||
/* COMMON STYLES */
|
||||
|
||||
hr {
|
||||
height: 1px;
|
||||
line-height: 1px;
|
||||
margin-top: 1em;
|
||||
padding-bottom: 1em;
|
||||
border: none;
|
||||
background: transparent url('../images/hr.png') 0 0 no-repeat;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border: 1px solid #ebebeb;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
td {
|
||||
border: 1px solid #ebebeb;
|
||||
text-align: center;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
form {
|
||||
background: #f2f2f2;
|
||||
padding: 20px;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* GENERAL ELEMENT TYPE STYLES */
|
||||
|
||||
#main-content h1 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: 2.8em;
|
||||
letter-spacing: -1px;
|
||||
color: #474747;
|
||||
}
|
||||
|
||||
#main-content h1:before {
|
||||
content: "/";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -0.9em;
|
||||
}
|
||||
|
||||
#main-content h2 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 8px;
|
||||
color: #474747;
|
||||
}
|
||||
#main-content h2:before {
|
||||
content: "//";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -1.5em;
|
||||
}
|
||||
|
||||
#main-content h3 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
margin-top: 24px;
|
||||
margin-bottom: 8px;
|
||||
color: #474747;
|
||||
}
|
||||
|
||||
#main-content h3:before {
|
||||
content: "///";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -2em;
|
||||
}
|
||||
|
||||
#main-content h4 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
color: #474747;
|
||||
}
|
||||
|
||||
h4:before {
|
||||
content: "////";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -2.8em;
|
||||
}
|
||||
|
||||
#main-content h5 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: 14px;
|
||||
color: #474747;
|
||||
}
|
||||
h5:before {
|
||||
content: "/////";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -3.2em;
|
||||
}
|
||||
|
||||
#main-content h6 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: .8em;
|
||||
color: #474747;
|
||||
}
|
||||
h6:before {
|
||||
content: "//////";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -3.7em;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
p a {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
font-size: 1.6em;
|
||||
border-left: 10px solid #e9e9e9;
|
||||
margin-bottom: 20px;
|
||||
padding: 0 0 0 30px;
|
||||
}
|
||||
|
||||
ul li {
|
||||
list-style: disc inside;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
ol li {
|
||||
list-style: decimal inside;
|
||||
padding-left: 3px;
|
||||
}
|
||||
|
||||
dl dd {
|
||||
font-style: italic;
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
footer {
|
||||
background: transparent url('../images/hr.png') 0 0 no-repeat;
|
||||
margin-top: 40px;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 30px;
|
||||
font-size: 13px;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: #666;
|
||||
}
|
||||
footer a:hover {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
/* MISC */
|
||||
.clearfix:after {
|
||||
clear: both;
|
||||
content: '.';
|
||||
display: block;
|
||||
visibility: hidden;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.clearfix {display: inline-block;}
|
||||
* html .clearfix {height: 1%;}
|
||||
.clearfix {display: block;}
|
||||
|
||||
/* #Media Queries
|
||||
================================================== */
|
||||
|
||||
/* Smaller than standard 960 (devices and browsers) */
|
||||
@media only screen and (max-width: 959px) {}
|
||||
|
||||
/* Tablet Portrait size to standard 960 (devices and browsers) */
|
||||
@media only screen and (min-width: 768px) and (max-width: 959px) {
|
||||
.inner {
|
||||
width: 740px;
|
||||
}
|
||||
header h1, header h2 {
|
||||
width: 340px;
|
||||
}
|
||||
header h1 {
|
||||
font-size: 60px;
|
||||
}
|
||||
header h2 {
|
||||
font-size: 30px;
|
||||
}
|
||||
#main-content {
|
||||
width: 490px;
|
||||
}
|
||||
#main-content h1:before,
|
||||
#main-content h2:before,
|
||||
#main-content h3:before,
|
||||
#main-content h4:before,
|
||||
#main-content h5:before,
|
||||
#main-content h6:before {
|
||||
content: none;
|
||||
padding-right: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* All Mobile Sizes (devices and browser) */
|
||||
@media only screen and (max-width: 767px) {
|
||||
.inner {
|
||||
width: 93%;
|
||||
}
|
||||
header {
|
||||
padding: 20px 0;
|
||||
}
|
||||
header .inner {
|
||||
position: relative;
|
||||
}
|
||||
header h1, header h2 {
|
||||
width: 100%;
|
||||
}
|
||||
header h1 {
|
||||
font-size: 48px;
|
||||
}
|
||||
header h2 {
|
||||
font-size: 24px;
|
||||
}
|
||||
header a.button {
|
||||
background-image: none;
|
||||
width: auto;
|
||||
height: auto;
|
||||
display: inline-block;
|
||||
margin-top: 15px;
|
||||
padding: 5px 10px;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
font-size: 13px;
|
||||
line-height: 1;
|
||||
background-color: #9ddcff;
|
||||
color: #2879d0;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
header a.button small {
|
||||
font-size: 13px;
|
||||
display: inline;
|
||||
}
|
||||
#main-content,
|
||||
aside#sidebar {
|
||||
float: none;
|
||||
width: 100% ! important;
|
||||
}
|
||||
aside#sidebar {
|
||||
background-image: none;
|
||||
margin-top: 20px;
|
||||
border-top: solid 1px #ddd;
|
||||
padding: 20px 0;
|
||||
min-height: 0;
|
||||
}
|
||||
aside#sidebar a.button {
|
||||
display: none;
|
||||
}
|
||||
#main-content h1:before,
|
||||
#main-content h2:before,
|
||||
#main-content h3:before,
|
||||
#main-content h4:before,
|
||||
#main-content h5:before,
|
||||
#main-content h6:before {
|
||||
content: none;
|
||||
padding-right: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */
|
||||
@media only screen and (min-width: 480px) and (max-width: 767px) {}
|
||||
|
||||
/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */
|
||||
@media only screen and (max-width: 479px) {}
|
Loading…
Reference in New Issue
Block a user