A Java event based WebSocket and HTTP server

Related tags

Networking webbit
Overview

Webbit - A Java event based WebSocket and HTTP server

Build Status

Getting it

Prebuilt JARs are available from the central Maven repository or the Sonatype Maven repository.

Alternatively, you can get the latest code from Git and build it yourself:

git clone git://github.com/webbit/webbit.git
cd webbit

Make

Build is done with make. On OS-X and Linux this should work out of the box. On Solaris, use gmake. On Windows you will need Cygwin.

make

Maven

mvn install

Quick start

Start a web server on port 8080 and serve some static files:

WebServer webServer = WebServers.createWebServer(8080)
            .add(new StaticFileHandler("/web")) // path to web content
            .start()
            .get();

That was easy.

Now let's build a WebSocketHandler.

public class HelloWebSockets extends BaseWebSocketHandler {
    private int connectionCount;

    public void onOpen(WebSocketConnection connection) {
        connection.send("Hello! There are " + connectionCount + " other connections active");
        connectionCount++;
    }

    public void onClose(WebSocketConnection connection) {
        connectionCount--;
    }

    public void onMessage(WebSocketConnection connection, String message) {
        connection.send(message.toUpperCase()); // echo back message in upper case
    }

    public static void main(String[] args) {
        WebServer webServer = WebServers.createWebServer(8080)
                .add("/hellowebsocket", new HelloWebSockets())
                .add(new StaticFileHandler("/web"));
        webServer.start();
        System.out.println("Server running at " + webServer.getUri());
    }
}

And a page that uses the WebSocket (web/index.html)

<html>
  <body>

    <!-- Send text to websocket -->
    <input id="userInput" type="text">
    <button onclick="ws.send(document.getElementById('userInput').value)">Send</button>

    <!-- Results -->
    <div id="message"></div>

    <script>
      function showMessage(text) {
        document.getElementById('message').innerHTML = text;
      }

      var ws = new WebSocket('ws://' + document.location.host + '/hellowebsocket');
      showMessage('Connecting...');
      ws.onopen = function() { showMessage('Connected!'); };
      ws.onclose = function() { showMessage('Lost connection'); };
      ws.onmessage = function(msg) { showMessage(msg.data); };
    </script>
  </body>
</html>

Contributing

Running JUnit tests

mvn clean test

or

make clean test

Running Autobahn tests

Autobahn is a WebSocket server implemented in Python that comes with an extensive test suite that can be used to test other WebSocket servers as well.

We're using it to test Webbit.

Installing Autobahn

git submodule update --init

Running Autobahn tests

In shell A:

make echo

In shell B:

make autobahn

Open reports/servers/index.html to see the results.

More

