-
Notifications
You must be signed in to change notification settings - Fork 62
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
170 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
## 由来 | ||
|
||
在JDK7+后,提供了异步Socket库——AIO,Hutool对其进行了简单的封装。 | ||
|
||
## 使用 | ||
|
||
### 服务端 | ||
|
||
```java | ||
AioServer aioServer = new AioServer(8899); | ||
aioServer.setIoAction(new SimpleIoAction() { | ||
|
||
@Override | ||
public void accept(AioSession session) { | ||
StaticLog.debug("【客户端】:{} 连接。", session.getRemoteAddress()); | ||
session.write(BufferUtil.createUtf8("=== Welcome to Hutool socket server. ===")); | ||
} | ||
|
||
@Override | ||
public void doAction(AioSession session, ByteBuffer data) { | ||
Console.log(data); | ||
|
||
if(false == data.hasRemaining()) { | ||
StringBuilder response = StrUtil.builder()// | ||
.append("HTTP/1.1 200 OK\r\n")// | ||
.append("Date: ").append(DateUtil.formatHttpDate(DateUtil.date())).append("\r\n")// | ||
.append("Content-Type: text/html; charset=UTF-8\r\n")// | ||
.append("\r\n") | ||
.append("Hello Hutool socket");// | ||
session.writeAndClose(BufferUtil.createUtf8(response)); | ||
}else { | ||
session.read(); | ||
} | ||
} | ||
}).start(true); | ||
``` | ||
|
||
### 客户端 | ||
|
||
```java | ||
AioClient client = new AioClient(new InetSocketAddress("localhost", 8899), new SimpleIoAction() { | ||
|
||
@Override | ||
public void doAction(AioSession session, ByteBuffer data) { | ||
if(data.hasRemaining()) { | ||
Console.log(StrUtil.utf8Str(data)); | ||
session.read(); | ||
} | ||
Console.log("OK"); | ||
} | ||
}); | ||
|
||
client.write(ByteBuffer.wrap("Hello".getBytes())); | ||
client.read(); | ||
|
||
client.close(); | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
## 由来 | ||
|
||
Hutool对NIO其进行了简单的封装。 | ||
|
||
## 使用 | ||
|
||
### 服务端 | ||
|
||
```java | ||
NioServer server = new NioServer(8080); | ||
server.setChannelHandler((sc)->{ | ||
ByteBuffer readBuffer = ByteBuffer.allocate(1024); | ||
try{ | ||
//从channel读数据到缓冲区 | ||
int readBytes = sc.read(readBuffer); | ||
if (readBytes > 0) { | ||
//Flips this buffer. The limit is set to the current position and then | ||
// the position is set to zero,就是表示要从起始位置开始读取数据 | ||
readBuffer.flip(); | ||
//eturns the number of elements between the current position and the limit. | ||
// 要读取的字节长度 | ||
byte[] bytes = new byte[readBuffer.remaining()]; | ||
//将缓冲区的数据读到bytes数组 | ||
readBuffer.get(bytes); | ||
String body = StrUtil.utf8Str(bytes); | ||
Console.log("[{}]: {}", sc.getRemoteAddress(), body); | ||
doWrite(sc, body); | ||
} else if (readBytes < 0) { | ||
IoUtil.close(sc); | ||
} | ||
} catch (IOException e){ | ||
throw new IORuntimeException(e); | ||
} | ||
}); | ||
server.listen(); | ||
``` | ||
|
||
```java | ||
public static void doWrite(SocketChannel channel, String response) throws IOException { | ||
response = "收到消息:" + response; | ||
//将缓冲数据写入渠道,返回给客户端 | ||
channel.write(BufferUtil.createUtf8(response)); | ||
} | ||
``` | ||
|
||
### 客户端 | ||
|
||
```java | ||
NioClient client = new NioClient("127.0.0.1", 8080); | ||
client.setChannelHandler((sc)->{ | ||
ByteBuffer readBuffer = ByteBuffer.allocate(1024); | ||
//从channel读数据到缓冲区 | ||
int readBytes = sc.read(readBuffer); | ||
if (readBytes > 0) { | ||
//Flips this buffer. The limit is set to the current position and then | ||
// the position is set to zero,就是表示要从起始位置开始读取数据 | ||
readBuffer.flip(); | ||
//returns the number of elements between the current position and the limit. | ||
// 要读取的字节长度 | ||
byte[] bytes = new byte[readBuffer.remaining()]; | ||
//将缓冲区的数据读到bytes数组 | ||
readBuffer.get(bytes); | ||
String body = StrUtil.utf8Str(bytes); | ||
Console.log("[{}]: {}", sc.getRemoteAddress(), body); | ||
} else if (readBytes < 0) { | ||
sc.close(); | ||
} | ||
}); | ||
client.listen(); | ||
client.write(BufferUtil.createUtf8("你好。\n")); | ||
client.write(BufferUtil.createUtf8("你好2。")); | ||
// 在控制台向服务器端发送数据 | ||
Console.log("请输入发送的消息:"); | ||
Scanner scanner = new Scanner(System.in); | ||
while (scanner.hasNextLine()) { | ||
String request = scanner.nextLine(); | ||
if (request != null && request.trim().length() > 0) { | ||
client.write(BufferUtil.createUtf8(request)); | ||
} | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
## 模块介绍 | ||
|
||
### Socket介绍 | ||
|
||
介绍来自:https://www.liaoxuefeng.com/wiki/1252599548343744/1305207629676577 | ||
|
||
在开发网络应用程序的时候,我们又会遇到Socket这个概念。Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络: | ||
|
||
### Hutool封装 | ||
|
||
JDK中提供了Socket功能,包括: | ||
|
||
- BIO | ||
- NIO | ||
- AIO | ||
|
||
Hutool只针对NIO和AIO做了简单的封装,用于简化Socket异步开发。 | ||
|
||
> 现阶段,Hutool的socket封装依旧不是一个完整框架或者高效的工具类,不能提供完整的高性能IO功能,因此推荐更加专业的Socket库。例如: | ||
> [t-io](https://www.t-io.org/) | ||
> [Voovan](http://www.voovan.org/) | ||
> [Netty](https://netty.io/) | ||
> [Mina](http://mina.apache.org/) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters