Android LocalServerSocket

后端 未结 4 1522
长发绾君心
长发绾君心 2021-02-02 02:02

In android, there are two classes LocalServerSocket and LocalSocket. I think they are something like AF_LOCAL in unix socket (I am not sure it is correct or not).

My que

4条回答
  •  庸人自扰
    2021-02-02 02:19

    The following code might not be perfect but it works !!! Thanks for Mike.

    Java part (Socket Server) :

    package test.socket;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.content.Intent;
    import android.net.LocalServerSocket;
    import android.net.LocalSocket;
    import android.net.LocalSocketAddress;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    
    public class TestSocketActivity extends Activity {
    
        public static String SOCKET_ADDRESS = "/test/socket/localServer";
        public String TAG = "Socket_Test";
    
    
        static{System.loadLibrary("testSocket");}
        private native void clientSocketThreadNative();
        private native void setStopThreadNative();
        localSocketServer mLocalSocketServer;
        localSocketClient mLocalSocketClient;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            mLocalSocketServer = new localSocketServer();
    
            mLocalSocketClient = new localSocketClient();
        }
    
        /* LocalSocketServer */
        public class localSocketServer extends Thread {
    
            int bufferSize = 32;
            byte[] buffer;
            int bytesRead;
            int totalBytesRead;
            int posOffset;
            LocalServerSocket server;
            LocalSocket receiver;
            InputStream input;
            private volatile boolean stopThread;
    
            public localSocketServer() {
                Log.d(TAG, " +++ Begin of localSocketServer() +++ ");
                buffer = new byte[bufferSize];
                bytesRead = 0;
                totalBytesRead = 0;
                posOffset = 0;
    
                try {
                    server = new LocalServerSocket(SOCKET_ADDRESS);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    Log.d(TAG, "The localSocketServer created failed !!!");
                    e.printStackTrace();
                }
    
                 LocalSocketAddress localSocketAddress; 
                 localSocketAddress = server.getLocalSocketAddress();
                 String str = localSocketAddress.getName();
    
                 Log.d(TAG, "The LocalSocketAddress = " + str);
    
                stopThread = false;
            }
    
            public void run() {             
                Log.d(TAG, " +++ Begin of run() +++ ");
                    while (!stopThread) {
    
                        if (null == server){
                            Log.d(TAG, "The localSocketServer is NULL !!!");
                            stopThread = true;
                            break;
                        }
    
                        try {
                            Log.d(TAG, "localSocketServer begins to accept()");
                            receiver = server.accept();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            Log.d(TAG, "localSocketServer accept() failed !!!");
                            e.printStackTrace();
                            continue;
                        }                   
    
                        try {
                            input = receiver.getInputStream();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            Log.d(TAG, "getInputStream() failed !!!");
                            e.printStackTrace();
                            continue;
                        }
    
                        Log.d(TAG, "The client connect to LocalServerSocket");
    
                        while (receiver != null) {
    
                            try {
                                bytesRead = input.read(buffer, posOffset,
                                        (bufferSize - totalBytesRead));
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                Log.d(TAG, "There is an exception when reading socket");
                                e.printStackTrace();
                                break;
                            }
    
                            if (bytesRead >= 0) {
                                Log.d(TAG, "Receive data from socket, bytesRead = "
                                        + bytesRead);
                                posOffset += bytesRead;
                                totalBytesRead += bytesRead;
                            }
    
                            if (totalBytesRead == bufferSize) {
                                Log.d(TAG, "The buffer is full !!!");
                                String str = new String(buffer);
                                Log.d(TAG, "The context of buffer is : " + str);
    
                                bytesRead = 0;
                                totalBytesRead = 0;
                                posOffset = 0;
                            }
    
                        }
                        Log.d(TAG, "The client socket is NULL !!!");
                    }
                    Log.d(TAG, "The LocalSocketServer thread is going to stop !!!");
                    if (receiver != null){
                        try {
                            receiver.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    if (server != null){
                        try {
                            server.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
            }
    
            public void setStopThread(boolean value){
                stopThread = value;
                Thread.currentThread().interrupt(); // TODO : Check
            }
    
        }
    
        /* Client native socket */
        public class localSocketClient extends Thread {
    
            private volatile boolean stopThread;
    
            public localSocketClient(){
                Log.d(TAG, " +++ Begin of localSocketClient() +++ ");
                stopThread = false;
            }
    
            public void run(){
                Log.d(TAG, " +++ Begin of run() +++ ");
                while(!stopThread){
                    clientSocketThreadNative();
                }
            }
    
            public void setStopThread(boolean value){
                stopThread = value;
                setStopThreadNative();
                Thread.currentThread().interrupt(); // TODO : Check
            }
        }
    
    
        public void bt_startServerOnClick(View v) {
            mLocalSocketServer.start();
        }
    
        public void bt_startClientOnClick(View v) {
            mLocalSocketClient.start();
        }
    
        public void bt_stopOnClick(View v) {
            mLocalSocketClient.setStopThread(true);
            mLocalSocketServer.setStopThread(true);
        }
    
    }
    

    Native C part (Client)

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    
    #include "test_socket_TestSocketActivity.h"
    
    #define LOCAL_SOCKET_SERVER_NAME "/test/socket/localServer"
    
    volatile int stopThread;
    
    #ifndef __JNILOGGER_H_
    #define __JNILOGGER_H_ 
    #include  
    #ifdef __cplusplus
    extern "C" {
    #endif
    #ifndef LOG_TAG
    #define LOG_TAG "NativeSocket"
    #endif
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
    #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
    #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
    #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG_TAG,__VA_ARGS__)
    #define LOGS(...) __android_log_print(ANDROID_LOG_SILENT,LOG_TAG,__VA_ARGS__)
    #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__)
    #ifdef __cplusplus
    }
    #endif
    #endif /* __JNILOGGER_H_ */ 
    
    
    JNIEXPORT void JNICALL Java_test_socket_TestSocketActivity_clientSocketThreadNative
      (JNIEnv *env, jobject object){
    
        LOGD("In clientSocketThreadNative() : Begin");
    
        stopThread = 0;
    
        int sk, result;
        int count = 1;
        int err;
    
        char *buffer = malloc(8);
    
        int i;
        for(i = 0; i<8; i++){
            buffer[i] = (i+1);
        }
    
        struct sockaddr_un addr;
        socklen_t len;
        addr.sun_family = AF_LOCAL;
        /* use abstract namespace for socket path */
        addr.sun_path[0] = '\0';
        strcpy(&addr.sun_path[1], LOCAL_SOCKET_SERVER_NAME );
        len = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&addr.sun_path[1]);
    
        LOGD("In clientSocketThreadNative() : Before creating socket");
        sk = socket(PF_LOCAL, SOCK_STREAM, 0);
        if (sk < 0) {
            err = errno;
            LOGD("%s: Cannot open socket: %s (%d)\n",
                __FUNCTION__, strerror(err), err);
            errno = err;
            return;
        }
    
        LOGD("In clientSocketThreadNative() : Before connecting to Java LocalSocketServer");
        if (connect(sk, (struct sockaddr *) &addr, len) < 0) {
            err = errno;
            LOGD("%s: connect() failed: %s (%d)\n",
                __FUNCTION__, strerror(err), err);
            close(sk);
            errno = err;
            return;
        }
    
        LOGD("In clientSocketThreadNative() : Connecting to Java LocalSocketServer succeed");
        while(!stopThread){
            result = write(sk, buffer, 8);
            LOGD("In clientSocketThreadNative() : Total write = %d", result);
            count++;
            if(4 == count){
                sleep(1);
                count = 0;
            } 
        }
    
    
        LOGD("In clientSocketThreadNative() : End");
    }
    
    
    JNIEXPORT void JNICALL Java_test_socket_TestSocketActivity_setStopThreadNative
      (JNIEnv *env, jobject object){
    
        stopThread = 1;
    
    }
    

提交回复
热议问题