Skip to content

Commit f9dfd56

Browse files
committed
Server updated to have a single Server class which instantiates all the server components and can start the 2 server threads.
1 parent 976ecb6 commit f9dfd56

File tree

9 files changed

+96
-56
lines changed

9 files changed

+96
-56
lines changed

src/main/java/com/jenkov/nioserver/IMessageReader.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
*/
1010
public interface IMessageReader {
1111

12+
public void init(MessageBuffer readMessageBuffer);
13+
1214
public void read(Socket socket, ByteBuffer byteBuffer) throws IOException;
1315

1416
public List<Message> getMessages();

src/main/java/com/jenkov/nioserver/IMessageReaderFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
public interface IMessageReaderFactory {
77

88
public IMessageReader createMessageReader();
9+
910
}
Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,46 @@
11
package com.jenkov.nioserver;
22

33
import java.io.IOException;
4-
import java.net.InetSocketAddress;
5-
import java.net.ServerSocket;
6-
import java.nio.channels.ServerSocketChannel;
7-
import java.nio.channels.SocketChannel;
84
import java.util.Queue;
5+
import java.util.concurrent.ArrayBlockingQueue;
6+
import java.util.concurrent.BlockingQueue;
97

108
/**
11-
* Created by jjenkov on 19-10-2015.
9+
* Created by jjenkov on 24-10-2015.
1210
*/
13-
public class Server implements Runnable{
11+
public class Server {
1412

15-
private int tcpPort = 0;
16-
private ServerSocketChannel serverSocket = null;
13+
private SocketAccepter socketAccepter = null;
14+
private SocketProcessor socketProcessor = null;
1715

18-
private Queue socketQueue = null;
16+
private int tcpPort = 0;
17+
private IMessageReaderFactory messageReaderFactory = null;
18+
private IMessageProcessor messageProcessor = null;
1919

20-
public Server(int tcpPort, Queue socketQueue) {
21-
this.tcpPort = tcpPort;
22-
this.socketQueue = socketQueue;
20+
public Server(int tcpPort, IMessageReaderFactory messageReaderFactory, IMessageProcessor messageProcessor) {
21+
this.tcpPort = tcpPort;
22+
this.messageReaderFactory = messageReaderFactory;
23+
this.messageProcessor = messageProcessor;
2324
}
2425

26+
public void start() throws IOException {
2527

28+
Queue socketQueue = new ArrayBlockingQueue(1024); //move 1024 to ServerConfig
2629

27-
public void run() {
28-
try{
29-
this.serverSocket = ServerSocketChannel.open();
30-
this.serverSocket.bind(new InetSocketAddress(tcpPort));
31-
} catch(IOException e){
32-
e.printStackTrace();
33-
return;
34-
}
35-
30+
this.socketAccepter = new SocketAccepter(tcpPort, socketQueue);
3631

37-
while(true){
38-
try{
39-
SocketChannel socketChannel = this.serverSocket.accept();
4032

41-
System.out.println("Socket accepted");
33+
MessageBuffer readBuffer = new MessageBuffer();
34+
MessageBuffer writeBuffer = new MessageBuffer();
4235

43-
//todo check if the queue can even accept more sockets.
44-
this.socketQueue.add(new Socket(socketChannel));
36+
this.socketProcessor = new SocketProcessor(socketQueue, readBuffer, writeBuffer, this.messageReaderFactory, this.messageProcessor);
4537

38+
Thread accepterThread = new Thread(this.socketAccepter);
39+
Thread processorThread = new Thread(this.socketProcessor);
4640

47-
} catch(IOException e){
48-
e.printStackTrace();
49-
}
41+
accepterThread.start();
42+
processorThread.start();
43+
}
5044

51-
}
5245

53-
}
5446
}

src/main/java/com/jenkov/nioserver/Socket.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public class Socket {
1717

1818
public boolean endOfStreamReached = false;
1919

20-
2120
public Socket() {
2221
}
2322

@@ -40,7 +39,6 @@ public int read(ByteBuffer byteBuffer) throws IOException {
4039
return totalBytesRead;
4140
}
4241

43-
4442
public int write(ByteBuffer byteBuffer) throws IOException{
4543
int bytesWritten = this.socketChannel.write(byteBuffer);
4644
int totalBytesWritten = bytesWritten;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.jenkov.nioserver;
2+
3+
import java.io.IOException;
4+
import java.net.InetSocketAddress;
5+
import java.net.ServerSocket;
6+
import java.nio.channels.ServerSocketChannel;
7+
import java.nio.channels.SocketChannel;
8+
import java.util.Queue;
9+
10+
/**
11+
* Created by jjenkov on 19-10-2015.
12+
*/
13+
public class SocketAccepter implements Runnable{
14+
15+
private int tcpPort = 0;
16+
private ServerSocketChannel serverSocket = null;
17+
18+
private Queue socketQueue = null;
19+
20+
public SocketAccepter(int tcpPort, Queue socketQueue) {
21+
this.tcpPort = tcpPort;
22+
this.socketQueue = socketQueue;
23+
}
24+
25+
26+
27+
public void run() {
28+
try{
29+
this.serverSocket = ServerSocketChannel.open();
30+
this.serverSocket.bind(new InetSocketAddress(tcpPort));
31+
} catch(IOException e){
32+
e.printStackTrace();
33+
return;
34+
}
35+
36+
37+
while(true){
38+
try{
39+
SocketChannel socketChannel = this.serverSocket.accept();
40+
41+
System.out.println("Socket accepted: " + socketChannel);
42+
43+
//todo check if the queue can even accept more sockets.
44+
this.socketQueue.add(new Socket(socketChannel));
45+
46+
} catch(IOException e){
47+
e.printStackTrace();
48+
}
49+
50+
}
51+
52+
}
53+
}

src/main/java/com/jenkov/nioserver/ServerCore.java renamed to src/main/java/com/jenkov/nioserver/SocketProcessor.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
/**
1111
* Created by jjenkov on 16-10-2015.
1212
*/
13-
public class ServerCore implements Runnable {
13+
public class SocketProcessor implements Runnable {
1414

1515
private Queue<Socket> inboundSocketQueue = null;
1616

@@ -37,7 +37,7 @@ public class ServerCore implements Runnable {
3737
private Set<Socket> nonEmptyToEmptySockets = new HashSet<>();
3838

3939

40-
public ServerCore(Queue<Socket> inboundSocketQueue, MessageBuffer readMessageBuffer, MessageBuffer writeMessageBuffer, IMessageReaderFactory messageReaderFactory, IMessageProcessor messageProcessor) throws IOException {
40+
public SocketProcessor(Queue<Socket> inboundSocketQueue, MessageBuffer readMessageBuffer, MessageBuffer writeMessageBuffer, IMessageReaderFactory messageReaderFactory, IMessageProcessor messageProcessor) throws IOException {
4141
this.inboundSocketQueue = inboundSocketQueue;
4242

4343
this.readMessageBuffer = readMessageBuffer;
@@ -84,6 +84,8 @@ public void takeNewSockets() throws IOException {
8484
newSocket.socketChannel.configureBlocking(false);
8585

8686
newSocket.messageReader = this.messageReaderFactory.createMessageReader();
87+
newSocket.messageReader.init(this.readMessageBuffer);
88+
8789
newSocket.messageWriter = new MessageWriter();
8890

8991
this.socketMap.put(newSocket.socketId, newSocket);

src/main/java/com/jenkov/nioserver/example/Main.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,6 @@
1313
public class Main {
1414

1515
public static void main(String[] args) throws IOException {
16-
BlockingQueue inboundSocketQueue = new ArrayBlockingQueue(1024);
17-
18-
Server server = new Server(9999, inboundSocketQueue);
19-
20-
Thread serverThread = new Thread(server);
21-
serverThread.start();
22-
23-
MessageBuffer readMessageBuffer = new MessageBuffer();
24-
MessageBuffer writeMessageBuffer = new MessageBuffer();
25-
IMessageReaderFactory messageReaderFactory = new HttpMessageReaderFactory(readMessageBuffer);
2616

2717
String httpResponse = "HTTP/1.1 200 OK\r\n" +
2818
"Content-Length: 38\r\n" +
@@ -42,9 +32,10 @@ public static void main(String[] args) throws IOException {
4232
writeProxy.enqueue(response);
4333
};
4434

45-
ServerCore serverCore = new ServerCore(inboundSocketQueue, readMessageBuffer, writeMessageBuffer, messageReaderFactory, messageProcessor);
46-
Thread serverCoreThread = new Thread(serverCore);
47-
serverCoreThread.start();
35+
Server server = new Server(9999, new HttpMessageReaderFactory(), messageProcessor);
36+
37+
server.start();
38+
4839
}
4940

5041

src/main/java/com/jenkov/nioserver/http/HttpMessageReader.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,12 @@ public class HttpMessageReader implements IMessageReader {
2020
private List<Message> completeMessages = new ArrayList<Message>();
2121
private Message nextMessage = null;
2222

23-
public HttpMessageReader(MessageBuffer messageBuffer) {
24-
this.messageBuffer = messageBuffer;
23+
public HttpMessageReader() {
24+
}
25+
26+
@Override
27+
public void init(MessageBuffer readMessageBuffer) {
28+
this.messageBuffer = readMessageBuffer;
2529
this.nextMessage = messageBuffer.getMessage();
2630
this.nextMessage.metaData = new HttpHeaders();
2731
}

src/main/java/com/jenkov/nioserver/http/HttpMessageReaderFactory.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,11 @@
99
*/
1010
public class HttpMessageReaderFactory implements IMessageReaderFactory {
1111

12-
private MessageBuffer messageBuffer = null;
13-
14-
public HttpMessageReaderFactory(MessageBuffer messageBuffer) {
15-
this.messageBuffer = messageBuffer;
12+
public HttpMessageReaderFactory() {
1613
}
1714

1815
@Override
1916
public IMessageReader createMessageReader() {
20-
return new HttpMessageReader(this.messageBuffer);
17+
return new HttpMessageReader();
2118
}
2219
}

0 commit comments

Comments
 (0)