TCP/UDP client/server library for Java, based on Kryo

Related tags

Networking kryonet
Overview

KryoNet

KryoNet can be downloaded on the releases page. Please use the KryoNet discussion group for support.

Overview

KryoNet is a Java library that provides a clean and simple API for efficient TCP and UDP client/server network communication using NIO. KryoNet uses the Kryo serialization library to automatically and efficiently transfer object graphs across the network.

KryoNet runs on both the desktop and on Android.

KryoNet is ideal for any client/server application. It is very efficient, so is especially good for games. KryoNet can also be useful for inter-process communication.

Running a server

This code starts a server on TCP port 54555 and UDP port 54777:

    Server server = new Server();
    server.start();
    server.bind(54555, 54777);

The start method starts a thread to handle incoming connections, reading/writing to the socket, and notifying listeners.

This code adds a listener to handle receiving objects:

    server.addListener(new Listener() {
       public void received (Connection connection, Object object) {
          if (object instanceof SomeRequest) {
             SomeRequest request = (SomeRequest)object;
             System.out.println(request.text);
    
             SomeResponse response = new SomeResponse();
             response.text = "Thanks";
             connection.sendTCP(response);
          }
       }
    });

Note the Listener class has other notification methods that can be overridden.

Typically a listener has a series of instanceof checks to decide what to do with the object received. In this example, it prints out a string and sends a response over TCP.

The SomeRequest and SomeResponse classes are defined like this:

    public class SomeRequest {
       public String text;
    }
    public class SomeResponse {
       public String text;
    }

Kryo automatically serializes the objects to and from bytes.

Connecting a client

This code connects to a server running on TCP port 54555 and UDP port 54777:

    Client client = new Client();
    client.start();
    client.connect(5000, "192.168.0.4", 54555, 54777);
    
    SomeRequest request = new SomeRequest();
    request.text = "Here is the request";
    client.sendTCP(request);

The start method starts a thread to handle the outgoing connection, reading/writing to the socket, and notifying listeners. Note that the thread must be started before connect is called, else the outgoing connection will fail.

In this example, the connect method blocks for a maximum of 5000 milliseconds. If it times out or connecting otherwise fails, an exception is thrown (handling not shown). After the connection is made, the example sends a "SomeRequest" object to the server over TCP.

This code adds a listener to print out the response:

    client.addListener(new Listener() {
       public void received (Connection connection, Object object) {
          if (object instanceof SomeResponse) {
             SomeResponse response = (SomeResponse)object;
             System.out.println(response.text);
          }
       }
    });

Registering classes

For the above examples to work, the classes that are going to be sent over the network must be registered with the following code:

    Kryo kryo = server.getKryo();
    kryo.register(SomeRequest.class);
    kryo.register(SomeResponse.class);
    Kryo kryo = client.getKryo();
    kryo.register(SomeRequest.class);
    kryo.register(SomeResponse.class);

This must be done on both the client and server, before any network communication occurs. It is very important that the exact same classes are registered on both the client and server, and that they are registered in the exact same order. Because of this, typically the code that registers classes is placed in a method on a class available to both the client and server.

Please see the Kryo serialization library for more information on how objects are serialized for network transfer. Kryo can serialize any object and supports data compression (eg, deflate compression).

TCP and UDP

KryoNet always uses a TCP port. This allows the framework to easily perform reliable communication and have a stateful connection. KryoNet can optionally use a UDP port in addition to the TCP port. While both ports can be used simultaneously, it is not recommended to send an huge amount of data on both at the same time because the two protocols can affect each other.

TCP is reliable, meaning objects sent are sure to arrive at their destination eventually. UDP is faster but unreliable, meaning an object sent may never be delivered. Because it is faster, UDP is typically used when many updates are being sent and it doesn't matter if an update is missed.

Note that KryoNet does not currently implement any extra features for UDP, such as reliability or flow control. It is left to the application to make proper use of the UDP connection.

Buffer sizes

KryoNet uses a few buffers for serialization and deserialization that must be sized appropriately for a specific application. See the Client and Server constructors for customizing the buffer sizes. There are two types of buffers, a write buffer and an object buffer.

To receive an object graph, the bytes are stored in the object buffer until all of the bytes for the object are received, then the object is deserialized. The object buffer should be sized at least as large as the largest object that will be received.

