안드로이드 앱에서 사용할 웹소켓 라이브러리는?
웹소켓 연결을 유지하는 백그라운드에서 실행되고 정기적으로 서버로 일부 데이터를 전송하는 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/AndroidAsync는 RFC 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 클라이언트 구현을 선택할 때 고려할 사항:
- 규정 준수.적지 않은 수의 구현이 RFC 6455에서 요구하는 클로징 핸드셰이크를 구현하지 않습니다. (클로징 핸드셰이크가 구현되지 않으면 어떻게 됩니까?이거 보세요.)
- 필수 Java 버전입니다.자바 SE 5, 6, 7, 8 아니면 자바 EE?Android에서도 작동합니까?
- 크기. 일부 구현에는 많은 종속성이 있습니다.
- wss 지원.
- HTTP 프록시 지원.
- wss over HTTP 프록시 지원.HTTP 프록시를 통해 wss를 지원하기 위해 WebSocket 클라이언트 라이브러리가 수행해야 하는 작업에 대해서는 HTML5 WebSockets가 프록시 서버와 상호 작용하는 방법의 그림 2를 참조하십시오.
- SSL 구성의 유연성.
SSLSocketFactory
그리고.SSLContext
불필요한 제한 없이 활용할 수 있어야 합니다. - 기본 인증확인을 포함하여 열기 핸드셰이크의 사용자 정의 HTTP 헤더.
- 프록시 서버에서의 인증을 포함하여 HTTP 프록시 협상에서 사용자 지정 HTTP 헤더.
- 모든 프레임 타입(연속, 바이너리, 텍스트, 클로즈, 핑 및 퐁)을 전송할 수 있습니다.대부분의 구현은 조각난 프레임과 요청하지 않은 퐁 프레임을 수동으로 보낼 수 있는 수단을 개발자에게 제공하지 않습니다.
- 다양한 WebSocket 이벤트를 수신하는 수신기 인터페이스.열악한 인터페이스는 개발자들을 좌절시킵니다.풍부한 인터페이스는 개발자들이 강력한 애플리케이션을 작성할 수 있도록 도와줍니다.
- WebSocket 상태를 조회할 수 있습니다.RFC 6455는 CONNECTING, OPEN, CLOSING 및 CLOSED 상태를 정의하지만 정의된 방식으로 내부 상태 전환을 유지하는 구현은 거의 없습니다.
- 소켓 연결에 대한 타임아웃 값을 설정할 수 있습니다. (의 두 번째 인수와 같음)
Socket.connect(SocketAddress endpoint, int timeout)
방법) - 기본 원시 소켓에 액세스할 수 있습니다.
- 직관적으로 사용하기 쉬운 API 여부
- 문서화가 잘 되었든 안 되었든.
- RFC 7692(WebSocket용 압축 확장) 지원(일명 메시지 축소).
- 리디렉션(3xx) 지원.
- 다이제스트 인증 지원.
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
'programing' 카테고리의 다른 글
post_date_gmt 대신 post_meta date 쿼리 (0) | 2023.10.23 |
---|---|
Angularjs: iframe에서 다른 스코프를 호출합니다. (0) | 2023.10.23 |
커널 스레드란? (0) | 2023.10.23 |
스위프트에서 애니메이션에서 단순한 페이드를 만들라고요? (0) | 2023.10.23 |
C 구조를 선언하는 구문론적으로 적절한 방법은 무엇입니까? (0) | 2023.10.23 |