-
Notifications
You must be signed in to change notification settings - Fork 43
android localSocket
cheyiliu edited this page Nov 10, 2014
·
3 revisions
- 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
Just build something.