Skip to content

Commit 1911f43

Browse files
authored
Add integration for WebsocketServer with HttpListner (#20)
1 parent eaa9766 commit 1911f43

15 files changed

+153
-95
lines changed

System.Net.WebSockets.Server.nuspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ There are also two other packages, one with the client API only and another with
2525
<dependency id="nanoFramework.System.Collections" version="1.3.0" />
2626
<dependency id="nanoFramework.System.Net" version="1.8.0-preview.9" />
2727
<dependency id="nanoFramework.System.Text" version="1.1.3-preview.4" />
28+
<dependency id="nanoFramework.System.Net.Http" version="1.4.0-preview.6" />
2829
</dependencies>
2930
</metadata>
3031
<files>

System.Net.WebSockets.nuspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ These are meant to be used when there is the need to use smaller assemblies.</de
2626
<dependency id="nanoFramework.System.Collections" version="1.3.0" />
2727
<dependency id="nanoFramework.System.Net" version="1.8.0-preview.9" />
2828
<dependency id="nanoFramework.System.Text" version="1.1.3-preview.4" />
29+
<dependency id="nanoFramework.System.Net.Http" version="1.4.0-preview.6" />
2930
</dependencies>
3031
</metadata>
3132
<files>

WebSockets.Client/System.Net.WebSockets.Client.nfproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
<Reference Include="nanoFramework.System.Text, Version=1.1.3.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
107107
<HintPath>..\packages\nanoFramework.System.Text.1.1.3-preview.4\lib\nanoFramework.System.Text.dll</HintPath>
108108
<Private>True</Private>
109+
<SpecificVersion>True</SpecificVersion>
109110
</Reference>
110111
<Reference Include="System.Net, Version=1.8.0.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
111112
<HintPath>..\packages\nanoFramework.System.Net.1.8.0-preview.9\lib\System.Net.dll</HintPath>
@@ -114,6 +115,12 @@
114115
<Reference Include="System.Threading, Version=1.0.3.3, Culture=neutral, PublicKeyToken=c07d481e9758c731">
115116
<HintPath>..\packages\nanoFramework.System.Threading.1.0.3\lib\System.Threading.dll</HintPath>
116117
<Private>True</Private>
118+
<SpecificVersion>True</SpecificVersion>
119+
</Reference>
120+
<Reference Include="System.Threading, Version=1.0.3.3, Culture=neutral, PublicKeyToken=c07d481e9758c731">
121+
<HintPath>..\packages\nanoFramework.System.Threading.1.0.3\lib\System.Threading.dll</HintPath>
122+
<Private>True</Private>
123+
<SpecificVersion>True</SpecificVersion>
117124
</Reference>
118125
</ItemGroup>
119126
<ItemGroup>

WebSockets.Client/packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
<package id="nanoFramework.System.Collections" version="1.3.0" targetFramework="netnanoframework10" />
66
<package id="nanoFramework.System.Net" version="1.8.0-preview.9" targetFramework="netnanoframework10" />
77
<package id="nanoFramework.System.Text" version="1.1.3-preview.4" targetFramework="netnanoframework10" />
8-
<package id="nanoFramework.System.Threading" version="1.0.3" />
8+
<package id="nanoFramework.System.Threading" version="1.0.3" targetFramework="netnanoframework10" />
99
<package id="Nerdbank.GitVersioning" version="3.4.244" targetFramework="netnanoframework10" developmentDependency="true" />
1010
</packages>

WebSockets.Server/System.Net.WebSockets.Server.nfproj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,24 @@
112112
<Reference Include="nanoFramework.System.Text, Version=1.1.3.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
113113
<HintPath>..\packages\nanoFramework.System.Text.1.1.3-preview.4\lib\nanoFramework.System.Text.dll</HintPath>
114114
<Private>True</Private>
115+
<SpecificVersion>True</SpecificVersion>
115116
</Reference>
116117
<Reference Include="System.Net, Version=1.8.0.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
117118
<HintPath>..\packages\nanoFramework.System.Net.1.8.0-preview.9\lib\System.Net.dll</HintPath>
118119
<Private>True</Private>
119120
</Reference>
121+
<Reference Include="System.Net.Http">
122+
<HintPath>..\packages\nanoFramework.System.Net.Http.1.4.0-preview.6\lib\System.Net.Http.dll</HintPath>
123+
</Reference>
124+
<Reference Include="System.Threading, Version=1.0.3.3, Culture=neutral, PublicKeyToken=c07d481e9758c731">
125+
<HintPath>..\packages\nanoFramework.System.Threading.1.0.3\lib\System.Threading.dll</HintPath>
126+
<Private>True</Private>
127+
<SpecificVersion>True</SpecificVersion>
128+
</Reference>
120129
<Reference Include="System.Threading, Version=1.0.3.3, Culture=neutral, PublicKeyToken=c07d481e9758c731">
121130
<HintPath>..\packages\nanoFramework.System.Threading.1.0.3\lib\System.Threading.dll</HintPath>
122131
<Private>True</Private>
132+
<SpecificVersion>True</SpecificVersion>
123133
</Reference>
124134
</ItemGroup>
125135
<ItemGroup>

WebSockets.Server/packages.config

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
<package id="nanoFramework.Runtime.Events" version="1.10.0-preview.1" targetFramework="netnanoframework10" />
55
<package id="nanoFramework.System.Collections" version="1.3.0" targetFramework="netnanoframework10" />
66
<package id="nanoFramework.System.Net" version="1.8.0-preview.9" targetFramework="netnanoframework10" />
7+
<package id="nanoFramework.System.Net.Http" version="1.4.0-preview.6" targetFramework="netnanoframework10" />
78
<package id="nanoFramework.System.Text" version="1.1.3-preview.4" targetFramework="netnanoframework10" />
8-
<package id="nanoFramework.System.Threading" version="1.0.3" />
9+
<package id="nanoFramework.System.Threading" version="1.0.3" targetFramework="netnanoframework10" />
910
<package id="Nerdbank.GitVersioning" version="3.4.244" targetFramework="netnanoframework10" developmentDependency="true" />
1011
</packages>

WebSockets/ClientWebSocket/ClientWebSocket.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ private void WebSocketClientConnect(IPEndPoint remoteEndPoint, string prefix = "
262262
throw new Exception("WebSocket did not receive right handshake");
263263
}
264264

265-
ConnectToStream(_networkStream, false, remoteEndPoint);
265+
ConnectToStream(_networkStream, false, _tcpSocket);
266266

267267

268268

@@ -272,7 +272,7 @@ private void WebSocketClientConnect(IPEndPoint remoteEndPoint, string prefix = "
272272
public new void Dispose()
273273
{
274274
base.Dispose();
275-
_tcpSocket.Close();
275+
276276
}
277277
}
278278
}

