Advertisement
Guest User

ClientService

a guest
Apr 23rd, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.28 KB | None | 0 0
  1. package com.krost.client.service;
  2.  
  3. import com.krost.client.ClientExtension;
  4.  
  5. import java.io.BufferedWriter;
  6. import java.io.BufferedReader;
  7. import java.io.OutputStreamWriter;
  8. import java.io.InputStreamReader;
  9. import java.io.PrintWriter;
  10. import java.io.DataInputStream;
  11. import java.net.InetAddress;
  12. import java.net.InetSocketAddress;
  13. import java.net.Socket;
  14.  
  15. import android.app.Service;
  16. import android.app.IntentService;
  17. import android.content.Intent;
  18. import android.content.IntentFilter;
  19. import android.os.IBinder;
  20. import android.os.AsyncTask;
  21. import android.widget.Toast;
  22. import android.util.Log;
  23.  
  24. public class ClientService extends Service {
  25.   static SocketClient client;
  26.  
  27.   @Override
  28.   public void onCreate() {
  29.     Toast.makeText(this, "Клиентская служба создана", Toast.LENGTH_SHORT).show();
  30.    
  31.     client = new SocketClient();
  32.     client.execute();
  33.     Toast.makeText(this, "Клиент запущен в отдельный поток", Toast.LENGTH_SHORT).show();
  34.   }
  35.  
  36.   @Override
  37.   public int onStartCommand(Intent intent, int flags, int startId) {
  38.     Toast.makeText(this, "Клиентская служба запущена", Toast.LENGTH_SHORT).show();
  39.     return Service.START_STICKY;
  40.   }
  41.  
  42.   @Override
  43.   public void onDestroy() {
  44.     Toast.makeText(this, "Клиентская служба остановлена", Toast.LENGTH_SHORT).show();
  45.     client = null;
  46.   }
  47.  
  48.   @Override
  49.   public IBinder onBind(Intent intent) {
  50.       return null;
  51.   }
  52.  
  53.  
  54.   public static void setServer (String address, int port, boolean doretry) {
  55.     client.setServer(address, port, doretry);
  56.   }
  57.  
  58.   public static void send (String message) {
  59.     client.send(message);
  60.   }
  61.  
  62.   public static void connect (boolean doretry) {
  63.     client.connect(doretry);
  64.   }
  65.  
  66.   public static void disconnect (boolean doretry) {
  67.     client.disconnect(doretry);
  68.   }
  69.  
  70.   public static void reconnect (boolean doretry) {
  71.     client.reconnect(doretry);
  72.   }
  73.  
  74.   public static void serverStatus (String status, String message) {
  75.     if (status  == null) status  = "GENERIC";
  76.     if (message == null) message = "";
  77.    
  78.     ClientExtension.dispatchEvent("SERVER_" + status, message);
  79.   }
  80.  
  81.   public class SocketClient extends AsyncTask<Void, Void, Void> {
  82.     private String  SERVERIP   = "";
  83.     private int     SERVERPORT = 0;
  84.    
  85.     private Socket          socket;
  86.     private InetAddress     serverAddr;
  87.     private PrintWriter     out;
  88.     private BufferedReader  in;
  89.     private DataInputStream din;
  90.     private String          serverMessage;
  91.    
  92.     private boolean connected = false;
  93.     private boolean retry     = false;
  94.     private boolean force     = false;
  95.    
  96.     private void sleepWait (int timeout) {
  97.       try {
  98.         Thread.sleep(timeout);
  99.       } catch (Exception es) {
  100.         es.printStackTrace();
  101.       }
  102.     }
  103.    
  104.     public void setServer (String address, int port, boolean doretry) {
  105.       SERVERIP   = address;
  106.       SERVERPORT = port;
  107.       retry      = doretry;
  108.     }
  109.    
  110.     public void send (String message) {
  111.       if (out != null && !out.checkError()) {
  112.         out.println(message);
  113.         out.flush();
  114.       }
  115.     }
  116.    
  117.     public void connect (boolean doretry) {
  118.       retry = doretry;
  119.       force = true;
  120.     }
  121.    
  122.     public void disconnect (boolean doretry) {
  123.       retry = doretry;
  124.       try {
  125.         socket.close();
  126.         socket = null;
  127.       } catch (Exception e) {
  128.         e.printStackTrace();
  129.       }
  130.     }
  131.    
  132.     public void reconnect (boolean doretry) {
  133.       disconnect(doretry);
  134.       connect(doretry);
  135.     }
  136.    
  137.     @Override
  138.     protected Void doInBackground (Void... params) {
  139.       while (true) {
  140.         if (retry == false && force == false)  {sleepWait(2000); continue;}
  141.         if (SERVERIP == "" || SERVERPORT == 0) {sleepWait(2000); continue;}
  142.        
  143.         force = false;
  144.        
  145.         try {
  146.           serverAddr = InetAddress.getByName(SERVERIP);
  147.           socket     = new Socket();
  148.           socket.connect(new InetSocketAddress(serverAddr, SERVERPORT), 10000);
  149.          
  150.           try {  
  151.             out       = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
  152.             in        = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  153.             din       = new DataInputStream(socket.getInputStream());
  154.             connected = true;
  155.             serverStatus("CONNECT", "1");
  156.            
  157.             int bytesToRead = 0;
  158.             while (true)
  159.             {
  160.               // Check socket
  161.               if (socket == null) break;
  162.              
  163.               // Try read stream
  164.               byte[] r    = new byte[2048];
  165.               bytesToRead = din.read(r);
  166.               if (bytesToRead == -1) break;
  167.              
  168.               // New bytearray
  169.               byte[] nr = new byte[bytesToRead];
  170.               System.arraycopy(r, 0, nr, 0, bytesToRead);
  171.               int prev = 0;
  172.               for (int i = 0; i < nr.length; i++) {
  173.                 if (nr[i] != '\0') continue;
  174.                 byte[] m = new byte[i - prev];
  175.                 System.arraycopy(nr, prev, m, 0, i - prev);
  176.                 serverMessage = new String(m, "UTF-8");
  177.                 serverStatus("MESSAGE", serverMessage);
  178.                 prev = i + 1;
  179.               }
  180.               serverMessage = null;
  181.             }
  182.             if (socket != null) {
  183.               socket.close();
  184.               socket    = null;
  185.             }
  186.             connected = false;
  187.             serverStatus("DISCONNECT", "1");
  188.           } catch (Exception e) {
  189.             if (socket != null) {
  190.               socket.close();
  191.               socket    = null;
  192.             }
  193.             connected = false;
  194.             serverStatus("DISCONNECT", "1");
  195.             Log.e("TCP", "S: Error", e);
  196.           }
  197.         } catch (Exception es) {
  198.           try {
  199.             socket.close();
  200.           } catch (Exception en) {
  201.             en.printStackTrace();
  202.           } finally {
  203.             socket    = null;
  204.             connected = false;
  205.             serverStatus("CONNECT_ERROR", es.getMessage());
  206.             Log.e("TCP", "C: Error", es);
  207.           }
  208.           sleepWait(10000);
  209.         }
  210.       }  
  211.     }
  212.   }
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement