programing

안드로이드 앱에서 사용할 웹소켓 라이브러리는?

muds 2023. 10. 23. 22:11
반응형

안드로이드 앱에서 사용할 웹소켓 라이브러리는?

웹소켓 연결을 유지하는 백그라운드에서 실행되고 정기적으로 서버로 일부 데이터를 전송하는 Android 앱에 서비스를 추가하고 싶습니다.

자바용 웹소켓 라이브러리가 많은 것 같은데 어떤 것을 사용해야 할지 잘 모르겠습니다.

  • TooTallNate/Java-WebSocket GitHub 설명: 100% Java로 작성된 베어본 웹소켓 클라이언트 및 서버 구현.http://java-websocket.org/ -- 이것은 제가 구글에서 "android 웹소켓"을 검색한 첫번째 결과에 링크되어 있습니다.그러나 특히 SSL 연결과 관련하여 공개된 문제가 상당히 많고, 현재 적극적으로 유지되고 있지는 않은 것으로 보입니다.

  • GitHub의 koush/Android Async 설명:안드로이드용 비동기 소켓, http(client+server), 웹소켓 및 socket.io 라이브러리스레드가 아니라 니오를 기반으로 합니다. -- 다시 많은 미해결 문제가 있지만, 활동적인 상태가 유지/작업되고 있는 것 같습니다.

  • 웹사이트의 Project Tyrus Description : JSR 356 : WebSocket용 Java API - Reference Implementation -- 이것은 Oracle에서 만든 것입니다.Android에서도 작동하는지 확실하지 않습니다.

  • 웹사이트의 Jetty WebSocket 클라이언트 API 정보:Jetty는 웹소켓 서버와의 대화를 보다 쉽게 작성할 수 있는 Jetty WebSocket Client Library도 제공합니다. -- 다시 한번:Android에서도 작동하는지 확실하지 않습니다.

  • 코드버틀러/안드로이드 웹소켓 GitHub의 설명: 안드로이드용 베어 최소 웹소켓(hybi13/RFC) 클라이언트 -- 이 예는 swiz/안드로이드 웹소켓-예에 사용되는데, 이것은 StackOverflow 질문인 "어떻게 안드로이드 장치가 웨이크락 없이 인터넷에 TCP 연결을 유지할 수 있는가?"에 대한 허용된 대답입니다.

  • GitHub의 분위기/wasync 설명: Node.js, Android 및 Java http://async-io.org 용 클라이언트 라이브러리를 폴백으로 전송하는 WebSockets

  • Takahiko Kawasaki/nv-웹소켓-클라이언트 GitHub 설명:Java에서 고품질 WebSocket 클라이언트 구현.

  • gitHub에서 제공하는 square/okhttp Description: Android 및 Java 애플리케이션을 위한 HTTP+SPDY 클라이언트입니다.http://square.github.io/okhttp/ -- 웹소켓 모듈있습니다.전갈자리 도그가 언급한 바와 같이, OkHttp는 3.5 버전부터 웹소켓을 내장하고 있습니다.

  • firebase/TubeSock 설명 (GitHub) : 자바(Java)로 구현된 WebSock

  • 아우토반|Android (GitHub) 웹사이트 설명:아우토반|Android는 웹소켓 프로토콜과 WAMP(Web Application Messaging Protocol)를 구현하여 네이티브 모바일 웹소켓/WAMP 클라이언트를 생성하는 Autobahn 프로젝트에 의해 만들어진 Java/Android용 오픈 소스 네트워킹 라이브러리입니다. -- cloudsurfin은 이것이 wss를 지원하지 않는다고 지적했습니다.

또한 Android용 네이티브 socket.io 클라이언트 라이브러리가 있습니다.

  • nkzawa/socket.io -client.GitHub에서 java 설명:완전한 기능을 갖춘 소켓.소켓(Socket)과 호환되는 Java용 IO Client Library for JavaIO v1.0 이상.

socket.io Android 클라이언트를 사용하는 것은 저에게 도움이 될 것입니다. 왜냐하면 저는 어쨌든 웹 프론트엔드에 nodejs/socket.io 를 사용할 계획이기 때문입니다.하지만 네이티브 고객은 꽤 어리고 몇 가지 미해결 문제가 있습니다.게다가 안드로이드 앱은 socket.io 클라이언트 라이브러리(socket.io 1.0 서버와 호환되는 것 외에도)를 사용하는 데 아무런 이점이 없다는 것을 알고 있습니다. 왜냐하면 웹소켓 지원은 클라이언트 측에서 보장할 수 있기 때문입니다.

저의 요구사항은 다음과 같습니다.

  • Android API 9 이상과의 호환성
  • SSL을 통해 연결 가능성
  • 영구적인 웨이크락을 유지할 필요 없이 오랫동안 연결부를 유지
  • 사용 가능한 nodejs 웹소켓 서버 구현 또는 socket.io 과의 호환성

어떤 도서관이 이러한 요구사항에 적합한가요?

메모 좀.

  • koush/AndroidAsyncRFC 6455에서 요구하는 닫기 핸드셰이크를 수행하지 않습니다.자세한 내용은 이 항목을 참조하십시오.

  • Project Tyrus는 Android에서 작동하지만 라이센스(CPE를 사용하는 CDDL 1.1 및 GPL 2)와 라이센스(ProGuard를 사용하여 WebSocket 클라이언트 크기 줄이기)가 요구 사항을 충족하는지 확인합니다.또한 Tyrus는 텍스트 크기가 클 경우 예외를 발생시킬 수 있습니다(아마도 버그일 것입니다).자세한 내용은 이 항목을 참조하십시오.

  • Jetty: 2년 전, Jetty 사용자 메일 목록에 있는 이메일 스레드에는 "현재 Android 호환 Jetty 9 WebSocket 클라이언트가 없습니다. Jetty WebSocket Client를 안드로이드용으로 JDK 7에서 JDK 5/6으로 백업할 계획이 있지만 JSR-356 Java WebSocket API(javax.websocket) 구현을 완료하는 것보다 우선 순위가 낮습니다."웹소켓 클라이언트 API에 대한 Jetty의 현재 문서에는 안드로이드에 대한 언급이 없습니다.

  • 코드 버틀러/안드로이드 웹소켓RFC 6455에서 요구하는 클로징 핸드셰이크를 수행하지 않으며 클로징 시 예외를 발생시킬 수 있습니다.이거 봐요.

  • 대기/wasync는 웹소켓 구현으로 AsyncHttpClient/async-http-client를 사용합니다.따라서 대신 AsyncHttpClient/async-http-client를 언급해야 합니다.

  • firebase/TubeSock이 확인되지 않음Sec-WebSocket-Accept. 이는 RFC 6455에 대한 위반입니다.또한, TubeSock은 문자 메시지를 만드는데 버그가 있습니다.문자 메시지에 멀티바이트 UTF-8 문자를 사용하면 조만간 버그가 발생할 것입니다.TubeSock 문제에 대한 자세한 목록은 delight-im/Android-DDP이슈 3을 참조하십시오.

고려 사항

Java로 작성된 WebSocket 클라이언트 구현을 선택할 때 고려할 사항:

  1. 규정 준수.적지 않은 수의 구현이 RFC 6455에서 요구하는 클로징 핸드셰이크를 구현하지 않습니다. (클로징 핸드셰이크가 구현되지 않으면 어떻게 됩니까?이거 보세요.)
  2. 필수 Java 버전입니다.자바 SE 5, 6, 7, 8 아니면 자바 EE?Android에서도 작동합니까?
  3. 크기. 일부 구현에는 많은 종속성이 있습니다.
  4. wss 지원.
  5. HTTP 프록시 지원.
  6. wss over HTTP 프록시 지원.HTTP 프록시를 통해 wss를 지원하기 위해 WebSocket 클라이언트 라이브러리가 수행해야 하는 작업에 대해서는 HTML5 WebSockets가 프록시 서버와 상호 작용하는 방법의 그림 2를 참조하십시오.
  7. SSL 구성의 유연성.SSLSocketFactory그리고.SSLContext불필요한 제한 없이 활용할 수 있어야 합니다.
  8. 기본 인증확인을 포함하여 열기 핸드셰이크 사용자 정의 HTTP 헤더.
  9. 프록시 서버에서의 인증을 포함하여 HTTP 프록시 협상에서 사용자 지정 HTTP 헤더.
  10. 모든 프레임 타입(연속, 바이너리, 텍스트, 클로즈, 핑 및 퐁)을 전송할 수 있습니다.대부분의 구현은 조각난 프레임요청하지 않은 퐁 프레임을 수동으로 보낼 수 있는 수단을 개발자에게 제공하지 않습니다.
  11. 다양한 WebSocket 이벤트를 수신하는 수신기 인터페이스.열악한 인터페이스는 개발자들을 좌절시킵니다.풍부한 인터페이스는 개발자들이 강력한 애플리케이션을 작성할 수 있도록 도와줍니다.
  12. WebSocket 상태를 조회할 수 있습니다.RFC 6455는 CONNECTING, OPEN, CLOSING 및 CLOSED 상태를 정의하지만 정의된 방식으로 내부 상태 전환을 유지하는 구현은 거의 없습니다.
  13. 소켓 연결에 대한 타임아웃 값을 설정할 수 있습니다. (의 두 번째 인수와 같음)Socket.connect(SocketAddress endpoint, int timeout)방법)
  14. 기본 원시 소켓에 액세스할있습니다.
  15. 직관적으로 사용하기 쉬운 API 여부
  16. 문서화가 잘 되었든 안 되었든.
  17. RFC 7692(WebSocket용 압축 확장) 지원(일명 메시지 축소).
  18. 리디렉션(3xx) 지원.
  19. 다이제스트 인증 지원.