WebSockets/System.Net.WebSockets.nfproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,19 @@
7979
<Reference Include="nanoFramework.System.Text, Version=1.1.3.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
8080
<HintPath>..\packages\nanoFramework.System.Text.1.1.3-preview.4\lib\nanoFramework.System.Text.dll</HintPath>
8181
<Private>True</Private>
82+
<SpecificVersion>True</SpecificVersion>
8283
</Reference>
8384
<Reference Include="System.Net, Version=1.8.0.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
8485
<HintPath>..\packages\nanoFramework.System.Net.1.8.0-preview.9\lib\System.Net.dll</HintPath>
8586
<Private>True</Private>
8687
</Reference>
88+
<Reference Include="System.Net.Http">
89+
<HintPath>..\packages\nanoFramework.System.Net.Http.1.4.0-preview.6\lib\System.Net.Http.dll</HintPath>
90+
</Reference>
8791
<Reference Include="System.Threading, Version=1.0.3.3, Culture=neutral, PublicKeyToken=c07d481e9758c731">
8892
<HintPath>..\packages\nanoFramework.System.Threading.1.0.3\lib\System.Threading.dll</HintPath>
8993
<Private>True</Private>
94+
<SpecificVersion>True</SpecificVersion>
9095
</Reference>
9196
</ItemGroup>
9297
<Import Project="$(NanoFrameworkProjectSystemPath)NFProjectSystem.CSharp.targets" Condition="Exists('$(NanoFrameworkProjectSystemPath)NFProjectSystem.CSharp.targets')" />

