-
Notifications
You must be signed in to change notification settings - Fork 558
/
NettyUDPServer.java
147 lines (125 loc) · 3.53 KB
/
NettyUDPServer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package org.menacheri.jetserver.server.netty;
import java.net.InetSocketAddress;
import java.util.Arrays;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.Bootstrap;
import org.jboss.netty.bootstrap.ConnectionlessBootstrap;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelException;
import org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory;
import org.jboss.netty.channel.socket.nio.NioDatagramChannelFactory;
import org.menacheri.jetserver.concurrent.NamedThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This server does UDP connection less broadcast. Since it does not store the
* connection, each call to a channel write must also contain the remote socket
* address <code>e.getChannel().write("Message", e.getRemoteAddress())</code>.
* Since it uses the same channel for all incoming connections, the handlers
* cannot be modified refer to <a
* href="http://www.jboss.org/netty/community.html#nabble-f685700">nabble
* post</a>
*
* @author Abraham Menacherry
*
*/
public class NettyUDPServer extends AbstractNettyServer
{
private static final Logger LOG = LoggerFactory.getLogger(NettyUDPServer.class);
private FixedReceiveBufferSizePredictorFactory bufferSizePredictor;
private String[] args;
/**
* The connected channel for this server. This reference can be used to
* shutdown this server.
*/
private Channel channel;
public NettyUDPServer()
{
}
@Override
public void startServer(int port) throws Exception
{
portNumber = port;
startServer(args);
}
@Override
public void startServer() throws Exception
{
startServer(args);
}
public void startServer(String[] args) throws Exception
{
int portNumber = getPortNumber(args);
InetSocketAddress socketAddress = new InetSocketAddress(portNumber);
startServer(socketAddress);
}
@Override
public Bootstrap createServerBootstrap()
{
serverBootstrap = new ConnectionlessBootstrap(
new NioDatagramChannelFactory(Executors
.newCachedThreadPool(new NamedThreadFactory(
"UDP-Server-Worker"))));
return serverBootstrap;
}
@Override
public void stopServer() throws Exception
{
if(null != channel)
{
channel.close();
}
super.stopServer();
}
public FixedReceiveBufferSizePredictorFactory getBufferSizePredictor()
{
return bufferSizePredictor;
}
public void setBufferSizePredictor(
FixedReceiveBufferSizePredictorFactory bufferSizePredictor)
{
this.bufferSizePredictor = bufferSizePredictor;
}
@Override
public TransmissionProtocol getTransmissionProtocol()
{
return TRANSMISSION_PROTOCOL.UDP;
}
@Override
public void startServer(InetSocketAddress socketAddress)
{
this.socketAddress = socketAddress;
//TODO these should be set from spring
serverBootstrap.setOption("broadcast", "false");
serverBootstrap.setOption("receiveBufferSizePredictorFactory",
bufferSizePredictor);
serverBootstrap.setOption("sendBufferSize", 65536);
serverBootstrap.setOption("receiveBufferSize", 65536);
configureServerBootStrap(args);
try
{
channel = ((ConnectionlessBootstrap) serverBootstrap)
.bind(socketAddress);
}
catch (ChannelException e)
{
LOG.error("Unable to start UDP server due to error {}",e);
throw e;
}
}
public String[] getArgs()
{
return args;
}
public void setArgs(String[] args)
{
this.args = args;
}
@Override
public String toString()
{
return "NettyUDPServer [args=" + Arrays.toString(args)
+ ", socketAddress=" + socketAddress + ", portNumber=" + portNumber
+ "]";
}
}