Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
notthetup committed Oct 3, 2024
1 parent 3838dad commit 57d53a7
Show file tree
Hide file tree
Showing 9 changed files with 319 additions and 281 deletions.
2 changes: 1 addition & 1 deletion docs/javadoc/index-all.html
Original file line number Diff line number Diff line change
Expand Up @@ -3894,7 +3894,7 @@ <h2 class="title">W</h2>
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="org/arl/fjage/remote/EnumTypeAdapter.html#write-com.google.gson.stream.JsonWriter-java.lang.Object-">write(JsonWriter, Object)</a></span> - Method in class org.arl.fjage.remote.<a href="org/arl/fjage/remote/EnumTypeAdapter.html" title="class in org.arl.fjage.remote">EnumTypeAdapter</a></dt>
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="org/arl/fjage/connectors/WebSocketConnector.WSHandler.html#WSHandler-org.arl.fjage.connectors.WebSocketConnector-">WSHandler(WebSocketConnector)</a></span> - Constructor for class org.arl.fjage.connectors.<a href="org/arl/fjage/connectors/WebSocketConnector.WSHandler.html" title="class in org.arl.fjage.connectors">WebSocketConnector.WSHandler</a></dt>
<dt><span class="memberNameLink"><a href="org/arl/fjage/connectors/WebSocketConnector.WSHandler.html#WSHandler-org.arl.fjage.connectors.WebSocketHubConnector-">WSHandler(WebSocketConnector)</a></span> - Constructor for class org.arl.fjage.connectors.<a href="org/arl/fjage/connectors/WebSocketConnector.WSHandler.html" title="class in org.arl.fjage.connectors">WebSocketConnector.WSHandler</a></dt>
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="org/arl/fjage/connectors/WebSocketConnector.html#wsHandlers">wsHandlers</a></span> - Variable in class org.arl.fjage.connectors.<a href="org/arl/fjage/connectors/WebSocketConnector.html" title="class in org.arl.fjage.connectors">WebSocketConnector</a></dt>
<dd>&nbsp;</dd>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ <h2 title="Class WebSocketConnector.WSHandler" class="title">Class WebSocketConn
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.arl.fjage.connectors.WebSocketConnector.WSHandler</li>
<li>org.arl.fjage.connectors.WebSocketHubConnector.WSHandler</li>
</ul>
</li>
</ul>
Expand Down Expand Up @@ -132,7 +132,7 @@ <h3>Constructor Summary</h3>
<th class="colOne" scope="col">Constructor and Description</th>
</tr>
<tr class="altColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../org/arl/fjage/connectors/WebSocketConnector.WSHandler.html#WSHandler-org.arl.fjage.connectors.WebSocketConnector-">WSHandler</a></span>(<a href="../../../../org/arl/fjage/connectors/WebSocketConnector.html" title="class in org.arl.fjage.connectors">WebSocketConnector</a>&nbsp;conn)</code>&nbsp;</td>
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../org/arl/fjage/connectors/WebSocketConnector.WSHandler.html#WSHandler-org.arl.fjage.connectors.WebSocketHubConnector-">WSHandler</a></span>(<a href="../../../../org/arl/fjage/connectors/WebSocketConnector.html" title="class in org.arl.fjage.connectors">WebSocketConnector</a>&nbsp;conn)</code>&nbsp;</td>
</tr>
</table>
</li>
Expand Down Expand Up @@ -188,7 +188,7 @@ <h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a name="WSHandler-org.arl.fjage.connectors.WebSocketConnector-">
<a name="WSHandler-org.arl.fjage.connectors.WebSocketHubConnector-">
<!-- -->
</a>
<ul class="blockListLast">
Expand Down
6 changes: 3 additions & 3 deletions docs/javadoc/org/arl/fjage/connectors/WebSocketConnector.html
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ <h2 title="Class WebSocketConnector" class="title">Class WebSocketConnector</h2>
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.arl.fjage.connectors.WebSocketConnector</li>
<li>org.arl.fjage.connectors.WebSocketHubConnector</li>
</ul>
</li>
</ul>
Expand Down Expand Up @@ -173,7 +173,7 @@ <h3>Field Summary</h3>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/arl/fjage/connectors/WebSocketConnector.html#name">name</a></span></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>protected org.arl.fjage.connectors.WebSocketConnector.OutputThread</code></td>
<td class="colFirst"><code>protected org.arl.fjage.connectors.WebSocketHubConnector.OutputThread</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/arl/fjage/connectors/WebSocketConnector.html#outThread">outThread</a></span></code>&nbsp;</td>
</tr>
<tr class="altColor">
Expand Down Expand Up @@ -383,7 +383,7 @@ <h4>wsHandlers</h4>
<ul class="blockList">
<li class="blockList">
<h4>outThread</h4>
<pre>protected&nbsp;org.arl.fjage.connectors.WebSocketConnector.OutputThread outThread</pre>
<pre>protected&nbsp;org.arl.fjage.connectors.WebSocketHubConnector.OutputThread outThread</pre>
</li>
</ul>
<a name="pin">
Expand Down
266 changes: 1 addition & 265 deletions src/main/java/org/arl/fjage/connectors/WebSocketConnector.java
Original file line number Diff line number Diff line change
@@ -1,268 +1,4 @@
/******************************************************************************
Copyright (c) 2018, Mandar Chitre
This file is part of fjage which is released under Simplified BSD License.
See file LICENSE.txt or go to http://www.opensource.org/licenses/BSD-3-Clause
for full license details.
******************************************************************************/

