Skip to content

Commit 8c45cc0

Browse files
committed
实现一个基于nio的echo服务器
1 parent 1e09c91 commit 8c45cc0

2 files changed

Lines changed: 94 additions & 0 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package nio.myself;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.net.InetSocketAddress;
7+
import java.nio.ByteBuffer;
8+
import java.nio.channels.SocketChannel;
9+
10+
/**
11+
* Created by szh on 2017/5/4.
12+
*/
13+
public class MyClient {
14+
private void startClient() throws IOException {
15+
SocketChannel socketChannel = SocketChannel.open();
16+
socketChannel.connect(new InetSocketAddress("127.0.0.1", 9002));
17+
ByteBuffer bytebuffer = ByteBuffer.allocateDirect(1024);
18+
// String message = "测试";
19+
BufferedReader br = new BufferedReader(new
20+
InputStreamReader(System.in));
21+
// try {
22+
while (true) {
23+
24+
String message = br.readLine();
25+
26+
for (int i = 0; i < message.length(); i++) {
27+
bytebuffer.put((byte) message.charAt(i));
28+
}
29+
bytebuffer.flip();
30+
31+
while (bytebuffer.hasRemaining()) {
32+
socketChannel.write(bytebuffer);
33+
}
34+
35+
bytebuffer.clear();
36+
socketChannel.read(bytebuffer);
37+
bytebuffer.flip();
38+
while (bytebuffer.hasRemaining()){
39+
System.out.print((char)bytebuffer.get()); // System.out.print 不会导致换行
40+
}
41+
System.out.println();
42+
bytebuffer.clear();
43+
}
44+
}
45+
public static void main(String args[]) throws IOException {
46+
new MyClient().startClient();
47+
}
48+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package nio.myself;
2+
3+
import java.io.IOException;
4+
import java.net.InetSocketAddress;
5+
import java.nio.ByteBuffer;
6+
import java.nio.channels.SelectionKey;
7+
import java.nio.channels.Selector;
8+
import java.nio.channels.ServerSocketChannel;
9+
import java.nio.channels.SocketChannel;
10+
import java.util.Set;
11+
12+
/**
13+
* Created by szh on 2017/5/3.
14+
*/
15+
public class MyServer {
16+
public void startServer() throws IOException {
17+
ServerSocketChannel serverSocketChannel= ServerSocketChannel.open();
18+
serverSocketChannel.bind(new InetSocketAddress(9002));
19+
Selector selector =Selector.open(); // 打开选择器
20+
serverSocketChannel.configureBlocking(false);
21+
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 将新进来的通道注册到选择器当中
22+
while (true){
23+
selector.select();
24+
Set<SelectionKey> selectionKeys =selector.selectedKeys();
25+
for(SelectionKey selectionKey : selectionKeys){
26+
if(selectionKey.isAcceptable()){
27+
ServerSocketChannel ssc = (ServerSocketChannel) selectionKey.channel();
28+
SocketChannel socketChannel =ssc.accept(); // 返回SocketChannel ,非阻塞模式下会立即返回
29+
socketChannel.configureBlocking(false); // 非阻塞IO
30+
socketChannel.register(selector,selectionKey.OP_READ);
31+
}else if(selectionKey.isReadable()){
32+
SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
33+
ByteBuffer byteBuffer =ByteBuffer.allocate(1024);
34+
socketChannel.read(byteBuffer);
35+
byteBuffer.flip();
36+
socketChannel.write(byteBuffer);
37+
}
38+
}
39+
selectionKeys.clear();
40+
}
41+
}
42+
public static void main(String args[]) throws IOException {
43+
new MyServer().startServer();
44+
}
45+
46+
}

0 commit comments

Comments
 (0)