Comments
  • Stop and restart of NettyWebServer throws an IllegalStateException

    Stop and restart of NettyWebServer throws an IllegalStateException

    NettyWebServer: start tries to call bootstrap.setFactory a second time, but that is illegal. Instead move all the code of setting up bootstrap to the start method and in stop set bootstrap to null again.

    NettyWebServerTest: A test is included which does excatly that: start, stop, start, stop of the WebServer

    opened by chtheis 12
  • New 0.4.9 ThreadFactory creating daemon threads

    New 0.4.9 ThreadFactory creating daemon threads

    This came from one of my colleagues. @s1monw any comments?


    42c0fad77794e632a5a4cc69df7f65360460b022

    This change is seemingly harmless in that it is simply adding names to various webbit threads. The problem is that the ThreadFactory implementation is creating daemon threads. For apps that are relying on the webbit threads to be user threads in order to keep the app alive, they will simply exit after calling start.

    I’m pretty sure this is not the intention since every sample creates a WebServer and starts it. To see the behavior, choose any of the webbit sample apps, run it, and observe that it exits out and doesn’t stay alive. Since NamedThreadFactory seems to have been copied from another project, I’m not sure if the proper fix is the flip isDaemon(false) in NamedThreadFactory.newThread(). I suppose we could just remove the “copied from Lucene” comment so there is no confusion. Let me know how we should go about fixing this.

    opened by aslakhellesoy 11
  • Support HTTP partial content ranges

    Support HTTP partial content ranges

    When the browser makes a request specifying the 'Range' header, Webbit should respond with HTTP 206 (Partial Content) instead of HTTP 200 and the appropriate Content-Range and Accept-Ranges headers.

    At the moment, it doesn't and it manifests itself as a weird sound reliability bug. Chrome will make a Range request for specific types of media - such as audio and video. It appears to serve the content correctly, but attempting to play() the media a second time fails. I've verified (using Apache HTTPD) that this is not an issue if HTTP Range is implemented correctly.


    Here's a TCP dump of a conversation between Chrome and the webserver for loading a sound via the

    Webbit:

    GET /foo.wav HTTP/1.1 
    Host: localhost
    Connection: keep-alive
    Cache-Control: max-age=0
    Accept-Encoding: identity;q=1, *;q=0
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.816.0 Safari/535.1
    Accept: */*
    Accept-Language: en-US,en;q=0.8
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
    Range: bytes=0-
    
    HTTP/1.1 200 OK
    Server: Webbit
    Content-Length: 46198
    
    blahblahblah...
    

    Apache:

    GET /foo.wav HTTP/1.1
    Host: localhost
    Connection: keep-alive
    Cache-Control: max-age=0
    Accept-Encoding: identity;q=1, *;q=0
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.816.0 Safari/535.1
    Accept: */*
    Accept-Language: en-US,en;q=0.8 
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
    Range: bytes=0-
    
    HTTP/1.1 206 Partial Content
    Server: Apache-Coyote/1.1
    Accept-Ranges: bytes
    ETag: W/"184364-1320695950000"
    Last-Modified: Mon, 07 Nov 2011 19:59:10 GMT
    Content-Range: bytes 0-184363/184364
    Content-Type: audio/x-wav
    Content-Length: 46198
    Date: Tue, 08 Nov 2011 23:00:47 GMT
    
    blahblahblah...
    
    opened by joewalnes 11
  • Test with Autobahn

    Test with Autobahn

    I have integrated Autobahn's awesome test suite on my master branch. It has 200 test cases, which should help us weed out any bugs in the WebSocket implementation. Instructions about how to set it up and run it is in the README.

    The annoying thing is that the first test fails. (You can run a subset of tests by setting e.g. "cases": ["1.1.2"] in fuzzing_client_spec.json).

    The problem is that the connection is closed immediately after connection - before any messages are received. I'm not sure what's causing this. I was able to run all of the tests agains Jetty without problems.

    Any idea what could be causing this?

    opened by aslakhellesoy 11
  • Compile Errors using webbit-0.4.0-full.jar

    Compile Errors using webbit-0.4.0-full.jar

    Trying to compile the Quick Start WebSocketHandler in the README.md against the webbit-0.4.0-full.jar. Doing the same compile against the webbit-0.3.8-full.jar is OK. In both cases I'm using Oracle's 1.6 JRE in the Eclipse IDE.

    Think the WebSocketHandler example code needs updating for 0.4.0 as there is now an onPing method required and the existing onPong method now uses byte[] instead of String for message.

    Also getting:

    Type mismatch: cannot convert from Future<capture#1-of ? extends > WebServer>to WebServer

    on the code that creates the WebServer.

    Its the Type mismatch that has me completely stuck!!

    opened by philrob 10
  • Sinatra-style fluent interface (was: URI-template support)

    Sinatra-style fluent interface (was: URI-template support)

    Writing RESTful apps with Webbit is rather cumbersome due to the lack of more powerful path match handling.

    The uritemplate spec makes it easier to define parameterised URLs.

    The JAX-RS spec defines a @UriTemplate annotation and a UriBuilder class that understands uri-templates. As with most things coming out of the JCP it is half-baked (UriBuilder is abstract and you have to implement your own, which various projects have done), but it's just too much of a PITA.

    A much simpler and non-intrusive implementation is in the uri-template project on Google Code.

    This pull request is a proof of concept that seems to work well. It will be much easier to use Webbit to build RESTful applications with this in place - much nicer than my webbit-rest project which drags in all that JAX-RS crap.

    Ideally I'd like this to be included in Webbit by default, replacing the java.util.Pattern based PathMatchHandler. If we go down this route we'd have to jarjar the uritemplate jar inside webbit.

    Currently my branch only builds with make since the uritemplate jar is not in any maven repos.

    Let me know what you think.

    HTTP Experiment 
    opened by aslakhellesoy 10
  • attempt to fix tests for Travis

    attempt to fix tests for Travis

    • replace HttpCookie.parse with netty CookieDecoder for jdk6 compatibility
    • increase wait time for timing dependent tests so a slower CI server won't time out
    opened by pk11 9
  • WebServers.createWebServer(port) doesn't stop cleanly

    WebServers.createWebServer(port) doesn't stop cleanly

    If you create a web server via WebServers.createWebServer(port) it does not stop cleanly under some conditions. The one of the auto-created executors is not shut down when stopping.

    opened by navision 8
  • Flash based WebSockets

    Flash based WebSockets

    In lieu of full Socket.IO support (issue 18), at least support Flash based WebSockets, so more browsers can make use of Webbit.

    https://github.com/gimite/web-socket-js

    Although this sounds like it should be a separate project, it may be awkward, because the Flash policy checking mechanism doesn't speak valid HTTP, so it may require the underlying networking code to be changed.

    WebSocket 
    opened by joewalnes 8
  • Restart NettyWebServer

    Restart NettyWebServer

    Shall it be possible to stop and start the Webserver whithout creating a new instance? When I call "stop()" and then "start()" again on NettyWebServer I get an IllegalStateException, because the boostrap object already has a factory. When I change the code and put the setting up of the boostrap object from the constructor to the start method and set boostrap to null in the stop method, it works. At least there are no apparent errors :)

    Christoph

    API 
    opened by chtheis 7
  • Add support for chunked responses

    Add support for chunked responses

    This changeset provides a simple way to implement HTTP streaming.

    About the implementation:

    • HttpResponse#chunked signals that the response is going to be a chunked one (i.e. "Transfer-Encoding: chunked")
    • calling HttpResponse#write afterwards will write chunks to the channel
    • often times streaming is continuous (i.e. response#end never gets called) unless staleConnectionTimeout kicks in
    • however, if response#end does get called, make sure to write a DefaultHttpChunk with 0 byte to the channel to signal the browser that streaming is over
    opened by pk11 6
  • Bump gson from 2.2.4 to 2.8.9

    Bump gson from 2.2.4 to 2.8.9

    Bumps gson from 2.2.4 to 2.8.9.

    Release notes

    Sourced from gson's releases.

    Gson 2.8.9

    • Make OSGi bundle's dependency on sun.misc optional (#1993).
    • Deprecate Gson.excluder() exposing internal Excluder class (#1986).
    • Prevent Java deserialization of internal classes (#1991).
    • Improve number strategy implementation (#1987).
    • Fix LongSerializationPolicy null handling being inconsistent with Gson (#1990).
    • Support arbitrary Number implementation for Object and Number deserialization (#1290).
    • Bump proguard-maven-plugin from 2.4.0 to 2.5.1 (#1980).
    • Don't exclude static local classes (#1969).
    • Fix RuntimeTypeAdapterFactory depending on internal Streams class (#1959).
    • Improve Maven build (#1964).
    • Make dependency on java.sql optional (#1707).

    Gson 2.8.8

    • Fixed issue with recursive types (#1390).
    • Better behaviour with Java 9+ and Unsafe if there is a security manager (#1712).
    • EnumTypeAdapter now works better when ProGuard has obfuscated enum fields (#1495).
    Changelog

    Sourced from gson's changelog.

    Version 2.8.9

    • Make OSGi bundle's dependency on sun.misc optional (#1993).
    • Deprecate Gson.excluder() exposing internal Excluder class (#1986).
    • Prevent Java deserialization of internal classes (#1991).
    • Improve number strategy implementation (#1987).
    • Fix LongSerializationPolicy null handling being inconsistent with Gson (#1990).
    • Support arbitrary Number implementation for Object and Number deserialization (#1290).
    • Bump proguard-maven-plugin from 2.4.0 to 2.5.1 (#1980).
    • Don't exclude static local classes (#1969).
    • Fix RuntimeTypeAdapterFactory depending on internal Streams class (#1959).
    • Improve Maven build (#1964).
    • Make dependency on java.sql optional (#1707).

    Version 2.8.8

    • Fixed issue with recursive types (#1390).
    • Better behaviour with Java 9+ and Unsafe if there is a security manager (#1712).
    • EnumTypeAdapter now works better when ProGuard has obfuscated enum fields (#1495).

    Version 2.8.7

    • Fixed ISO8601UtilsTest failing on systems with UTC+X.
    • Improved javadoc for JsonStreamParser.
    • Updated proguard.cfg (#1693).
    • Fixed IllegalStateException in JsonTreeWriter (#1592).
    • Added JsonArray.isEmpty() (#1640).
    • Added new test cases (#1638).
    • Fixed OSGi metadata generation to work on JavaSE < 9 (#1603).

    Version 2.8.6

    2019-10-04 GitHub Diff

    • Added static methods JsonParser.parseString and JsonParser.parseReader and deprecated instance method JsonParser.parse
    • Java 9 module-info support

    Version 2.8.5

    2018-05-21 GitHub Diff

    • Print Gson version while throwing AssertionError and IllegalArgumentException
    • Moved utils.VersionUtils class to internal.JavaVersion. This is a potential backward incompatible change from 2.8.4
    • Fixed issue google/gson#1310 by supporting Debian Java 9

    Version 2.8.4

    2018-05-01 GitHub Diff

    • Added a new FieldNamingPolicy, LOWER_CASE_WITH_DOTS that mapps JSON name someFieldName to some.field.name
    • Fixed issue google/gson#1305 by removing compile/runtime dependency on sun.misc.Unsafe

    Version 2.8.3

    2018-04-27 GitHub Diff

    • Added a new API, GsonBuilder.newBuilder() that clones the current builder
    • Preserving DateFormatter behavior on JDK 9

    ... (truncated)

    Commits
    • 6a368d8 [maven-release-plugin] prepare release gson-parent-2.8.9
    • ba96d53 Fix missing bounds checks for JsonTreeReader.getPath() (#2001)
    • ca1df7f #1981: Optional OSGi bundle's dependency on sun.misc package (#1993)
    • c54caf3 Deprecate Gson.excluder() exposing internal Excluder class (#1986)
    • e6fae59 Prevent Java deserialization of internal classes (#1991)
    • bda2e3d Improve number strategy implementation (#1987)
    • cd748df Fix LongSerializationPolicy null handling being inconsistent with Gson (#1990)
    • fe30b85 Support arbitrary Number implementation for Object and Number deserialization...
    • 1cc1627 Fix incorrect feature request template label (#1982)
    • 7b9a283 Bump bnd-maven-plugin from 5.3.0 to 6.0.0 (#1985)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump junit from 4.11 to 4.13.1

    Bump junit from 4.11 to 4.13.1

    Bumps junit from 4.11 to 4.13.1.

    Release notes

    Sourced from junit's releases.

    JUnit 4.13.1

    Please refer to the release notes for details.

    JUnit 4.13

    Please refer to the release notes for details.

    JUnit 4.13 RC 2

    Please refer to the release notes for details.

    JUnit 4.13 RC 1

    Please refer to the release notes for details.

    JUnit 4.13 Beta 3

    Please refer to the release notes for details.

    JUnit 4.13 Beta 2

    Please refer to the release notes for details.

    JUnit 4.13 Beta 1

    Please refer to the release notes for details.

    JUnit 4.12

    Please refer to the release notes for details.

    JUnit 4.12 Beta 3

    Please refer to the release notes for details.

    JUnit 4.12 Beta 2

    No release notes provided.

    JUnit 4.12 Beta 1

    No release notes provided.

    Commits
    • 1b683f4 [maven-release-plugin] prepare release r4.13.1
    • ce6ce3a Draft 4.13.1 release notes
    • c29dd82 Change version to 4.13.1-SNAPSHOT
    • 1d17486 Add a link to assertThrows in exception testing
    • 543905d Use separate line for annotation in Javadoc
    • 510e906 Add sub headlines to class Javadoc
    • 610155b Merge pull request from GHSA-269g-pwp5-87pp
    • b6cfd1e Explicitly wrap float parameter for consistency (#1671)
    • a5d205c Fix GitHub link in FAQ (#1672)
    • 3a5c6b4 Deprecated since jdk9 replacing constructor instance of Double and Float (#1660)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • [SECURITY] Use HTTPS to resolve dependencies in Maven Build

    [SECURITY] Use HTTPS to resolve dependencies in Maven Build

    mitm_build


    This is a security fix for a vulnerability in your Apache Maven pom.xml file(s).

    The build files indicate that this project is resolving dependencies over HTTP instead of HTTPS. This leaves your build vulnerable to allowing a Man in the Middle (MITM) attackers to execute arbitrary code on your or your computer or CI/CD system.

    This vulnerability has a CVSS v3.0 Base Score of 8.1/10.

    POC code has existed since 2014 to maliciously compromise a JAR file in-flight. MITM attacks against HTTP are increasingly common, for example Comcast is known to have done it to their own users.

    This contribution is a part of a submission to the GitHub Security Lab Bug Bounty program.

    Detecting this and Future Vulnerabilities

    This vulnerability was automatically detected by LGTM.com using this CodeQL Query.

    As of September 2019 LGTM.com and Semmle are officially a part of GitHub.

    You can automatically detect future vulnerabilities like this by enabling the free (for open-source) LGTM App.

    I'm not an employee of GitHub nor of Semmle, I'm simply a user of LGTM.com and an open-source security researcher.

    Source

    Yes, this contribution was automatically generated, however, the code to generate this PR was lovingly hand crafted to bring this security fix to your repository.

    The source code that generated and submitted this PR can be found here: JLLeitschuh/bulk-security-pr-generator

    Opting-Out

    If you'd like to opt-out of future automated security vulnerability fixes like this, please consider adding a file called .github/GH-ROBOTS.txt to your repository with the line:

    User-agent: JLLeitschuh/bulk-security-pr-generator
    Disallow: *
    

    This bot will respect the ROBOTS.txt format for future contributions.

    Alternatively, if this project is no longer actively maintained, consider archiving the repository.

    CLA Requirements

    This section is only relevant if your project requires contributors to sign a Contributor License Agreement (CLA) for external contributions.

    It is unlikely that I'll be able to directly sign CLAs. However, all contributed commits are already automatically signed-off.

    The meaning of a signoff depends on the project, but it typically certifies that committer has the rights to submit this work under the same license and agrees to a Developer Certificate of Origin (see https://developercertificate.org/ for more information).

    - Git Commit Signoff documentation

    If signing your organization's CLA is a strict-requirement for merging this contribution, please feel free to close this PR.

    Tracking

    All PR's generated as part of this fix are tracked here: https://github.com/JLLeitschuh/bulk-security-pr-generator/issues/2

    opened by JLLeitschuh 0
  • Detect client bandwidth or whether WebSocket Connection is busy

    Detect client bandwidth or whether WebSocket Connection is busy

    I'm using Webbit for streaming video over a websocket, I want to apply some adaptive streaming, but I am scratching my head on how I can detect the bandwidth of the user, or just whether to check when data is still outgoing. WebsocketConnection.send(data) will return immediately afaik.

    Is there a way in Webbit to check whether a connection is busy? Is that even an option?

    opened by Kjos 2
  • Adding headers to WebSocket

    Adding headers to WebSocket

    I have a problem with webbit. Is there a way to add a ACCESS_CONTROL_ALLOW_ORIGIN header to the normal web server?

    Currently my code looks like this.

        webSocket = new WebSocketHandler();
        WebServer webServer = WebServers.createWebServer(2021);
    
        webServer.add("/", webSocket);
        webServer.start();
    
    opened by NexusNull 1
Magician is an asynchronous non-blocking network protocol analysis package, supports TCP, UDP protocol, built-in Http, WebSocket decoder

An asynchronous non-blocking network protocol analysis package Project Description Magician is an asynchronous non-blocking network protocol analysis

贝克街的天才 103 Nov 30, 2022
A barebones WebSocket client and server implementation written in 100% Java.

Java WebSockets This repository contains a barebones WebSocket server and client implementation written in 100% Java. The underlying classes are imple

Nathan Rajlich 9.5k Dec 30, 2022
WebSocket server with creatable/joinable channels.

bytesocks ?? bytesocks is a WebSocket server which allows clients to create "channels" and send messages in them. It's effectively an add-on for byteb

lucko 6 Nov 29, 2022
Distributed WebSocket Server

Keeper 分布式 WebSocket 服务器。 注意事项 IO 线程和业务线程分离:对于小业务,依旧放到 worker 线程中处理,对于需要和中间件交互的丢到业务线程池处理,避免 worker 阻塞。 WebSocket 握手阶段支持参数列表。 插件 本服务功能插件化。

岚 1 Dec 15, 2022
Microhttp - a fast, scalable, event-driven, self-contained Java web server

Microhttp is a fast, scalable, event-driven, self-contained Java web server that is small enough for a programmer to understand and reason about.

Elliot Barlas 450 Dec 23, 2022
A simple, fast integration of WebSocket spring-stater

websocket-spring-boot-starter readme 介绍 一个简单,快速,低配的spring-boot-starter,是对spring-boot-starter-websocket的扩展与二次封装,简化了springboot应用对websocket的操作 特点 简单,低配 支

Jack 4 Dec 24, 2021
HTTP Server Model made in java

SimplyJServer HTTP Server Model made in java Features Fast : SimplyJServer is 40%-60% faster than Apache, due to it's simplicity. Simple to implement

Praudyogikee for Advanced Technology 2 Sep 25, 2021
The Java gRPC implementation. HTTP/2 based RPC

gRPC-Java - An RPC library and framework gRPC-Java works with JDK 7. gRPC-Java clients are supported on Android API levels 16 and up (Jelly Bean and l

grpc 10.2k Jan 1, 2023
Netty project - an event-driven asynchronous network application framework

Netty Project Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol serv

The Netty Project 30.5k Jan 3, 2023
Simple & Lightweight Netty packet library + event system

Minimalistic Netty-Packet library Create packets with ease Bind events to packets Example Packet: public class TestPacket extends Packet { privat

Pierre Maurice Schwang 17 Dec 7, 2022
TCP/UDP client/server library for Java, based on Kryo

KryoNet can be downloaded on the releases page. Please use the KryoNet discussion group for support. Overview KryoNet is a Java library that provides

Esoteric Software 1.7k Jan 2, 2023
A simple Discord bot, which shows the server status of the Lost Ark server Beatrice

Beatrice A simple Discord bot, which shows the server status of the Lost Ark server Beatrice. Example Usage Clone the repository. Edit the property fi

Leon 3 Mar 9, 2022
Square’s meticulous HTTP client for the JVM, Android, and GraalVM.

OkHttp See the project website for documentation and APIs. HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP

Square 43.4k Jan 9, 2023
Standalone Play WS, an async HTTP client with fluent API

Play WS Standalone Play WS is a powerful HTTP Client library, originally developed by the Play team for use with Play Framework. It uses AsyncHttpClie

Play Framework 213 Dec 15, 2022
A small java project consisting of Client and Server, that communicate via TCP/UDP protocols.

Ninja Battle A small java project consisting of Client and Server, that communicate via TCP/UDP protocols. Client The client is equipped with a menu i

Steliyan Dobrev 2 Jan 14, 2022
Socket.IO server implemented on Java. Realtime java framework

Netty-socketio Overview This project is an open-source Java implementation of Socket.IO server. Based on Netty server framework. Checkout Demo project

Nikita Koksharov 6k Dec 30, 2022
An annotation-based Java library for creating Thrift serializable types and services.

Drift Drift is an easy-to-use, annotation-based Java library for creating Thrift clients and serializable types. The client library is similar to JAX-

null 225 Dec 24, 2022
BAIN Social is a Fully Decentralized Server/client system that utilizes Concepts pioneered by I2P, ToR, and PGP to create a system which bypasses singular hosts for data while keeping that data secure.

SYNOPSIS ---------------------------------------------------------------------------------------------------- Welcome to B.A.I.N - Barren's A.I. Natio

Barren A.I. Wolfsbane 14 Jan 11, 2022