package org.arl.fjage.connectors;

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.logging.Logger;
import org.eclipse.jetty.websocket.api.*;
import org.eclipse.jetty.websocket.server.WebSocketHandler;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.websocket.servlet.*;
import org.eclipse.jetty.websocket.api.annotations.*;

/**
* Web socket connector.
*/
public class WebSocketConnector implements Connector, WebSocketCreator {

protected String name;
protected boolean linemode = false;
protected WebServer server;
protected ContextHandler handler;
protected List<WSHandler> wsHandlers = new CopyOnWriteArrayList<WSHandler>();
protected OutputThread outThread = null;
protected PseudoInputStream pin = new PseudoInputStream();
protected PseudoOutputStream pout = new PseudoOutputStream();
protected ConnectionListener listener = null;
protected Logger log = Logger.getLogger(getClass().getName());

/**
* Create a web socket connector and add it to a web server running on a
* given port. If a web server isn't already created, this will start the
* web server.
*/
public WebSocketConnector(int port, String context) {
init(port, context, -1);
}

/**
* Create a web socket connector and add it to a web server running on a
* given port. If a web server isn't already created, this will start the
* web server.
*/
public WebSocketConnector(int port, String context, boolean linemode) {
init(port, context, -1);
this.linemode = linemode;
}

/**
* Create a web socket connector and add it to a web server running on a
* given port. If a web server isn't already created, this will start the
* web server.
*/
public WebSocketConnector(int port, String context, int maxMsgSize) {
init(port, context, maxMsgSize);
}

/**
* Create a web socket connector and add it to a web server running on a
* given port. If a web server isn't already created, this will start the
* web server.
*/
public WebSocketConnector(int port, String context, boolean linemode, int maxMsgSize) {
init(port, context, maxMsgSize);
this.linemode = linemode;
}

protected void init(int port, String context, int maxMsgSize) {
try {
name = "ws://"+InetAddress.getLocalHost().getHostAddress()+":"+port+context;
} catch (UnknownHostException ex) {
name = "ws://0.0.0.0:"+port+context;
}
server = WebServer.getInstance(port);
handler = new ContextHandler(context);
handler.setHandler(new WebSocketHandler() {
@Override
public void configure(WebSocketServletFactory factory) {
factory.setCreator(WebSocketConnector.this);
if (maxMsgSize > 0) factory.getPolicy().setMaxTextMessageSize(maxMsgSize);
}
});
server.add(handler);
server.start();
outThread = new OutputThread();
outThread.start();
}

@Override
public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp) {
return new WSHandler(this);
}

@Override
public String getName() {
return name;
}

@Override
public InputStream getInputStream() {
return pin;
}

@Override
public OutputStream getOutputStream() {
return pout;
}

@Override
public void setConnectionListener(ConnectionListener listener) {
this.listener = listener;
}

@Override
public boolean isReliable() {
return true;
}

@Override
public boolean waitOutputCompletion(long timeout) {
return true;
}

@Override
public void close() {
outThread.close();
outThread = null;
server.remove(handler);
server = null;
handler = null;
pin.close();
pout.close();
pin = null;
pout = null;
}

@Override
public String toString() {
return name;
}

// thread to monitor incoming data on output stream and write to TCP clients

private class OutputThread extends Thread {

OutputThread() {
setName(getClass().getSimpleName()+":"+name);
setDaemon(true);
setPriority(MIN_PRIORITY);
}

@Override
public void run() {
while (true) {
String s;
if (linemode) {
s = pout.readLine();
if (s == null) break;
} else {
byte[] buf = pout.readAvailable();
if (buf == null) break;
s = new String(buf);
}
for (WSHandler t: wsHandlers)
t.write(s);
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
break;
}
}
}

void close() {
try {
if (pout != null) {
pout.close();
join();
}
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}

}

// servlets to manage web socket connections

@WebSocket(maxIdleTime = Integer.MAX_VALUE)
public class WSHandler {

Session session = null;
WebSocketConnector conn;

public WSHandler(WebSocketConnector conn) {
this.conn = conn;
}

@OnWebSocketConnect
public void onConnect(Session session) {
log.fine("New connection from "+session.getRemoteAddress());
this.session = session;
wsHandlers.add(this);
if (listener != null) listener.connected(conn);
}

@OnWebSocketClose
public void onClose(int statusCode, String reason) {
log.fine("Connection from "+session.getRemoteAddress()+" closed");
session = null;
wsHandlers.remove(this);
}

@OnWebSocketError
public void onError(Throwable t) {
log.warning(t.toString());
}

@OnWebSocketMessage
public void onMessage(String message) {
byte[] buf = message.getBytes();
synchronized (pin) {
for (int c : buf) {
if (c < 0) c += 256;
if (c == 4) continue; // ignore ^D
try {
pin.write(c);
} catch (IOException ex) {
// do nothing
}
}
}
}

void write(String s) {
try {
if (session != null && session.isOpen()) {
Future<Void> f = session.getRemote().sendStringByFuture(s);
try {
f.get(500, TimeUnit.MILLISECONDS);
} catch (TimeoutException e){
log.fine("Sending timed out. Closing connection to " + session.getRemoteAddress());
session.disconnect();
} catch (Exception e){
log.warning(e.toString());
}
}
} catch (Exception e) {
log.warning(e.toString());
}
}

}

public class WebSocketConnector {
}
Loading

0 comments on commit 57d53a7

Please sign in to comment.