84 lines
2.2 KiB
Markdown
84 lines
2.2 KiB
Markdown
# Sew'y [səʊi]
|
|
|
|
## What is it?
|
|
|
|
The lightweight network library providing client-server communications that could be described with commands.
|
|
|
|
## Why another network library?
|
|
|
|
1. other protocol-based network libraries are old (in e. [kryonet](https://github.com/EsotericSoftware/kryonet))
|
|
2. or they are heavy and very overloaded
|
|
|
|
## How to use?
|
|
|
|
### Simple ECHO server
|
|
|
|
1. Describe ECHOed client listener
|
|
|
|
https://github.com/bvn13/sewy/blob/380dd5f8b0757791f583852c1e1516c9470baf42/src/test/java/me/bvn13/sewy/EchoClientListener.java#L24-L40
|
|
|
|
2. Create Server
|
|
|
|
```java
|
|
new Server("192.168.0.153", port, EchoClientListener.class);
|
|
|
|
```
|
|
|
|
3. Create Client to communicate with server
|
|
|
|
```java
|
|
Client<SimpleClientListener> client = new Client<>("192.168.0.153", port, SimpleClientListener.class);
|
|
```
|
|
|
|
4. Send raw data and read the response
|
|
|
|
```java
|
|
client.writeLine("hello");
|
|
String response1 = client.readLine();
|
|
Assertions.assertEquals("hello", response1);
|
|
```
|
|
|
|
### Command-based client listener
|
|
|
|
1. Implement commands inheriting from `AbstractCommand`
|
|
2. Register all commands as white listed
|
|
|
|
```java
|
|
Sewy.register(PingCommand.class);
|
|
Sewy.register(PongCommand.class);
|
|
```
|
|
|
|
3. Start server with `CommandClientListener` implementing response creation logic
|
|
|
|
```java
|
|
CommandServer server = new CommandServer("localhost", port, (socket) -> new CommandClientListener(socket) {
|
|
@Override
|
|
public AbstractCommand onCommand(AbstractCommand command) {
|
|
if (command instanceof PingCommand) {
|
|
return new PongCommand((PingCommand) command);
|
|
}
|
|
throw new IllegalArgumentException(command.toString());
|
|
}
|
|
});
|
|
```
|
|
|
|
4. Start client to send commands to server
|
|
|
|
```java
|
|
AtomicLong latency = new AtomicLong(0);
|
|
CommandClient client = new CommandClient("localhost", port, (socket) -> new CommandClientListener(socket) {
|
|
@Override
|
|
public AbstractCommand onCommand(AbstractCommand command) {
|
|
if (command instanceof PongCommand) {
|
|
latency.set(((PongCommand)command).getLatency());
|
|
return null;
|
|
} else {
|
|
throw new IllegalArgumentException(command.toString());
|
|
}
|
|
}
|
|
});
|
|
client.send(new PingCommand());
|
|
Thread.sleep(1000);
|
|
Assertions.assertTrue(latency.get() > 0);
|
|
|
|
``` |