11package com .asterinet .react .tcpsocket ;
22
3- import android .annotation .SuppressLint ;
4- import android .os .AsyncTask ;
5-
63import com .facebook .react .bridge .ReadableMap ;
74
85import java .io .IOException ;
1411import java .util .concurrent .Executors ;
1512
1613public final class TcpSocketServer extends TcpSocket {
17- private ServerSocket serverSocket ;
1814 private final TcpEventListener mReceiverListener ;
19- private int clientSocketIds ;
20- private final ExecutorService executorService ;
15+ private final ExecutorService listenExecutor ;
2116 private final ConcurrentHashMap <Integer , TcpSocket > socketClients ;
22-
23- @ SuppressLint ("StaticFieldLeak" )
24- private final AsyncTask listening = new AsyncTask () {
25- @ Override
26- protected Void doInBackground (Object [] objects ) {
27- try {
28- while (!isCancelled () && !serverSocket .isClosed ()) {
29- Socket socket = serverSocket .accept ();
30- int clientId = getClientId ();
31- TcpSocketClient socketClient = new TcpSocketClient (mReceiverListener , clientId , socket );
32- socketClients .put (clientId , socketClient );
33- mReceiverListener .onConnection (getId (), clientId , socket );
34- socketClient .startListening ();
35- }
36- } catch (IOException e ) {
37- if (!serverSocket .isClosed ()) {
38- mReceiverListener .onError (getId (), e .getMessage ());
39- }
40- }
41- return null ;
42- }
43- };
44-
17+ private ServerSocket serverSocket ;
18+ private int clientSocketIds ;
4519
4620 public TcpSocketServer (final ConcurrentHashMap <Integer , TcpSocket > socketClients , final TcpEventListener receiverListener , final Integer id ,
4721 final ReadableMap options ) throws IOException {
4822 super (id );
49- this . executorService = Executors .newFixedThreadPool ( 1 );
23+ listenExecutor = Executors .newSingleThreadExecutor ( );
5024 // Get data from options
5125 int port = options .getInt ("port" );
5226 String address = options .getString ("host" );
@@ -73,6 +47,14 @@ public ServerSocket getServerSocket() {
7347 return serverSocket ;
7448 }
7549
50+ private void addClient (Socket socket ) {
51+ int clientId = getClientId ();
52+ TcpSocketClient socketClient = new TcpSocketClient (mReceiverListener , clientId , socket );
53+ socketClients .put (clientId , socketClient );
54+ mReceiverListener .onConnection (getId (), clientId , socket );
55+ socketClient .startListening ();
56+ }
57+
7658 /**
7759 * Next ID for a client socket
7860 *
@@ -83,18 +65,12 @@ private int getClientId() {
8365 }
8466
8567 private void listen () {
86- //noinspection unchecked
87- listening . executeOnExecutor ( executorService );
68+ TcpListenTask tcpListenTask = new TcpListenTask ( this , mReceiverListener );
69+ listenExecutor . execute ( tcpListenTask );
8870 }
8971
9072 public void close () {
9173 try {
92- if (!listening .isCancelled ()) {
93- // stop the receiving task
94- listening .cancel (true );
95- executorService .shutdown ();
96- }
97-
9874 // close the socket
9975 if (serverSocket != null && !serverSocket .isClosed ()) {
10076 serverSocket .close ();
@@ -105,4 +81,29 @@ public void close() {
10581 mReceiverListener .onClose (getId (), e .getMessage ());
10682 }
10783 }
84+
85+ private static class TcpListenTask implements Runnable {
86+ private final TcpEventListener receiverListener ;
87+ private final TcpSocketServer server ;
88+
89+ private TcpListenTask (TcpSocketServer server , TcpEventListener receiverListener ) {
90+ this .server = server ;
91+ this .receiverListener = receiverListener ;
92+ }
93+
94+ @ Override
95+ public void run () {
96+ ServerSocket serverSocket = server .getServerSocket ();
97+ try {
98+ while (!serverSocket .isClosed ()) {
99+ Socket socket = serverSocket .accept ();
100+ server .addClient (socket );
101+ }
102+ } catch (IOException e ) {
103+ if (!serverSocket .isClosed ()) {
104+ receiverListener .onError (server .getId (), e .getMessage ());
105+ }
106+ }
107+ }
108+ }
108109}
0 commit comments