2323import java .net .Inet6Address ;
2424import java .net .InetAddress ;
2525import java .net .InetSocketAddress ;
26- import java .net .UnknownHostException ;
2726import java .util .concurrent .CountDownLatch ;
2827
28+ import androidx .annotation .NonNull ;
29+ import androidx .annotation .Nullable ;
30+
2931public class TcpSocketModule extends ReactContextBaseJavaModule implements TcpReceiverTask .OnDataReceivedListener {
3032
3133 private final ReactApplicationContext mReactContext ;
32- private SparseArray <TcpSocketClient > socketClients = new SparseArray <>();
33- private SparseArray <Network > mNetworkMap = new SparseArray <>();
34+ private final SparseArray <TcpSocketClient > socketClients = new SparseArray <>();
35+ private final SparseArray <Network > mNetworkMap = new SparseArray <>();
3436 private Network mSelectedNetwork ;
35- private boolean shuttingDown = false ;
3637
3738 public static final String TAG = "TcpSockets" ;
3839
@@ -42,7 +43,7 @@ public TcpSocketModule(ReactApplicationContext reactContext) {
4243 }
4344
4445 @ Override
45- public String getName () {
46+ public @ NonNull String getName () {
4647 return TAG ;
4748 }
4849
@@ -52,18 +53,21 @@ private void sendEvent(String eventName, WritableMap params) {
5253 .emit (eventName , params );
5354 }
5455
55- private void selectNetwork (final String iface , final String ipAddress ) throws InterruptedException {
56- /**
57- * Returns a network given its interface name:
58- * "wifi" -> WIFI
59- * "cellular" -> Cellular
60- * etc...
61- */
56+ /**
57+ * Returns a network given its interface name:
58+ * "wifi" -> WIFI
59+ * "cellular" -> Cellular
60+ * etc...
61+ */
62+ private void selectNetwork (@ Nullable final String iface , @ Nullable final String ipAddress ) throws InterruptedException {
63+ if (iface == null ) return ;
6264 mSelectedNetwork = null ;
63- Network cachedNetwork = mNetworkMap .get (ipAddress .hashCode ());
64- if (cachedNetwork != null ){
65- mSelectedNetwork = cachedNetwork ;
66- return ;
65+ if (ipAddress != null ){
66+ Network cachedNetwork = mNetworkMap .get (ipAddress .hashCode ());
67+ if (cachedNetwork != null ){
68+ mSelectedNetwork = cachedNetwork ;
69+ return ;
70+ }
6771 }
6872 final CountDownLatch awaitingNetwork = new CountDownLatch (1 ); // only needs to be counted down once to release waiting threads
6973 final ConnectivityManager cm = (ConnectivityManager ) mReactContext .getSystemService (Context .CONNECTIVITY_SERVICE );
@@ -75,7 +79,7 @@ private void selectNetwork(final String iface, final String ipAddress) throws In
7579 @ Override
7680 public void onAvailable (Network network ) {
7781 mSelectedNetwork = network ;
78- if (!ipAddress .equals ("0.0.0.0" ))
82+ if (ipAddress != null && !ipAddress .equals ("0.0.0.0" ))
7983 mNetworkMap .put (ipAddress .hashCode (), mSelectedNetwork );
8084 awaitingNetwork .countDown (); // Stop waiting
8185 }
@@ -92,17 +96,17 @@ public void onUnavailable() {
9296 mSelectedNetwork = null ;
9397 break ;
9498 }
95- if (mSelectedNetwork != null && !ipAddress .equals ("0.0.0.0" ))
99+ if (mSelectedNetwork != null && ipAddress != null && !ipAddress .equals ("0.0.0.0" ))
96100 mNetworkMap .put (ipAddress .hashCode (), mSelectedNetwork );
97101 }
98102
99103 /**
100104 * Creates a TCP Socket and establish a connection with the given host
101105 *
102- * @param cId
103- * @param host
104- * @param port
105- * @param options
106+ * @param cId socket ID
107+ * @param host socket IP address
108+ * @param port socket port to be bound
109+ * @param options extra options
106110 */
107111 @ ReactMethod
108112 public void connect (final Integer cId , final String host , final Integer port , final ReadableMap options ) {
@@ -128,12 +132,9 @@ protected void doInBackgroundGuarded(Void... params) {
128132 client = new TcpSocketClient (TcpSocketModule .this , cId , host , port , localAddress , localPort , mSelectedNetwork );
129133 socketClients .put (cId , client );
130134 onConnect (cId , host , port );
131- } catch (IOException e ) {
132- onError (cId , e .getMessage ());
133- } catch (InterruptedException e ) {
135+ } catch (Exception e ) {
134136 onError (cId , e .getMessage ());
135137 }
136- return ;
137138 }
138139 }.execute ();
139140 }
@@ -158,7 +159,6 @@ protected void doInBackgroundGuarded(Void... params) {
158159 if (callback != null ) {
159160 callback .invoke ();
160161 }
161- return ;
162162 }
163163 }.execute ();
164164 }
@@ -168,18 +168,12 @@ public void end(final Integer cId) {
168168 new GuardedAsyncTask <Void , Void >(mReactContext .getExceptionHandler ()) {
169169 @ Override
170170 protected void doInBackgroundGuarded (Void ... params ) {
171- try {
172- TcpSocketClient socketClient = socketClients .get (cId );
173- if (socketClient == null ){
174- return ;
175- }
176- socketClient .close ();
177- onClose (cId , null );
178- socketClients .remove (cId );
179- } catch (IOException e ) {
180- onClose (cId , e .getMessage ());
171+ TcpSocketClient socketClient = socketClients .get (cId );
172+ if (socketClient == null ) {
173+ return ;
181174 }
182- return ;
175+ socketClient .close ();
176+ socketClients .remove (cId );
183177 }
184178 }.execute ();
185179 }
@@ -198,10 +192,8 @@ protected void doInBackgroundGuarded(Void... params) {
198192 TcpSocketServer server = new TcpSocketServer (socketClients , TcpSocketModule .this , cId , host , port );
199193 socketClients .put (cId , server );
200194 onConnect (cId , host , port );
201- } catch (UnknownHostException uhe ) {
195+ } catch (Exception uhe ) {
202196 onError (cId , uhe .getMessage ());
203- } catch (IOException ioe ) {
204- onError (cId , ioe .getMessage ());
205197 }
206198 }
207199 }.execute ();
@@ -211,9 +203,6 @@ protected void doInBackgroundGuarded(Void... params) {
211203
212204 @ Override
213205 public void onConnect (Integer id , String host , int port ) {
214- if (shuttingDown ) {
215- return ;
216- }
217206 WritableMap eventParams = Arguments .createMap ();
218207 eventParams .putInt ("id" , id );
219208 WritableMap addressParams = Arguments .createMap ();
@@ -226,9 +215,6 @@ public void onConnect(Integer id, String host, int port) {
226215
227216 @ Override
228217 public void onData (Integer id , byte [] data ) {
229- if (shuttingDown ) {
230- return ;
231- }
232218 WritableMap eventParams = Arguments .createMap ();
233219 eventParams .putInt ("id" , id );
234220 eventParams .putString ("data" , Base64 .encodeToString (data , Base64 .NO_WRAP ));
@@ -238,9 +224,6 @@ public void onData(Integer id, byte[] data) {
238224
239225 @ Override
240226 public void onClose (Integer id , String error ) {
241- if (shuttingDown ) {
242- return ;
243- }
244227 if (error != null ) {
245228 onError (id , error );
246229 }
@@ -253,9 +236,6 @@ public void onClose(Integer id, String error) {
253236
254237 @ Override
255238 public void onError (Integer id , String error ) {
256- if (shuttingDown ) {
257- return ;
258- }
259239 WritableMap eventParams = Arguments .createMap ();
260240 eventParams .putInt ("id" , id );
261241 eventParams .putString ("error" , error );
@@ -265,9 +245,6 @@ public void onError(Integer id, String error) {
265245
266246 @ Override
267247 public void onConnection (Integer serverId , Integer clientId , InetSocketAddress socketAddress ){
268- if (shuttingDown ) {
269- return ;
270- }
271248 WritableMap eventParams = Arguments .createMap ();
272249 eventParams .putInt ("id" , serverId );
273250
0 commit comments