Skip to content

android localSocket

cheyiliu edited this page Nov 10, 2014 · 3 revisions

java to java

java to native

  • java as server, native as client

package com.ccdt.crashcollect.cmd;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import android.net.LocalServerSocket;
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
import android.util.Log;

public class CmdListener extends Thread {

    // from test4android project
    private static final String TAG = "CmdListener";
    public static String SOCKET_ADDRESS = "local.socket.address.listen.native.cmd";//
    private boolean mStopped = false;

    public CmdListener() {
    }

    @Override
    public void run() {
        Log.i(TAG, "Server socket run . . . start");
        LocalServerSocket server = null;
        try {
            server = new LocalServerSocket(SOCKET_ADDRESS);
            while (!mStopped) {
                LocalSocket receiver = server.accept();
                if (receiver != null) {
                    InputStream inputStream = receiver.getInputStream();
                    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    String inputLine = null;
                    StringBuilder sb = new StringBuilder();
                    while (((inputLine = bufferedReader.readLine()) != null)) {
                        sb.append(inputLine);
                    }
                    //TODO do command
                    Log.i(TAG, "got cmd: " + sb.toString());
                    CmdExecutor.doCommand(sb.toString());
                    
                    bufferedReader.close();
                    receiver.close();
                    sb = null;
                }
            }
        } catch (IOException e) {
            Log.e(getClass().getName(), e.getMessage());
        } finally {
            if (server != null) {
                try {
                    server.close();
                } catch (IOException e) {
                    Log.e(getClass().getName(), e.getMessage());
                }
            }
        }

        Log.i(TAG, "Server socket run . . . end");
    }

    public void stopListening() {
        Log.i(TAG, "stopListening");
        mStopped = true;
        try {
            writeSocket("bye bye~~~");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void writeSocket(String message) throws IOException {
        Log.i(TAG, "writeSocket, " + message);
        LocalSocket sender = new LocalSocket();
        sender.connect(new LocalSocketAddress(SOCKET_ADDRESS));
        sender.getOutputStream().write(message.getBytes());
        sender.getOutputStream().close();
        sender.close();
    }
}

int send_remote_request(char *msg) {
	printf("send_remote_request \n");
	int localsocket, len;
	struct sockaddr_un remote;

	if ((localsocket = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
		printf("socket error \n");
		return -1;
	}

	char *name = "local.socket.address.listen.native.cmd";//与java上层相同哦

	remote.sun_path[0] = '\0'; /* abstract namespace */
	strcpy(remote.sun_path + 1, name);
	remote.sun_family = AF_UNIX;
	int nameLen = strlen(name);
	len = 1 + nameLen + offsetof(struct sockaddr_un, sun_path);

	if (connect(localsocket, (struct sockaddr *) &remote, len) == -1) {
		printf("connect error \n");
		return -1;
	}

	if (send(localsocket, msg, strlen(msg), 0) == -1) {
		printf("send error \n");
		return -1;
	}

	close(localsocket);
	printf("send_remote_request complete\n");
	return 0;
}
  • java as client, native as server
    private void writeSocket(String message) throws IOException {
        Log.i(TAG, "writeSocket, " + message);
        LocalSocket sender = new LocalSocket();
        sender.connect(new LocalSocketAddress("/data/data/com.example.testvv/tmp.serversocket",LocalSocketAddress.Namespace.FILESYSTEM ));
        sender.getOutputStream().write(message.getBytes());
        sender.getOutputStream().close();
        sender.close();
    }

cross compile this, it works.
https://github.com/cheyiliu/test4c/blob/master/socket/local_socket_srv.c
Clone this wiki locally