66import android .net .ConnectivityManager ;
77import android .net .NetworkCapabilities ;
88import android .net .NetworkRequest ;
9- import android .util . SparseArray ;
9+ import android .os . AsyncTask ;
1010import android .util .Base64 ;
1111import android .net .Network ;
1212
2424import java .net .Inet6Address ;
2525import java .net .InetAddress ;
2626import java .net .InetSocketAddress ;
27+ import java .util .concurrent .ConcurrentHashMap ;
2728import java .util .concurrent .CountDownLatch ;
2829
2930import androidx .annotation .NonNull ;
3233public class TcpSocketModule extends ReactContextBaseJavaModule implements TcpReceiverTask .OnDataReceivedListener {
3334
3435 private final ReactApplicationContext mReactContext ;
35- private final SparseArray < TcpSocketClient > socketClients = new SparseArray <>();
36- private final SparseArray < Network > mNetworkMap = new SparseArray <>();
36+ private final ConcurrentHashMap < Integer , TcpSocketClient > socketClients = new ConcurrentHashMap <>();
37+ private final ConcurrentHashMap < String , Network > mNetworkMap = new ConcurrentHashMap <>();
3738 private Network mSelectedNetwork ;
3839
3940 private static final String TAG = "TcpSockets" ;
@@ -44,7 +45,8 @@ public TcpSocketModule(ReactApplicationContext reactContext) {
4445 }
4546
4647 @ Override
47- public @ NonNull String getName () {
48+ public @ NonNull
49+ String getName () {
4850 return TAG ;
4951 }
5052
@@ -63,9 +65,9 @@ private void sendEvent(String eventName, WritableMap params) {
6365 private void selectNetwork (@ Nullable final String iface , @ Nullable final String ipAddress ) throws InterruptedException {
6466 if (iface == null ) return ;
6567 mSelectedNetwork = null ;
66- if (ipAddress != null ){
67- Network cachedNetwork = mNetworkMap .get (ipAddress . hashCode () );
68- if (cachedNetwork != null ){
68+ if (ipAddress != null ) {
69+ Network cachedNetwork = mNetworkMap .get (ipAddress );
70+ if (cachedNetwork != null ) {
6971 mSelectedNetwork = cachedNetwork ;
7072 return ;
7173 }
@@ -81,7 +83,7 @@ private void selectNetwork(@Nullable final String iface, @Nullable final String
8183 public void onAvailable (Network network ) {
8284 mSelectedNetwork = network ;
8385 if (ipAddress != null && !ipAddress .equals ("0.0.0.0" ))
84- mNetworkMap .put (ipAddress . hashCode () , mSelectedNetwork );
86+ mNetworkMap .put (ipAddress , mSelectedNetwork );
8587 awaitingNetwork .countDown (); // Stop waiting
8688 }
8789
@@ -97,16 +99,16 @@ public void onUnavailable() {
9799 mSelectedNetwork = null ;
98100 break ;
99101 }
100- if (mSelectedNetwork != null && ipAddress != null && !ipAddress .equals ("0.0.0.0" ))
101- mNetworkMap .put (ipAddress . hashCode () , mSelectedNetwork );
102+ if (mSelectedNetwork != null && ipAddress != null && !ipAddress .equals ("0.0.0.0" ))
103+ mNetworkMap .put (ipAddress , mSelectedNetwork );
102104 }
103105
104106 /**
105107 * Creates a TCP Socket and establish a connection with the given host
106108 *
107- * @param cId socket ID
108- * @param host socket IP address
109- * @param port socket port to be bound
109+ * @param cId socket ID
110+ * @param host socket IP address
111+ * @param port socket port to be bound
110112 * @param options extra options
111113 */
112114 @ SuppressLint ("StaticFieldLeak" )
@@ -131,14 +133,15 @@ protected void doInBackgroundGuarded(Void... params) {
131133 String localAddress = options .getString ("localAddress" );
132134 String iface = options .getString ("interface" );
133135 selectNetwork (iface , localAddress );
134- client = new TcpSocketClient (TcpSocketModule .this , cId , host , port , options , mSelectedNetwork );
136+ client = new TcpSocketClient (TcpSocketModule .this , cId , null );
135137 socketClients .put (cId , client );
138+ client .connect (host , port , options , mSelectedNetwork );
136139 onConnect (cId , host , port );
137140 } catch (Exception e ) {
138141 onError (cId , e .getMessage ());
139142 }
140143 }
141- }.execute ( );
144+ }.executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR );
142145 }
143146
144147 @ SuppressLint ("StaticFieldLeak" )
@@ -149,7 +152,7 @@ public void write(final Integer cId, final String base64String, final Callback c
149152 @ Override
150153 protected void doInBackgroundGuarded (Void ... params ) {
151154 TcpSocketClient socketClient = socketClients .get (cId );
152- if (socketClient == null ){
155+ if (socketClient == null ) {
153156 return ;
154157 }
155158 try {
@@ -164,7 +167,7 @@ protected void doInBackgroundGuarded(Void... params) {
164167 callback .invoke ();
165168 }
166169 }
167- }.execute ( );
170+ }.executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR );
168171 }
169172
170173 @ SuppressLint ("StaticFieldLeak" )
@@ -181,7 +184,7 @@ protected void doInBackgroundGuarded(Void... params) {
181184 socketClient .close ();
182185 socketClients .remove (cId );
183186 }
184- }.execute ( );
187+ }.executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR );
185188 }
186189
187190 @ SuppressWarnings ("unused" )
@@ -207,7 +210,7 @@ protected void doInBackgroundGuarded(Void... params) {
207210 onError (cId , uhe .getMessage ());
208211 }
209212 }
210- }.execute ( );
213+ }.executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR );
211214 }
212215
213216 // TcpReceiverTask.OnDataReceivedListener
@@ -255,7 +258,7 @@ public void onError(Integer id, String error) {
255258 }
256259
257260 @ Override
258- public void onConnection (Integer serverId , Integer clientId , InetSocketAddress socketAddress ){
261+ public void onConnection (Integer serverId , Integer clientId , InetSocketAddress socketAddress ) {
259262 WritableMap eventParams = Arguments .createMap ();
260263 eventParams .putInt ("id" , serverId );
261264
0 commit comments