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.io.IOException;
23 import java.net.InetSocketAddress;
24 import java.net.SocketAddress;
25 import java.nio.channels.DatagramChannel;
26 import java.util.Collections;
27 import java.util.Iterator;
28 import java.util.concurrent.Executor;
29
30 import org.apache.mina.core.polling.AbstractPollingIoConnector;
31 import org.apache.mina.core.service.IoConnector;
32 import org.apache.mina.core.service.IoProcessor;
33 import org.apache.mina.core.service.SimpleIoProcessorPool;
34 import org.apache.mina.core.service.TransportMetadata;
35 import org.apache.mina.transport.socket.DatagramConnector;
36 import org.apache.mina.transport.socket.DatagramSessionConfig;
37 import org.apache.mina.transport.socket.DefaultDatagramSessionConfig;
38
39
40
41
42
43
44 public final class NioDatagramConnector extends AbstractPollingIoConnector<NioSession, DatagramChannel> implements
45 DatagramConnector {
46
47
48
49
50 public NioDatagramConnector() {
51 super(new DefaultDatagramSessionConfig(), NioProcessor.class);
52 }
53
54
55
56
57
58
59 public NioDatagramConnector(int processorCount) {
60 super(new DefaultDatagramSessionConfig(), NioProcessor.class, processorCount);
61 }
62
63
64
65
66
67
68 public NioDatagramConnector(IoProcessor<NioSession> processor) {
69 super(new DefaultDatagramSessionConfig(), processor);
70 }
71
72
73
74
75
76
77
78
79
80
81
82
83 public NioDatagramConnector(Class<? extends IoProcessor<NioSession>> processorClass, int processorCount) {
84 super(new DefaultDatagramSessionConfig(), processorClass, processorCount);
85 }
86
87
88
89
90
91
92
93
94
95
96
97
98
99 public NioDatagramConnector(Class<? extends IoProcessor<NioSession>> processorClass) {
100 super(new DefaultDatagramSessionConfig(), processorClass);
101 }
102
103 public TransportMetadata getTransportMetadata() {
104 return NioDatagramSession.METADATA;
105 }
106
107 public DatagramSessionConfig getSessionConfig() {
108 return (DatagramSessionConfig) sessionConfig;
109 }
110
111 @Override
112 public InetSocketAddress getDefaultRemoteAddress() {
113 return (InetSocketAddress) super.getDefaultRemoteAddress();
114 }
115
116 public void setDefaultRemoteAddress(InetSocketAddress defaultRemoteAddress) {
117 super.setDefaultRemoteAddress(defaultRemoteAddress);
118 }
119
120 @Override
121 protected void init() throws Exception {
122
123 }
124
125 @Override
126 protected DatagramChannel newHandle(SocketAddress localAddress) throws Exception {
127 DatagramChannel ch = DatagramChannel.open();
128
129 try {
130 if (localAddress != null) {
131 try {
132 ch.socket().bind(localAddress);
133 setDefaultLocalAddress(localAddress);
134 } catch (IOException ioe) {
135
136
137 String newMessage = "Error while binding on " + localAddress + "\n" + "original message : "
138 + ioe.getMessage();
139 Exception e = new IOException(newMessage);
140 e.initCause(ioe.getCause());
141
142
143 ch.close();
144
145 throw e;
146 }
147 }
148
149 return ch;
150 } catch (Exception e) {
151
152
153 ch.close();
154 throw e;
155 }
156 }
157
158 @Override
159 protected boolean connect(DatagramChannel handle, SocketAddress remoteAddress) throws Exception {
160 handle.connect(remoteAddress);
161 return true;
162 }
163
164 @Override
165 protected NioSession newSession(IoProcessor<NioSession> processor, DatagramChannel handle) {
166 NioSession session = new NioDatagramSession(this, handle, processor);
167 session.getConfig().setAll(getSessionConfig());
168 return session;
169 }
170
171 @Override
172 protected void close(DatagramChannel handle) throws Exception {
173 handle.disconnect();
174 handle.close();
175 }
176
177
178 @Override
179 @SuppressWarnings("unchecked")
180 protected Iterator<DatagramChannel> allHandles() {
181 return Collections.EMPTY_LIST.iterator();
182 }
183
184 @Override
185 protected ConnectionRequest getConnectionRequest(DatagramChannel handle) {
186 throw new UnsupportedOperationException();
187 }
188
189 @Override
190 protected void destroy() throws Exception {
191
192 }
193
194 @Override
195 protected boolean finishConnect(DatagramChannel handle) throws Exception {
196 throw new UnsupportedOperationException();
197 }
198
199 @Override
200 protected void register(DatagramChannel handle, ConnectionRequest request) throws Exception {
201 throw new UnsupportedOperationException();
202 }
203
204 @Override
205 protected int select(int timeout) throws Exception {
206 return 0;
207 }
208
209 @Override
210 @SuppressWarnings("unchecked")
211 protected Iterator<DatagramChannel> selectedHandles() {
212 return Collections.EMPTY_LIST.iterator();
213 }
214
215 @Override
216 protected void wakeup() {
217
218 }
219 }