nv-websocket-client는 마지막 2개를 제외한 모든 항목을 다 포함합니다.또한, 작지만 편리한 기능 중 하나는 주기적으로 핑/퐁 프레임을 보낼 수 있다는 것입니다.그것은 전화하는 것만으로도 성취될 수 있습니다.setPingInterval/setPongInterval메서드(JavaDoc 참조).

면책 사항:가와사키 타카히코는 nv-웹소켓-클라이언트의 저자입니다.

기타 고려 사항:

타이러스는 안드로이드에서 작동합니다.그러나 Android 5.0에서 사용하는 SSL 라이브러리는 버그가 있으며 SSL 핸드셰이크에 실패합니다.이 문제는 Android의 최신 버전에서 해결되어야 하지만 Android가 많은 장치에서 업데이트되지 않는 방식에서는 문제가 될 수 있습니다.

다른 웹소켓 구현을 위해 SSL을 구현하는 방법에 따라 이 또한 문제가 될 수 있습니다.

AndroidAsync에는 이 SSL 문제가 없습니다.타임아웃을 설정할 수 없는 것과 같은 다른 문제가 있습니다.

a) 이 파일을 그라들 파일에 추가합니다.

compile 'com.github.nkzawa:socket.io-client:0.3.0'

b) 응용프로그램 활동에서 다음 줄을 추가합니다.

    public class MyApplication extends Application {
     private Socket mSocket;
        {
            try {
               mSocket = IO.socket(Config.getBaseURL());

            } catch (URISyntaxException e) {
                throw new RuntimeException(e);
            }
        }

        public Socket getSocket() {
            return mSocket;
        }
}

c) WebSocket을 호출한 활동에 이 기능을 추가합니다.

     private void websocketConnection() {
            //Get websocket from application
            MyApplication app = (MyApplication ) getApplication();
            mSocket = app.getSocket();
            mSocket.on(Socket.EVENT_CONNECT, onConnect);
            mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
            mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
            mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
            mSocket.on("messageFromServer", onNewLocation);
            mSocket.connect();
        } 


    private Emitter.Listener onConnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            runOnUiThread(() -> {
                if (!isConnected) {

                    RequestSocket mRequestSocket = new RequestSocket();

                    mRequestSocket.setToken("anil_singhania");
                   /* your parameter */
                    mSocket.emit("messageFromClient", new Gson().toJson(mRequestSocket));
                    Log.i("Socket Data", new Gson().toJson(mRequestSocket));
                    isConnected = true;
                }
            });
        }
    };

    private Emitter.Listener onDisconnect = args -> runOnUiThread(() -> {
        isConnected = false;
       /* Toast.makeText(getApplicationContext(),
                R.string.disconnect, Toast.LENGTH_LONG).show();*/
    });

    private Emitter.Listener onConnectError = args -> runOnUiThread(() -> {
         /*   Toast.makeText(getApplicationContext(),
            R.string.error_connect, Toast.LENGTH_LONG).show()*/
    });

    private Emitter.Listener onNewLocation = new Emitter.Listener() {
        @Override
        public void call(final Object... args) {
            runOnUiThread(() -> {


            });
        }
    };

언급URL : https://stackoverflow.com/questions/30547517/which-websocket-library-to-use-in-android-app

반응형