To send an object graph, it is serialized to the write buffer where it is queued until it can be written to the network socket. Typically it is written immediately, but when sending a lot of data or when the network is slow, it may remain queued in the write buffer for a short time. The write buffer should be sized at least as large as the largest object that will be sent, plus some head room to allow for some serialized objects to be queued. The amount of head room needed is dependent upon the size of objects being sent and how often they are sent.

To avoid very large buffer sizes, object graphs can be split into smaller pieces and sent separately. Collecting the pieces and reassembling the larger object graph, or writing them to disk, etc is left to the application code. If a large number of small object graphs are queued to be written at once, it may exceed the write buffer size. TcpIdleSender and InputStreamSender can be used to queue more data only when the connection is idle. Also see the setIdleThreshold method on the Connection class.

Threading

KryoNet imposes no restrictions on how threading is handled. The Server and Client classes have an update method that accepts connections and reads or writes any pending data for the current connections. The update method should be called periodically to process network events.

Both the Client and Server classes implement Runnable and the run method continually calls update until the stop method is called. Handing a client or server to a java.lang.Thread is a convenient way to have a dedicated update thread, and this is what the start method does. If this doesn't fit your needs, call update manually from the thread of your choice.

Listeners are notified from the update thread, so should not block for long. Static wrapper classes are provided on the Listener class to change how a listener is notified, such as ThreadedListener.

The update thread should never be blocked to wait for an incoming network message, as this will cause a deadlock.

LAN server discovery

KryoNet can broadcast a UDP message on the LAN to discover any servers running:

    InetAddress address = client.discoverHost(54777, 5000);
    System.out.println(address);

This will print the address of the first server found running on UDP port 54777. The call will block for up to 5000 milliseconds, waiting for a response.

Logging

KryoNet makes use of the low overhead, lightweight MinLog logging library. The logging level can be set in this way:

    Log.set(LEVEL_TRACE);

KryoNet does minimal logging at INFO and above levels. DEBUG is good to use during development and indicates the total number of bytes for each object sent. TRACE is good to use when debugging a specific problem, but outputs too much information to leave on all the time.

MinLog supports a fixed logging level, which will remove logging statements below that level. For efficiency, KryoNet can be compiled with a fixed logging level MinLog JAR. See MinLog for more information.

Pluggable Serialization

Serialization can be customized by providing a Serialization instance to the Client and Server constructors. By default KryoNet uses Kryo for serialization. Kryo uses a binary format and is very efficient, highly configurable, and does automatic serialization for most object graphs.

JsonSerialization is provided which uses JsonBeans to do serialization using JSON. JSON is human readable so is convenient for use during development to monitor the data being sent and received.

Remote Method Invocation

KryoNet has an easy to use mechanism for invoking methods on remote objects (RMI). This has a small amount of overhead versus explicitly sending objects. RMI can hide that methods are being marshaled and executed remotely, but in practice the code using such methods will need to be aware of the network communication to handle errors and methods that block. KryoNet's RMI is not related to the java.rmi package.

RMI is done by first calling registerClasses, creating an ObjectSpace and registering objects with an ID:

    ObjectSpace.registerClasses(endPoint.getKryo());
    ObjectSpace objectSpace = new ObjectSpace();
    objectSpace.register(42, someObject);
    // ...
    objectSpace.addConnection(connection);

Multiple ObjectSpaces can be created for both the client or server side. Once registered, objects can be used on the other side of the registered connections:

    SomeObject someObject = ObjectSpace.getRemoteObject(connection, 42, SomeObject.class);
    SomeResult result = someObject.doSomething();

The getRemoteObject method returns a proxy object that represents the specified class. When a method on the class is called, a message is sent over the connection and on the remote side the method is invoked on the registered object. The method blocks until the return value is sent back over the connection.

Exactly how the remote method invocation is performed can be customized by casting the proxy object to a RemoteObject.

    SomeObject someObject = ObjectSpace.getRemoteObject(connection, 42, SomeObject.class);
    ((RemoteObject)someObject).setNonBlocking(true, true);
    someObject.doSomething();

Note that the SomeObject class does not need to implement RemoteObject, this is handled automatically.

The first true passed to setNonBlocking causes remote method invocations to be non-blocking. When doSomething is invoked, it will not block and wait for the return value. Instead the method will just return null.

The second true passed to setNonBlocking indicates that the return value of remote method invocations are to be ignored. This means the server will not waste time or bandwidth sending the result of the remote method invocation.

