Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.krost.client.service;
- import com.krost.client.ClientExtension;
- import java.io.BufferedWriter;
- import java.io.BufferedReader;
- import java.io.OutputStreamWriter;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.io.DataInputStream;
- import java.net.InetAddress;
- import java.net.InetSocketAddress;
- import java.net.Socket;
- import android.app.Service;
- import android.app.IntentService;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.os.IBinder;
- import android.os.AsyncTask;
- import android.widget.Toast;
- import android.util.Log;
- public class ClientService extends Service {
- static SocketClient client;
- @Override
- public void onCreate() {
- Toast.makeText(this, "Клиентская служба создана", Toast.LENGTH_SHORT).show();
- client = new SocketClient();
- client.execute();
- Toast.makeText(this, "Клиент запущен в отдельный поток", Toast.LENGTH_SHORT).show();
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Toast.makeText(this, "Клиентская служба запущена", Toast.LENGTH_SHORT).show();
- return Service.START_STICKY;
- }
- @Override
- public void onDestroy() {
- Toast.makeText(this, "Клиентская служба остановлена", Toast.LENGTH_SHORT).show();
- client = null;
- }
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
- public static void setServer (String address, int port, boolean doretry) {
- client.setServer(address, port, doretry);
- }
- public static void send (String message) {
- client.send(message);
- }
- public static void connect (boolean doretry) {
- client.connect(doretry);
- }
- public static void disconnect (boolean doretry) {
- client.disconnect(doretry);
- }
- public static void reconnect (boolean doretry) {
- client.reconnect(doretry);
- }
- public static void serverStatus (String status, String message) {
- if (status == null) status = "GENERIC";
- if (message == null) message = "";
- ClientExtension.dispatchEvent("SERVER_" + status, message);
- }
- public class SocketClient extends AsyncTask<Void, Void, Void> {
- private String SERVERIP = "";
- private int SERVERPORT = 0;
- private Socket socket;
- private InetAddress serverAddr;
- private PrintWriter out;
- private BufferedReader in;
- private DataInputStream din;
- private String serverMessage;
- private boolean connected = false;
- private boolean retry = false;
- private boolean force = false;
- private void sleepWait (int timeout) {
- try {
- Thread.sleep(timeout);
- } catch (Exception es) {
- es.printStackTrace();
- }
- }
- public void setServer (String address, int port, boolean doretry) {
- SERVERIP = address;
- SERVERPORT = port;
- retry = doretry;
- }
- public void send (String message) {
- if (out != null && !out.checkError()) {
- out.println(message);
- out.flush();
- }
- }
- public void connect (boolean doretry) {
- retry = doretry;
- force = true;
- }
- public void disconnect (boolean doretry) {
- retry = doretry;
- try {
- socket.close();
- socket = null;
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void reconnect (boolean doretry) {
- disconnect(doretry);
- connect(doretry);
- }
- @Override
- protected Void doInBackground (Void... params) {
- while (true) {
- if (retry == false && force == false) {sleepWait(2000); continue;}
- if (SERVERIP == "" || SERVERPORT == 0) {sleepWait(2000); continue;}
- force = false;
- try {
- serverAddr = InetAddress.getByName(SERVERIP);
- socket = new Socket();
- socket.connect(new InetSocketAddress(serverAddr, SERVERPORT), 10000);
- try {
- out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
- in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
- din = new DataInputStream(socket.getInputStream());
- connected = true;
- serverStatus("CONNECT", "1");
- int bytesToRead = 0;
- while (true)
- {
- // Check socket
- if (socket == null) break;
- // Try read stream
- byte[] r = new byte[2048];
- bytesToRead = din.read(r);
- if (bytesToRead == -1) break;
- // New bytearray
- byte[] nr = new byte[bytesToRead];
- System.arraycopy(r, 0, nr, 0, bytesToRead);
- int prev = 0;
- for (int i = 0; i < nr.length; i++) {
- if (nr[i] != '\0') continue;
- byte[] m = new byte[i - prev];
- System.arraycopy(nr, prev, m, 0, i - prev);
- serverMessage = new String(m, "UTF-8");
- serverStatus("MESSAGE", serverMessage);
- prev = i + 1;
- }
- serverMessage = null;
- }
- if (socket != null) {
- socket.close();
- socket = null;
- }
- connected = false;
- serverStatus("DISCONNECT", "1");
- } catch (Exception e) {
- if (socket != null) {
- socket.close();
- socket = null;
- }
- connected = false;
- serverStatus("DISCONNECT", "1");
- Log.e("TCP", "S: Error", e);
- }
- } catch (Exception es) {
- try {
- socket.close();
- } catch (Exception en) {
- en.printStackTrace();
- } finally {
- socket = null;
- connected = false;
- serverStatus("CONNECT_ERROR", es.getMessage());
- Log.e("TCP", "C: Error", es);
- }
- sleepWait(10000);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement