1 
2 package com.example.android.wifidirect.discovery;
3 
4 import android.os.Handler;
5 import android.util.Log;
6 
7 import java.io.IOException;
8 import java.net.ServerSocket;
9 import java.util.concurrent.LinkedBlockingQueue;
10 import java.util.concurrent.ThreadPoolExecutor;
11 import java.util.concurrent.TimeUnit;
12 
13 /**
14  * The implementation of a ServerSocket handler. This is used by the wifi p2p
15  * group owner.
16  */
17 public class GroupOwnerSocketHandler extends Thread {
18 
19     ServerSocket socket = null;
20     private final int THREAD_COUNT = 10;
21     private Handler handler;
22     private static final String TAG = "GroupOwnerSocketHandler";
23 
GroupOwnerSocketHandler(Handler handler)24     public GroupOwnerSocketHandler(Handler handler) throws IOException {
25         try {
26             socket = new ServerSocket(4545);
27             this.handler = handler;
28             Log.d("GroupOwnerSocketHandler", "Socket Started");
29         } catch (IOException e) {
30             e.printStackTrace();
31             pool.shutdownNow();
32             throw e;
33         }
34 
35     }
36 
37     /**
38      * A ThreadPool for client sockets.
39      */
40     private final ThreadPoolExecutor pool = new ThreadPoolExecutor(
41             THREAD_COUNT, THREAD_COUNT, 10, TimeUnit.SECONDS,
42             new LinkedBlockingQueue<Runnable>());
43 
44     @Override
run()45     public void run() {
46         while (true) {
47             try {
48                 // A blocking operation. Initiate a ChatManager instance when
49                 // there is a new connection
50                 pool.execute(new ChatManager(socket.accept(), handler));
51                 Log.d(TAG, "Launching the I/O handler");
52 
53             } catch (IOException e) {
54                 try {
55                     if (socket != null && !socket.isClosed())
56                         socket.close();
57                 } catch (IOException ioe) {
58 
59                 }
60                 e.printStackTrace();
61                 pool.shutdownNow();
62                 break;
63             }
64         }
65     }
66 
67 }
68