1. 程式人生 > >Android與C++ 使用socket傳輸資料

Android與C++ 使用socket傳輸資料

1. 使用C++ 建立socket server監聽

bool isBroadcastServerLanuch = false;
bool isTcpTlsServerLanuch = false;
int tcpSocketReceive_fd;
void *receiveCmdFromMobileApp(void *arg){
  int detachCode = pthread_detach(pthread_self());// 將狀態改為unjoinable狀態,確保資源的釋放
  printf("receiveCmdFromMobileApp thread: detachCode = %d\n", detachCode);
  std::string send_content;
  tcpSocketReceive_fd = *(int *)arg;
  char buf[256];
  int n;
  while(((n = recv(tcpSocketReceive_fd , buf, 256, 0)) !=  0) && isWifiNetworkSecure){
    if(n == -1){
        perror("\t\t\tfail to receive command from mobile app!!!");
        continue;
    }

    std::string recv_content = buf;

    memset(buf,0,sizeof(buf));
    printf("receive content is : %s\n",recv_content.c_str());
    printf("buf content: %s\n", buf);
    
    //TODO something

    char* send_buff;
    const int len = send_content.length();
    send_buff = new char[len+1]{0};
    strcpy(send_buff,send_content.c_str());
    printf("will send buff is : \n%s\n",send_buff);

    n = send(tcpSocketReceive_fd , send_buff, len , 0);
    if( n == -1){
        perror("fail to send");
    }
  }
  if(n == 0){
      printf("the connect has been closed\n");
      if(close(tcpSocketReceive_fd) == -1){
          perror("fail to close");
      }
  }
  printf("thread end!\n");

  pthread_exit(0);
  return 0;
}

int tcpSocket_fd;
void *createSocketConnectionsForMobileApp(void *argv){
  int detachCode = pthread_detach(pthread_self());// 將狀態改為unjoinable狀態,確保資源的釋放
  printf("start creat socket connection: detachCode= %d\n",detachCode);

  struct sockaddr_in sin;
  struct sockaddr_in cin;
  socklen_t len;
  int port = TCP_SOCKET_RECEIVE_IP_PORT; //6001
  bzero(&sin , sizeof(sin));

  sin.sin_family = AF_INET;
  sin.sin_addr.s_addr = INADDR_ANY;
  sin.sin_port = htons(port);

  if((tcpSocket_fd = socket(AF_INET,SOCK_STREAM,0)) == -1){
      perror("fail to create socket");
      pthread_exit(0);
      return 0;
  }
  int on = 1;
  if(setsockopt(tcpSocket_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0){
    perror("Unable to setsockopt");
    pthread_exit(0);
    return 0;
  }
  if(bind(tcpSocket_fd,(struct sockaddr *)&sin ,sizeof(sin) ) == -1){
      perror("fail to bind");
      pthread_exit(0);
      return 0;
  }

  if(listen(tcpSocket_fd,10) == -1){
      perror("fail to listen");
      pthread_exit(0);
      return 0;
  }
  printf("connect socket waiting.....\n");
  len = 1;
  while(1 && isWifiNetworkSecure){
      int c_fd;
      if((c_fd = accept(tcpSocket_fd,(struct sockaddr *)&cin, &len)) == -1){
          perror("fail to accept");
          continue;
      }
      printf("\t\t\thave client connect to server !!!!\n");
      if(isWifiNetworkSecure){
        pthread_t receiveCmdFromMobileAppAction;
        int receiveCmdFromMobileAppActionResult = pthread_create(&receiveCmdFromMobileAppAction, NULL, receiveCmdFromMobileApp,&c_fd);
        printf("\t%s: recieve command from mobile app. errorCode = %d\n", APP_TAG.c_str(), receiveCmdFromMobileAppActionResult);
      }else{
        printf("the network secure is false, not start receive thread.\n");
      }

  }
  if(close(tcpSocket_fd) == -1){
      perror("fail to close");
  }

  pthread_exit(0);
  return 0;
}
2. Android client code

import android.annotation.SuppressLint;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

class TCPHelper {
    private static final String TAG = "xxxx";
    private WifiManager.MulticastLock lock;
    private static TCPHelper instance = null;
    private Socket socket;
    private PrintWriter out;
    private InputStream is;

    static TCPHelper getInstance(){
        if(instance == null){
            instance = new TCPHelper();
        }
        return instance;
    }

    private TCPHelper() {
        Log.i(TAG,"udp helper initial");
    }

    private class ReadThread extends Thread {

        @SuppressLint("NewApi")
        @Override
        public void run() {
            try {
                is = socket.getInputStream();
                byte[] buffer = new byte[1024];
                int cnt = 0;
                while ((cnt = is.read(buffer))!=-1) {
                    try {
                        // read message
                        Log.d(TAG, "accept socket status:" + socket.isConnected());
                        String msg = new String(buffer, 0, cnt);
                        Log.d(TAG, "receive message:" + msg);
                        if (listener != null) {
                            listener.receive(msg);
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
                Log.d(TAG, "Read message error!");
            }
        }
    }

    void connect(final String IpAddress, final int port) {
        Log.i(TAG, "connect");
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                Log.i(TAG, " sync task");
                connectSync(IpAddress,port);
            }
        });
        Log.i(TAG, "AsyncTask over");
    }

    private void connectSync(String IpAddress,int port){
        Log.i(TAG, "Connecting");
        try {
            System.out.println("Client:Connecting");
            //Socket connect
            socket = new Socket(IpAddress, port);
            if (socket.isConnected()
                    && listener != null){
                listener.connected();
            }
            out = new PrintWriter(
                    new BufferedWriter(new OutputStreamWriter(
                            socket.getOutputStream())), true);
            //Read server message
            new Thread(new ReadThread()).start();
        } catch (UnknownHostException e1) {
            Log.i(TAG, "connect: unknown host");
            e1.printStackTrace();
        } catch (IOException e) {
            Log.i(TAG, "connect: io error");
            e.printStackTrace();
        }
    }
    // send a string
    void sendDataToServer(final String message) {
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                Log.i(TAG, " sync task for socket write");
                sendDataSync(message);
            }
        });

    }

    private void sendDataSync(String message){
        try {
            // OutputStream outputStream = socket.getOutputStream();
            Log.i(TAG,"send socket status = "+socket.isConnected());
            if (socket.isConnected()) {
                //   outputStream.write((message+"\n").getBytes());
                out.println(message);
                Log.i(TAG, "send a data!");
            }else {
                if (listener != null){
                    listener.disconnected();
                }
            }
            Log.i(TAG, "send a data over!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    void destroy() {
        if (lock != null){
            lock.release();
            lock = null;
        }
        if (out!=null){
            out.close();
            out = null;
        }
        if (is!=null){
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            is = null;
        }
        if (socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            socket = null;
        }
        Log.i(TAG,"release socket");
        instance = null;
    }

    public interface TCPHelperListener{
        void connected();
        void disconnected();
        void receive(String data);
    }
    private TCPHelperListener listener = null;
    void setTCPHelperListener(TCPHelperListener listener){
        this.listener = listener;
    }
}