If the second parameter for setNonBlocking is false, the server will send back the remote method invocation return value. There are two ways to access a return value for a non-blocking method invocation:

    RemoteObject remoteObject = (RemoteObject)someObject;
    remoteObject.setNonBlocking(true, false);
    someObject.doSomething();
    // ...
    SomeResult result = remoteObject.waitForLastResponse();

    RemoteObject remoteObject = (RemoteObject)someObject;
    remoteObject.setNonBlocking(true, false);
    someObject.doSomething();
    byte responseID = remoteObject.getLastResponseID();
    // ...
    SomeResult result = remoteObject.waitForResponse(responseID);

KryoNet versus ?

KryoNet makes the assumptions that it will only be used for client/server architectures and that KryoNet will be used on both sides of the network. Because KryoNet solves a specific problem, the KryoNet API can do so very elegantly.

The Apache MINA project is similar to KryoNet. MINA's API is lower level and a great deal more complicated. Even the simplest client/server will require a lot more code to be written. MINA also is not integrated with a robust serialization framework and doesn't intrinsically support RMI.

The PyroNet project is a minimal layer over NIO. It provides TCP networking similar to KryoNet, but without the higher level features. Priobit requires all network communication to occur on a single thread.

The Java Game Networking project is a higher level library similar to KryoNet. JGN does not have as simple of an API.

Maven Build

<repositories>
   <repository>
      <id>clojars</id>
      <url>http://clojars.org/repo/</url>
   </repository>
</repositories>

<dependencies>
   <dependency>
      <groupId>kryonet</groupId>
      <artifactId>kryonet</artifactId>
      <version>2.21</version>
   </dependency>
</dependencies>

Further reading

Beyond this documentation page, you may find the following links useful:

Comments
  • Make JARs (classes, javadoc, source) available on Maven Central

    Make JARs (classes, javadoc, source) available on Maven Central

    Hi.

    How about

    • building kryonet with Maven,
    • getting rid of dependencies (library JARs) in your SVN/Git repo,
    • making the artifacts available on Maven Central?

    Maybe I can even give you a hand.

    opened by kriegaex 39
  • Buffer overflow in TcpConnection.send

    Buffer overflow in TcpConnection.send

    Howdy,

    Love the library, it has been such an easy networking client to work with, and I've used it in multiple projects.

    For one particular project, I have a client connected to a server streaming frames from a camera. Everything works great, but as the connection time gets longer, in the 10's of hours range, there is eventually a buffer overflow on the server side which causes the Server send thread to shut down.

    The client and server have write and object buffer sizes 50,000, which is sufficient (camera frames are small).

    I've tracked the issue down to the TcpConnection.send BufferOverflow, but I'm not sure if it is the writebuffer or the serialization object.

    I would like to kick around some ideas on how to fix this.

    • Put a try / catch around writebuffer and serialization object to catch buffer overflows. Perhaps the buffer could be flushed and a notification sent that the buffer is corrupted and to resend data. This would be preferable to a server crash, at least for me.
    • Determine why the write buffer is not being emptied?
    • Other?
    opened by amcelroy 20
  • Fix UDP recieving on Android 5.0+

    Fix UDP recieving on Android 5.0+

    Tested it, works great on my 5.0 device. This is a fix known by the community (https://github.com/EsotericSoftware/kryonet/issues/106, https://groups.google.com/forum/#!topic/kryonet-users/7l436tftBlo) but for some reason is not in the codebase.

    opened by sylvia43 17
  • Missing message possible reasons

    Missing message possible reasons

    Hi,

    We are using KryoNet 2.2.1 for our client-Server communication.

    We are using pluggable Serialization using Simple Binary Encoding protocol.

    We have recently seen issues where Message are disappearing on the wire i.e. Message are sent from the Sender but are not Received in receiver.

    Messages sent: 1-4 Client received: 1,3 and 4. 2 went missing

    Both Server and Client have read/write buffer sizes of 1MB.

    Just wanted to understand if any such issues have been reported before and is there a known fix /reason for these issues?

    What possibly can go wrong, as we have checked our code, it looks fine.

    opened by samthaku 13
  • Connected, but timed out during TCP registration. Note: Client#update must be called in a separate thread during connect

    Connected, but timed out during TCP registration. Note: Client#update must be called in a separate thread during connect

    I am using this library in my android.

    socketsingletonObj.start(); Kryo kryo = socketsingletonObj.getKryo(); InetAddress serverAddr = InetAddress.getByName(Helper.serverIpAddress); socketsingletonObj.connect(5000, serverAddr,Helper.serverPort);

    why i am getting this error.

    while if i use simple socket it works fine like this

    InetAddress serverAddr = InetAddress.getByName(Helper.serverIpAddress); socket = new Socket(serverAddr, Helper.serverPort);

    it works fine. so should i use simple socket instead of this ?

    opened by mubbashar 13
  • Reconnect handling

    Reconnect handling

    From [email protected] on July 29, 2010 13:59:12

    A disconnect from the server is easily recognizable through Listener / disconnected. Yet there is no easy way to reconnect, which brings me to the following problems:

    1. It's not possible to get the current parameters client.getRemoteAddressTCP() respective client.getRemoteAddressTCP() - both return null when the connection is dropped
    2. There is no client.getTimeout() method, although the parameter is required for connect()
    3. A client.reconnect() would be really great

    I'm using the latest 1.01 version from SVN.

    Original issue: http://code.google.com/p/kryonet/issues/detail?id=4

    bug imported Priority-Medium 
    opened by ghost 7
  • Get Server Ports

    Get Server Ports

    Hi,

    I started a Server with:

    Server server= new Server(); server.bind(0,0); server.start();

    (tpc and udp port 0, so it searchs free ports) Where do I find now the tcp and upd port, the server uses? I can only read inet addresses from client connections to the server, but not the server itself.

    Thanks!

    opened by Rolleander 6
  • kryonet protocol

    kryonet protocol

    Hi,

    As I dig deeper into the kryonet/kryo libraries, I appreciate the power and simplicity of the framework. Amazing work folks.

    I'm trying to serialize cocoa-objects over a socket connection to kryonet server. The server is correctly matching the source class to registered class and completing the serialization at the server end.

    I'm almost there, but for the following issues -

    1. The first field in the source is getting serialized to second, the second(source) to third (destination) and so-on.
    2. Strings are not getting serialized correctly because I'm not specifying the format (ascii/utf8) in the buffer. How is this done?

    Will appreciate if you can point to the protocol elements to be inserted in the buffer.

    Regards Sanjeev

    opened by sanjeev909 6
  • server select : 100% cpu

    server select : 100% cpu

    From [email protected] on May 25, 2012 04:48:18

    Problem similar to issue #17 but "selector.select(timeout);" does not return 0, so the sleep is not reached. The thread loops until the next select in : for(Iterator<SelectionKey> iter = keys.iterator(); iter.hasNext();) { [...] if (udp != null && fromConnection.udpRemoteAddress == null) continue; Running KryoNet 2.09 java version "1.7.0_04" GNU/Linux x86_64 Ubuntu 9.04

    Original issue: http://code.google.com/p/kryonet/issues/detail?id=19

    bug imported Priority-Medium 
    opened by ghost 6
  • An illegal reflective access operation has occurred

    An illegal reflective access operation has occurred

    WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.esotericsoftware.reflectasm.AccessClassLoader (file:/Users/student5309/Java/kryonet-2.21/jars/production/onejar/kryonet-2.21-all.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) WARNING: Please consider reporting this to the maintainers of com.esotericsoftware.reflectasm.AccessClassLoader WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release

    I got this when running Chat client/server example

    Eclipse/Java 8/kryonet 2.21 production

    opened by cpbentley 5
  • To be sure that the response (method result) generated by the server is expected (yet) by a method call not timed-out.

    To be sure that the response (method result) generated by the server is expected (yet) by a method call not timed-out.

    We are using this library in some projects, it's great. Thank you!

    With this check we try to avoid that a method call gets as result the response really associated with a previous call that fisnished with a timeout.

    The sequence that this code avoid:

    1. A method call ends with timeout. The responseID associated is 1, and when the server finally returns the result this will be stored in the responseTable attribute.
    2. 62 method calls come then without problems.
    3. The next method call (with responseID = 1) will send the invokation via TCP and then it will wait the server response. As responseTable has a result for responseID=1 the last method call gets as result the result associated with the timed-out call :-(

    I know that the solution that I propose is not perfect, but at least we can keep 63 parallel calls. I thought to use an UUID per method call, to identified it absolutly, but it would be slower than this solution.

    What do you think? Do I forget something? Am I doing something wrong?

    opened by chechu 5
  • Is this library mantained anymore?

    Is this library mantained anymore?

    If the answer is yes I would like to see these jobs done:

    _ Update this library to the latest kryo _ remove logger dependency and let it depends only from SLF4j. _ implement a TLS secure layer over TCP

    Thanks in advance for any answer you can give. Andrea.

    opened by patton73 1
  • Sending classes that dont exist on the server but exist on all clients

    Sending classes that dont exist on the server but exist on all clients

    Hello, is it possible to send classes that dont exist on the server but exist only on the clients?

    For my use case, the server does not need to convert the received java.lang.Object to the corresponding class, that would be impossible since the server has no knowledge of the class type, however, all other clients connected to the server have that class and would be able to serialize it to the corresponding class type. Is there any way I can just receive the java.lang.Object on the server and then just send it to the clients and have the clients do the conversion? I've tried it but I get a KryoException: Unable to find class <classs name> error on the server.

    opened by newk5 0
  • [kryonet] Connection 2 disconnected.

    [kryonet] Connection 2 disconnected.

    Hello, I have no idea what kryonet is, I only have one server in server.pro, I use Magma and I am on my server normally without errors but when any player joins, it kick all, and this is what appears in console:

    [INFO] []: 10:05 INFO: [kryonet] Connection 2 disconnected.

    I don't know what to do, according to what I understand, kryonet is a way to start a server with javascript? and what can be fixed by modifying something? but since my server is server.pro I don't know how to modify it or what to do

    opened by DeusVitale 1
  • Error during deserialization

    Error during deserialization

    I have a minecraft server 1.12.2 with Java8 an It sends this error and then it crashes and close the server. I don´t know how to fix it, could you help me please.

    [13:15:20] [Server/INFO] [STDOUT]: [com.esotericsoftware.minlog.Log$Logger:print:231]: 16:49 WARN: [kryonet] Error reading UDP from unregistered address: /162.55.232.105:40239 com.esotericsoftware.kryonet.KryoNetException: Error during deserialization. at com.esotericsoftware.kryonet.UdpConnection.readObject(UdpConnection.java:89) at com.esotericsoftware.kryonet.Server.update(Server.java:281) at com.esotericsoftware.kryonet.Server.run(Server.java:372) at java.lang.Thread.run(Thread.java:748) Caused by: com.esotericsoftware.kryo.KryoException: Unable to find class: | at com.esotericsoftware.kryo.util.DefaultClassResolver.readName(DefaultClassResolver.java:138) at com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:115) at com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:641) at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:752) at com.esotericsoftware.kryonet.KryoSerialization.read(KryoSerialization.java:55) at com.esotericsoftware.kryonet.UdpConnection.readObject(UdpConnection.java:83) ... 3 more Caused by: java.lang.ClassNotFoundException: | at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at com.esotericsoftware.kryo.util.DefaultClassResolver.readName(DefaultClassResolver.java:136) ... 8 more Caused by: java.lang.NullPointerException

    opened by eli-psis 1
  • server.update(int timeout)  returning after incorrect timeout.

    server.update(int timeout) returning after incorrect timeout.

    There's a "bug" whereby the server.update() method might take longer to return than specified.

    E.g. a call of server.update(10) may take 25ms to return.

    This issue is caused because of the way in which a workaround has been implemented for an issue with NIO.

    The fix is very straight-forward:

    Replace this code, in Server.java:

    // NIO freaks and returns immediately with 0 sometimes, so try to keep from hogging the CPU. long elapsedTime = System.currentTimeMillis() - startTime; try { if (elapsedTime < 25) Thread.sleep(25 - elapsedTime); } catch (InterruptedException ex) { }

    with :

    // NIO freaks and returns immediately with 0 sometimes, so try to keep from hogging the CPU. long elapsedTime = System.currentTimeMillis() - startTime; try { int targetDuration = Math.min(timeout,25); if (elapsedTime < targetDuration) Thread.sleep(targetDuration - elapsedTime); } catch (InterruptedException ex) { }

    This ensures that, even if NIO "freaks out", we:

    1. Still avoid hogging the CPU
    2. BUT also avoid sleeping longer than the specified timeout

    I have built and tested this locally, and it works, but not sure how to go about submitting it.

    opened by ent-moot 0
  • Unable to read object larger than read buffer: 1195725856

    Unable to read object larger than read buffer: 1195725856

    Hi, checking my server's logs, I see a lot of exceptions of this type:

    com.esotericsoftware.kryonet.KryoNetException: Unable to read object larger than read buffer: 1195725856 at com.esotericsoftware.kryonet.TcpConnection.readObject(TcpConnection.java:118) at com.esotericsoftware.kryonet.Server.update(Server.java:198) at com.betalord.sgx.network.ServerProcessor.run(ServerProcessor.java:90) at java.base/java.lang.Thread.run(Thread.java:834)

    Now I use default constructor for server and for client, so the object buffer size is 2048 (default). I don't think I send any big objects over the network, they shouldn't be bigger than 1 KB I believe (but could be wrong). However, 1 GB as in given example is just absurd, so there must be some kind of a bug in kryonet that's causing it. From the logs I see I get different values, for example:

    369295616 1195725856 369295616 50331695 1195725856 369295616 1431520594 50331695 50331686 1195725856 50331695 50331695 50331695 1212498244 1195725856 and so on.

    Any idea on what is going on?

    opened by Betalord 1
