1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.transport.socket.nio;
21
22 import java.net.InetSocketAddress;
23 import java.net.Socket;
24 import java.net.SocketException;
25 import java.nio.channels.SelectionKey;
26 import java.nio.channels.SocketChannel;
27
28 import org.apache.mina.core.RuntimeIoException;
29 import org.apache.mina.core.buffer.IoBuffer;
30 import org.apache.mina.core.file.FileRegion;
31 import org.apache.mina.core.filterchain.DefaultIoFilterChain;
32 import org.apache.mina.core.filterchain.IoFilterChain;
33 import org.apache.mina.core.service.DefaultTransportMetadata;
34 import org.apache.mina.core.service.IoHandler;
35 import org.apache.mina.core.service.IoProcessor;
36 import org.apache.mina.core.service.IoService;
37 import org.apache.mina.core.service.TransportMetadata;
38 import org.apache.mina.core.session.IoSession;
39 import org.apache.mina.transport.socket.AbstractSocketSessionConfig;
40 import org.apache.mina.transport.socket.SocketSessionConfig;
41
42
43
44
45
46
47 class NioSocketSession extends NioSession {
48
49 static final TransportMetadata METADATA =
50 new DefaultTransportMetadata(
51 "nio", "socket", false, true,
52 InetSocketAddress.class,
53 SocketSessionConfig.class,
54 IoBuffer.class, FileRegion.class);
55
56 private final IoService service;
57
58 private final SocketSessionConfig config = new SessionConfigImpl();
59
60 private final IoProcessor<NioSession> processor;
61
62 private final IoFilterChain filterChain = new DefaultIoFilterChain(this);
63
64 private final SocketChannel ch;
65
66 private final IoHandler handler;
67
68 private SelectionKey key;
69
70
71
72
73
74
75
76
77
78
79 public NioSocketSession(IoService service, IoProcessor<NioSession> processor, SocketChannel ch) {
80 this.service = service;
81 this.processor = processor;
82 this.ch = ch;
83 this.handler = service.getHandler();
84 this.config.setAll(service.getSessionConfig());
85 }
86
87 public IoService getService() {
88 return service;
89 }
90
91 public SocketSessionConfig getConfig() {
92 return config;
93 }
94
95 @Override
96 public IoProcessor<NioSession> getProcessor() {
97 return processor;
98 }
99
100 public IoFilterChain getFilterChain() {
101 return filterChain;
102 }
103
104 public TransportMetadata getTransportMetadata() {
105 return METADATA;
106 }
107
108 @Override
109 SocketChannel getChannel() {
110 return ch;
111 }
112
113 @Override
114 SelectionKey getSelectionKey() {
115 return key;
116 }
117
118 @Override
119 void setSelectionKey(SelectionKey key) {
120 this.key = key;
121 }
122
123 public IoHandler getHandler() {
124 return handler;
125 }
126
127
128
129
130 public InetSocketAddress getRemoteAddress() {
131 if ( ch == null ) {
132 return null;
133 }
134
135 Socket socket = ch.socket();
136
137 if ( socket == null ) {
138 return null;
139 }
140
141 return (InetSocketAddress) socket.getRemoteSocketAddress();
142 }
143
144
145
146
147 public InetSocketAddress getLocalAddress() {
148 if ( ch == null ) {
149 return null;
150 }
151
152 Socket socket = ch.socket();
153
154 if ( socket == null ) {
155 return null;
156 }
157
158 return (InetSocketAddress) socket.getLocalSocketAddress();
159 }
160
161 @Override
162 public InetSocketAddress getServiceAddress() {
163 return (InetSocketAddress) super.getServiceAddress();
164 }
165
166 private class SessionConfigImpl extends AbstractSocketSessionConfig {
167 public boolean isKeepAlive() {
168 try {
169 return ch.socket().getKeepAlive();
170 } catch (SocketException e) {
171 throw new RuntimeIoException(e);
172 }
173 }
174
175 public void setKeepAlive(boolean on) {
176 try {
177 ch.socket().setKeepAlive(on);
178 } catch (SocketException e) {
179 throw new RuntimeIoException(e);
180 }
181 }
182
183 public boolean isOobInline() {
184 try {
185 return ch.socket().getOOBInline();
186 } catch (SocketException e) {
187 throw new RuntimeIoException(e);
188 }
189 }
190
191 public void setOobInline(boolean on) {
192 try {
193 ch.socket().setOOBInline(on);
194 } catch (SocketException e) {
195 throw new RuntimeIoException(e);
196 }
197 }
198
199 public boolean isReuseAddress() {
200 try {
201 return ch.socket().getReuseAddress();
202 } catch (SocketException e) {
203 throw new RuntimeIoException(e);
204 }
205 }
206
207 public void setReuseAddress(boolean on) {
208 try {
209 ch.socket().setReuseAddress(on);
210 } catch (SocketException e) {
211 throw new RuntimeIoException(e);
212 }
213 }
214
215 public int getSoLinger() {
216 try {
217 return ch.socket().getSoLinger();
218 } catch (SocketException e) {
219 throw new RuntimeIoException(e);
220 }
221 }
222
223 public void setSoLinger(int linger) {
224 try {
225 if (linger < 0) {
226 ch.socket().setSoLinger(false, 0);
227 } else {
228 ch.socket().setSoLinger(true, linger);
229 }
230 } catch (SocketException e) {
231 throw new RuntimeIoException(e);
232 }
233 }
234
235 public boolean isTcpNoDelay() {
236 if (!isConnected()) {
237 return false;
238 }
239
240 try {
241 return ch.socket().getTcpNoDelay();
242 } catch (SocketException e) {
243 throw new RuntimeIoException(e);
244 }
245 }
246
247 public void setTcpNoDelay(boolean on) {
248 try {
249 ch.socket().setTcpNoDelay(on);
250 } catch (SocketException e) {
251 throw new RuntimeIoException(e);
252 }
253 }
254
255
256
257
258 public int getTrafficClass() {
259 try {
260 return ch.socket().getTrafficClass();
261 } catch (SocketException e) {
262 throw new RuntimeIoException(e);
263 }
264 }
265
266
267
268
269 public void setTrafficClass(int tc) {
270 try {
271 ch.socket().setTrafficClass(tc);
272 } catch (SocketException e) {
273 throw new RuntimeIoException(e);
274 }
275 }
276
277 public int getSendBufferSize() {
278 try {
279 return ch.socket().getSendBufferSize();
280 } catch (SocketException e) {
281 throw new RuntimeIoException(e);
282 }
283 }
284
285 public void setSendBufferSize(int size) {
286 try {
287 ch.socket().setSendBufferSize(size);
288 } catch (SocketException e) {
289 throw new RuntimeIoException(e);
290 }
291 }
292
293 public int getReceiveBufferSize() {
294 try {
295 return ch.socket().getReceiveBufferSize();
296 } catch (SocketException e) {
297 throw new RuntimeIoException(e);
298 }
299 }
300
301 public void setReceiveBufferSize(int size) {
302 try {
303 ch.socket().setReceiveBufferSize(size);
304 } catch (SocketException e) {
305 throw new RuntimeIoException(e);
306 }
307 }
308 }
309 }