WEB/웹통신 관련

자바스크립트 웹소켓 모바일,디바이스 연결시 3G, LTE, WIFI 등등 연결 바뀌거나 끊겼을때 방법 관련

AlrepondTech 2018. 11. 7. 18:26
반응형



 

=================================

=================================

=================================

 

 

 

 

 

 

출처: http://www.androidside.com/bbs/board.php?bo_table=B49&wr_id=158027

 

 

안드로이드, 자바 그리고 다양한 질문에 대해 성실히 답해드립니다. Q&A Jang



 안녕하세요 강턱형님입니다.

socket.io를 이용한 채팅구현을 작업한지 꽤 되었는데 새로운 문제에 봉착하여

안사 고수님들께 자문을 구하려고 합니다.

 

현재 소켓 통신부분 중 안드로이드 클라이언트에서 onUserLeaveHint() 를 이용하여 home key 나 recent key 를 누르면 소켓을 아예 끊어버리도록 구현을 하고 BaseActivity 의 onResume() 에서는 항상 소켓이 연결되어있는지 체크를 하고 있습니다. 만약 소켓이 연결되어있지 않다면 연결요청을 하고요.

그런데 새로운 문제가 생겼습니다.

lte -> wifi & wifi -> lte 로 네트워크를 변경하게 되면 onUserLeaveHint()가 호출이 되더라고요. 테스트 상으론 각각 두번씩 호출이 되는데 문제는, 네트워크 변경시 onUserLeaveHint() 가 호출이 돼서 소켓을 끊고 다시 onResume() 이 호출이 되면서 소켓 연결을 요청하게 되는데, 소켓이 연결 되기도 전에 onUserLeaveHint() 가 다시 호출이 되어버려서 소켓 자체가 연결이 안되고 있습니다.

그리고 테스트를 해보니 lte -> wifi 로 네트워크를 변경할 때는 굳이 소켓을 끊어주지 않더라도 문제없이 소켓이 연결되어있지만 wifi -> lte 로 네트워크를 변경하니 중간에 네트워크 연결 자체가 끊어져버린 뒤 다시 lte 로 연결됩니다.

이 부분들 때문에 굉장히 애를 먹고 있습니다.

 

안사 고수님들.

네트워크를 변경하게 되면 소켓을 아예 끊었다가 다시 연결하는게 맞는건지요?

만약 그렇다면 위와 같은 문제를 어떻게 해결해야 할지 조언좀 부탁드립니다.

감사합니다.

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

1. 네트웍 상태변경 리스너(또는 BR)를 사용해보셔요..


2. 상태가 바뀌면 당연 IP가 변경되므로 소켓을 재설정하셔야것지요..
 
----------------------------------------------------------------------------------------------------------------------

 

네트워크가 변경되면 소켓을 다시 연결해야 하는데 제가 당연한걸 여쭤보았네요ㅎㅎ

그런데 지금도 network change를 broadcast로 받아서 이벤트는 잡고 있거든요 근데 변경시 연달아 2번정도 알려주길래 이 부분이 애매해서.. 이것들을 감안하고 기다리게끔 한다음 다시 연결해야 하는건가요?

 

----------------------------------------------------------------------------------------------------------------------

연달아 두번온다면 아마도 
NETWORK_STATE_DISCONNECTED/NETWORK_STATE_CONNECTED
이런 상태값일것이니 상태값을 점검해서 상태에 맞게 변경해주심 되것네요
------------------------------------------------------------------------------------------------------------------------

채택이 너무 늦어서 죄송하네요

많은 조언 덕분에 잘 해결하였습니다 ㅎㅎ

통신 속도문제인지, 이전 소켓을 끊고 다시 연결하는데 시간이 좀 걸리긴 하지만 그래도 깔끔히 처리가 되었

습니다. 너무 감사합니다 ㅎㅎ

 

 

 

 

반응형

 

 

728x90

 

 

 

=================================

=================================

=================================

 

 

출처: http://www.masterqna.com/android/61199/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%AC%EC%9A%A9%EC%9C%BC%EB%A1%9C-%EC%9B%B9%EC%86%8C%EC%BC%93-%EC%97%B0%EA%B2%B0%ED%9B%84-%EC%99%80%EC%9D%B4%ED%8C%8C%EC%9D%B4%EA%B0%80-%EA%B0%90%EC%A7%80%EB%90%98%EB%A9%B4-%EC%9B%B9%EC%86%8C%EC%BC%93%EC%9D%B4-%EB%81%8A%EC%96%B4%EC%A7%91%EB%8B%88%EB%8B%A4-%EB%A7%9E%EB%8A%94%EA%B1%B4%EA%B0%80%EC%9A%94

 

 

데이터 통신 상태에 두고 (와이파이 OFF) 특정 서버에 웹소켓 연결 후 앱을 사용하고 있다가

와이파이를 켜면 잠시후 웹소켓이 끊어지고 있는데요.

와이파이가 잡히면 네트워크 우선순위가 와이파이가 되어 연결되어 있던 웹소켓 연결을 끊어버리는건가요?

 

만약 그렇다면.. 방어코드는 어떤식으로 해야 할까요?

얼핏 생각하기에는

웹소켓 연결시점에서 다른 네트워크가 감지되어도 무시하는 방법인데..

다른 의견 있으신가요?

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

TCP 는 연결지향입니다.

 

네트워크 상태가 바뀌면 기존에 커넥트 되어 있는 socket을 그대로 쓸수없고 다시한번 바뀐 네트워크안에서 핸드쉐이크가 발생해야 합니다.

 

아마 어떤 라이브러리를  쓰든간에 사용하시는 웹소켓은 TCP기반의 모듈일 것이라 생각됩니다. 네트워크상태가 바뀌었다는것을 알수 있으면 그 시점에 다시한번 서버에 연결하는 작업이 필요합니다.

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

네 감사합니다.
구글링해서 알아보니 데이터 통신보다 와이파이가 우선순위가 높다고 나오네요. 그렇다고 연결중인 데이터 통신을 끊어버리고 와이파이로 재접속을 해야하는것은 좀 그렇네요. ㅠㅠ

 

 

 

=================================

=================================

=================================

 

 

 

#기타관련링크

https://stackoverflow.com/questions/5557776/websockets-over-a-3g-connection

 

https://www.slideshare.net/iFunFactory/pc-p2p

 

 

=================================

=================================

=================================

 

 

반응형