Releases(kryonet-2.21)
Owner
Esoteric Software
Esoteric Software
Efficient reliable UDP unicast, UDP multicast, and IPC message transport

Aeron Efficient reliable UDP unicast, UDP multicast, and IPC message transport. Java and C++ clients are available in this repository, and a .NET clie

Real Logic 6.3k Dec 27, 2022
Efficient reliable UDP unicast, UDP multicast, and IPC message transport

Aeron Efficient reliable UDP unicast, UDP multicast, and IPC message transport. Java and C++ clients are available in this repository, and a .NET clie

Real Logic 6.3k Jan 9, 2023
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
FileServer - A multithreaded client-server program that uses Java Sockets to establish TCP/IP connection

A multithreaded client-server program that uses Java Sockets to establish TCP/IP connection. The server allows multiple clients to upload, retrieve and delete files on/from the server.

Lokesh Bisht 3 Nov 13, 2022
A High Performance Network ( TCP/IP ) Library

Chronicle-Network About A High Performance Network library Purpose This library is designed to be lower latency and support higher throughputs by empl

Chronicle Software : Open Source 231 Dec 31, 2022
TCP/IP packet demultiplexer. Download from:

TCPFLOW 1.5.0 Downloads directory: http://digitalcorpora.org/downloads/tcpflow/ Installation Most common GNU/Linux distributions ship tcpflow in their

Simson L. Garfinkel 1.5k Jan 4, 2023
RSocket is a binary protocol for use on byte stream transports such as TCP, WebSockets, and Aeron

RSocket RSocket is a binary protocol for use on byte stream transports such as TCP, WebSockets, and Aeron. It enables the following symmetric interact

RSocket 2.2k Dec 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
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
Book Finder application is a client-server application (gRPC) for educational purposes.

Book-Finder Book Finder application is a client-server application (gRPC) for educational purposes. Instalation These projects (Client/Server) are Mav

Mihai-Lucian Rîtan 21 Oct 27, 2022
Realtime Client Server Framework for the JVM, supporting WebSockets with Cross-Browser Fallbacks

Welcome to Atmosphere: The Event Driven Framework supporting WebSocket and HTTP The Atmosphere Framework contains client and server side components fo

Atmosphere Framework 3.6k Jan 3, 2023
A Java event based WebSocket and HTTP server

Webbit - A Java event based WebSocket and HTTP server Getting it Prebuilt JARs are available from the central Maven repository or the Sonatype Maven r

null 808 Dec 23, 2022
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
Full-featured Socket.IO Client Library for Java, which is compatible with Socket.IO v1.0 and later.

Socket.IO-client Java This is the Socket.IO Client Library for Java, which is simply ported from the JavaScript client. See also: Android chat demo en

Socket.IO 5k Jan 4, 2023
Asynchronous Http and WebSocket Client library for Java

Async Http Client Follow @AsyncHttpClient on Twitter. The AsyncHttpClient (AHC) library allows Java applications to easily execute HTTP requests and a

AsyncHttpClient 6k Dec 31, 2022
Telegram API Client and Telegram BOT API Library and Framework in Pure java.

Javagram Telegram API Client and Telegram Bot API library and framework in pure Java. Hello Telegram You can use Javagram for both Telegram API Client

Java For Everything 3 Oct 17, 2021
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
An netty based asynchronous socket library for benchion java applications

Benchion Sockets Library An netty based asynchronous socket library for benchion java applications ?? Documents ?? Report Bug · Request Feature Conten

Fitchle 3 Dec 25, 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