WebSockets/WebSocket.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ public abstract class WebSocket : IDisposable
101101
/// The Remote Endpoint where the WebSocket connects to.
102102
/// </value>
103103
public IPEndPoint RemoteEndPoint { get; private set; }
104+
105+
private Socket _socket;
104106

105107
/// <summary>
106108
/// Creates an instance of the System.Net.WebSockets.WebSocket class.
@@ -123,16 +125,17 @@ protected WebSocket( WebSocketOptions options = null)
123125
/// </summary>
124126
/// <param name="stream">The stream for the connection.</param>
125127
/// <param name="isServer"><see langword="true"/> to indicate it's the server-side of the connection; <see langword="false"/> if it's the client-side.</param>
126-
/// <param name="remoteEndPoint">The Remote Endpoint where the WebSocket connects to.</param>
127-
protected void ConnectToStream(NetworkStream stream, bool isServer, IPEndPoint remoteEndPoint)
128+
/// <param name="socket">The socket on which the WebSocket connects to.</param>
129+
protected void ConnectToStream(NetworkStream stream, bool isServer, Socket socket)
128130
{
129131
ReceiveStream = stream;
130132
IsServer = isServer;
131-
RemoteEndPoint = remoteEndPoint;
133+
_socket = socket;
134+
RemoteEndPoint = (IPEndPoint)socket.RemoteEndPoint;
132135
LastContactTimeStamp = DateTime.UtcNow;
133136

134137
//start server sending and receiving async
135-
WebSocketReceiver = new WebSocketReceiver(stream, remoteEndPoint, this, IsServer, MaxReceiveFrameSize, OnReadError);
138+
WebSocketReceiver = new WebSocketReceiver(stream, RemoteEndPoint, this, IsServer, MaxReceiveFrameSize, OnReadError);
136139
_webSocketSender = new WebSocketSender(stream, IsServer, OnWriteError);
137140

138141
ReceiveAndControllThread receiveThread = new ReceiveAndControllThread(this);
@@ -274,6 +277,7 @@ internal void RawClose(WebSocketCloseStatus closeStatus = WebSocketCloseStatus.E
274277
{
275278
int msWaited = 0;
276279

280+
//Give it a moment for sending a close message. This will block the thread.
277281
while (!_webSocketSender.CloseMessageSent )
278282
{
279283
msWaited += 50;
@@ -295,7 +299,12 @@ internal void HardClose()
295299

296300
Debug.WriteLine($"Connection - {RemoteEndPoint.ToString()} - Closed");
297301

298-
ConnectionClosed?.Invoke(this, new EventArgs());
302+
ConnectionClosed?.Invoke(this, new EventArgs());
303+
304+
//Let the tcp socket linger for a second so it can try and send all data out before final close.
305+
_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, 1);
306+
307+
_socket.Close();
299308
}
300309

301310
internal bool QueueMessageToSend(SendMessageFrame frame)

WebSockets/WebSocketServer/WebSocketClientsPool.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public WebSocketClientsPool(int maxClients)
2323
}
2424

2525

26-
public bool Add(WebSocket webSocket)
26+
public bool Add(WebSocketServerClient webSocket)
2727
{
2828
if (Count < Max)
2929
{
@@ -58,10 +58,10 @@ public bool Contains(string endPoint)
5858

5959
}
6060

61-
public WebSocket Get(string endPoint)
61+
public WebSocketServerClient Get(string endPoint)
6262
{
6363

64-
return (WebSocket)_webSocketClients[endPoint];
64+
return (WebSocketServerClient)_webSocketClients[endPoint];
6565

6666
}
6767

0 commit comments

Comments
 (0)