Skip to content

Commit 59b1a69

Browse files
committed
add datagramchannel
1 parent 876c374 commit 59b1a69

9 files changed

Lines changed: 254 additions & 5 deletions

File tree

‎nio/src/main/java/com/zhangjikai/basic/ChannelDemo.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static void testReadFile() {
2424
try (RandomAccessFile randomAccessFile = new RandomAccessFile(filePath, "rw")) {
2525
FileChannel fileChannel = randomAccessFile.getChannel();
2626

27-
ByteBuffer byteBuffer = ByteBuffer.allocate(bufferSize).order(ByteOrder.BIG_ENDIAN);
27+
ByteBuffer byteBuffer = ByteBuffer.allocate(bufferSize);
2828
CharBuffer charBuffer = CharBuffer.allocate(bufferSize);
2929
int byteRead = fileChannel.read(byteBuffer);
3030

‎nio/src/main/java/com/zhangjikai/basic/ChannelTransfer.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import java.io.IOException;
66
import java.io.RandomAccessFile;
7+
import java.nio.ByteBuffer;
78
import java.nio.channels.FileChannel;
89

910
/**
@@ -39,6 +40,8 @@ public static void main(String[] args) {
3940
toChannel.transferFrom(fromChannel, position, count);
4041

4142

43+
44+
4245
} catch (IOException e) {
4346
e.printStackTrace();
4447
}

nio/src/main/java/com/zhangjikai/socket/PipeTest.java renamed to nio/src/main/java/com/zhangjikai/basic/PipeTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.zhangjikai.socket;
1+
package com.zhangjikai.basic;
22

33
import java.io.IOException;
44
import java.nio.ByteBuffer;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.zhangjikai.basic;
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.SocketChannel;
9+
import java.util.Iterator;
10+
import java.util.Set;
11+
12+
/**
13+
* Created by Jikai Zhang on 2017/5/13.
14+
*/
15+
public class SelectorDemo {
16+
17+
18+
public static void main(String[] args) throws IOException {
19+
20+
String host = "localhost";
21+
int port = 1234;
22+
InetSocketAddress address = new InetSocketAddress(host, port);
23+
SocketChannel socketChannel = SocketChannel.open();
24+
socketChannel.configureBlocking(false);
25+
System.out.println("initiating connection");
26+
socketChannel.connect(address);
27+
28+
Selector selector = Selector.open();
29+
socketChannel.register(selector, SelectionKey.OP_CONNECT );
30+
31+
while (true) {
32+
int readChannels = selector.select();
33+
if (readChannels == 0) {
34+
continue;
35+
}
36+
Set<SelectionKey> selectionKeys = selector.selectedKeys();
37+
Iterator<SelectionKey> keyIterator = selectionKeys.iterator();
38+
while (keyIterator.hasNext()) {
39+
SelectionKey key = keyIterator.next();
40+
//System.out.println(key);
41+
if (key.isConnectable()) {
42+
//System.out.println(1111);
43+
socketChannel = (SocketChannel) key.channel();
44+
socketChannel.register(selector, SelectionKey.OP_READ);
45+
46+
47+
} else if(key.isReadable()) {
48+
ByteBuffer byteBuffer = ByteBuffer.allocate(100);
49+
socketChannel.read(byteBuffer);
50+
byteBuffer.flip();
51+
String text = new String(byteBuffer.array()).trim();
52+
System.out.println(text);
53+
}
54+
keyIterator.remove();
55+
}
56+
}
57+
58+
}
59+
}

‎nio/src/main/java/com/zhangjikai/socket/Client.java‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,13 @@ public static void main(String[] args) throws IOException {
2121
System.out.println("do other things...");
2222
}
2323
ByteBuffer buffer = ByteBuffer.allocate(100);
24-
while (socketChannel.read(buffer) >= 0) {
25-
String result = new String(buffer.array()).trim();
26-
System.out.println(result);
24+
int readLen;
25+
while ((readLen = socketChannel.read(buffer)) != -1) {
26+
System.out.println(readLen);
27+
if(readLen != 0) {
28+
String result = new String(buffer.array()).trim();
29+
System.out.println(result);
30+
}
2731
}
2832

2933
System.out.println("connection established");
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.zhangjikai.socket;
2+
3+
import java.io.IOException;
4+
import java.net.InetAddress;
5+
import java.net.InetSocketAddress;
6+
import java.net.UnknownHostException;
7+
import java.nio.ByteBuffer;
8+
import java.nio.channels.DatagramChannel;
9+
import java.util.ArrayList;
10+
import java.util.Arrays;
11+
import java.util.List;
12+
13+
/**
14+
* Created by Jikai Zhang on 2017/5/14.
15+
*/
16+
public class DatagramClient {
17+
18+
static List<String> textList = new ArrayList<>(
19+
Arrays.asList("1111", "2222", "3333", "4444")
20+
);
21+
22+
public static void main(String[] args) throws IOException {
23+
List<String> textList = new ArrayList<>(
24+
Arrays.asList("1111", "2222", "3333", "4444")
25+
);
26+
InetAddress hostIP = InetAddress.getLocalHost();
27+
InetSocketAddress address = new InetSocketAddress(hostIP, 1111);
28+
DatagramChannel datagramChannel = DatagramChannel.open();
29+
datagramChannel.bind(null);
30+
31+
ByteBuffer buffer = ByteBuffer.allocate(64);
32+
for(String text: textList) {
33+
System.out.println("sending msg: " + text);
34+
buffer.put(text.getBytes());
35+
buffer.flip();
36+
datagramChannel.send(buffer, address);
37+
buffer.clear();
38+
}
39+
}
40+
41+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.zhangjikai.socket;
2+
3+
import java.io.IOException;
4+
import java.net.InetSocketAddress;
5+
import java.nio.ByteBuffer;
6+
import java.nio.channels.DatagramChannel;
7+
8+
/**
9+
* Created by Jikai Zhang on 2017/5/14.
10+
*/
11+
public class DatagramServer {
12+
13+
public static void main(String[] args) throws IOException {
14+
DatagramChannel datagramChannel = DatagramChannel.open();
15+
datagramChannel.socket().bind(new InetSocketAddress(1111));
16+
ByteBuffer buffer = ByteBuffer.allocate(64);
17+
18+
while (true) {
19+
20+
datagramChannel.receive(buffer);
21+
buffer.flip();
22+
23+
while (buffer.hasRemaining()) {
24+
System.out.write(buffer.get());
25+
}
26+
System.out.println();
27+
buffer.clear();
28+
}
29+
}
30+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.zhangjikai.socket;
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.SocketChannel;
9+
import java.util.Iterator;
10+
11+
/**
12+
* Created by Jikai Zhang on 2017/5/13.
13+
*/
14+
public class SocketClient {
15+
public static void main(String[] args) throws IOException {
16+
String address = "localhost";
17+
int port = 1234;
18+
SocketChannel channel = SocketChannel.open();
19+
channel.configureBlocking(false);
20+
channel.connect(new InetSocketAddress(address, port));
21+
22+
Selector selector = Selector.open();
23+
channel.register(selector, SelectionKey.OP_CONNECT);
24+
25+
while(true) {
26+
selector.select();
27+
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
28+
while(iterator.hasNext()) {
29+
SelectionKey key = iterator.next();
30+
iterator.remove();
31+
if(key.isConnectable()) {
32+
handle(key, selector);
33+
}
34+
}
35+
}
36+
}
37+
38+
static void handle(SelectionKey key, Selector selector) throws IOException {
39+
SocketChannel client = (SocketChannel) key.channel();
40+
if(client.isConnectionPending()) {
41+
if(client.finishConnect()) {
42+
ByteBuffer byteBuffer = ByteBuffer.allocate(200);
43+
byteBuffer = ByteBuffer.wrap(new String("hello server").getBytes());
44+
client.write(byteBuffer);
45+
client.register(selector, SelectionKey.OP_READ);
46+
}
47+
} else if(key.isReadable()) {
48+
49+
}
50+
51+
}
52+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.zhangjikai.socket;
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.Iterator;
11+
12+
/**
13+
* Created by Jikai Zhang on 2017/5/13.
14+
*/
15+
public class SocketServer {
16+
17+
public static void main(String[] args) throws IOException {
18+
String address = "localhost";
19+
int port = 1234;
20+
ServerSocketChannel channel = ServerSocketChannel.open();
21+
channel.socket().bind(new InetSocketAddress(address, port));
22+
Selector selector = Selector.open();
23+
channel.configureBlocking(false);
24+
channel.register(selector, SelectionKey.OP_ACCEPT);
25+
26+
while (true) {
27+
selector.select();
28+
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
29+
while (iterator.hasNext()) {
30+
SelectionKey key = iterator.next();
31+
iterator.remove();
32+
handleKey(key, selector);
33+
}
34+
}
35+
}
36+
37+
38+
public static void handleKey(SelectionKey key, Selector selector) throws IOException {
39+
ServerSocketChannel server = null;
40+
SocketChannel client = null;
41+
if(key.isAcceptable()) {
42+
System.out.println("Acceptable");
43+
server = (ServerSocketChannel) key.channel();
44+
client = server.accept();
45+
client.configureBlocking(false);
46+
client.register(selector, SelectionKey.OP_READ);
47+
} else if(key.isReadable()) {
48+
client = (SocketChannel) key.channel();
49+
ByteBuffer byteBuffer = ByteBuffer.allocate(200);
50+
int count = client.read(byteBuffer);
51+
if(count > 0) {
52+
System.out.println("Readable");
53+
System.out.println(new String(byteBuffer.array()));
54+
} else if(count == -1) {
55+
key.cancel();
56+
return;
57+
}
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)