안녕하세요.. 문득 궁금한게 생겨서 질문드립니다.
소켓으로 통신을 하는게 좋은지..
그냥 톰캣기반위에 jsp로 데이타 주고받는게 나은지..
어떤 차이점이 있는지 궁금합니다...
^^
Have a nice day
어떤 데이터를 어떤 방식으로 주고 받을건지에 따라서 나눠질것 같네요.
일반적으로 웹서버의 한계라 하면.. 클라이언트의 요청(request)이 있을때만 서버가 응답(response)하여 통신이 가능할뿐, 서버가 먼저 요청하고 클라이언트로부터 응답받을 수 없는 단향뱡적인 통신이라는 점입니다. 또한 비연결지향형 이기 때문에 데이터 전송 부분 외에도 서버에 연결하는 시간 비용이 추가로 들어가는 단점이 있습니다. 따라서 단순히 클라이언트가 필요할때만 서버에서 접근하는 "콘텐츠" 위주의 데이터를 사용하고자 할때는 웹서버가 용이하겠죠. 예를 들자면 게시판 같은 구조.(클라이언트가 필요할때만 서버에서 접근해서 게시판 자료를 가져오지요)
하지만 위에서 말씀드렸듯이 서버와 클라이언트가 언제든지 양방향으로 필요한 데이터를 요청하고 보내고자 할때는 소켓서버를 이용하게는게 좋습니다. 실시간으로 양방향 데이터 통신이 필요할때, 가령 채팅처럼 서로 바로바로 통신하고자 할때 처럼 말이예요.
하지만 신뢰성있고 고용량의 데이터을 주고 받고 다수 사용자를 수용하는 소켓서버를 만들기는 쉽지만은 않습니다.
따라서 구글에서는 구현하기 쉬운 웹서버를 이용하여, 양방향 통신을 할수 있도록 GCM (google cloud messaging) 서비스를 제공하고 있지요. 소켓서버와 웹서버를 동시에 운영하는 방식인데요. 소켓 서버는 단순히 서버가 특정 클라이언트와 통신이 필요하다는 아주 간단한 텍스트 메세지만 전달하고 이를 전달받은 클라이언트는 웹서버에서 접속함으로써, 쌍방향 통신을 가능하도록 구현한 기술입니다.
안드로이드 업데이트, 메세징 프로그램들이 이러한 방식으로 만들어져 있지요.
물론 GCM 방식도 웹서버의 한계인 클라이언트와 서버간 양방향 통신에 대한 단점을 커버하기위해 등장했지만 여전히 웹서버를 사용하기 때문에 속도면에서는 소켓서버에는 따라갈수 없습니다.
결론,
클라이언트에서 필요할때만 서버에 접근해서 데이터를 가져오면 된다 (+ 속도는 크게 신경쓰지 않는다) 하면 웹서버를
서버와 클라이언트간 양방향의 빠른 데이터 통신이 필요하다! 하면 소켓서버를 만드시면 됩니다.
허허 위에 http 통신만 한다고 하시는 분은 통신을 직접해보시지 않으신분 같습니다.
저의경우에는 안드로이드에서는 java.net과 피씨 즉 서버에서는 winsock으로 각각 TCP/IP 통신을 합니다.
http 통신은 TCP/IP 바다 상위 레이어에서 이용되는 통신으로 쉽지만 조금더 느릴겁니다.
TCP/IP통신은 하드웨어나 소프트웨어 언어와는 무관하게 사용될수 있도록 설계된 프로토콜입니다.
BSD 소켓 통신 모델 기반으로 합니다.
검색어는 osi 7layer , 버클리 소켓 ,자바 소켓통신 ,C++ 소켓통신 이런 쪽을 검색해보시면 될것이라고 생각합니다.
http 방식은 지양하신다는 말씀인가요?
모바일 환경에서는 커넥션 유지가 제대로 되지 않아서 http 프로토콜의 웹서버 방식을 통해서 비연결지향형 통신을 많이 하는걸로 알고 있습니다. 말씀하신대로라면, 단순히 서버에서 단순 이미지, 텍스트를 받아올 필요가 있을때, (게시판처럼)
iis/아파치 같은 이미 구축된 웹서버를 이용해서 http 프로토콜을 이용하는게 아니라,
직접 소켓서버를 구현해서 통신하는 방식을 취하시는건가요? 그럼 커넥션은 계속 유지하고 있나요?
저는 이제막 사회 초년생이라 개발경력이 많지 않고 아직 큰 규모의 프로젝트를 접해보지 않아서,
상용화 앱들은 어떤 방식을 취하는것인지 궁금하네요~
저는 그냥 아파치 상용프로그램으로 http통신을 한다는 글을 반박했던것이고 저도 상용프로그램을 만든다면 node.js를 추천합니다.
저의 경우는 TCP/IP로 이미지 반복전송, 문자열전송등으로 내년 졸업을 하기위해 어플을 만들어본 내용을 기반으로 썻던 글입니다.
이미지 반복전송의 경우는 connect를 유지하고 소캣의 접속이 유지되있으면 이미지를 반복전송하고
메세지 전송은 한번에 메세지를 쫙 보내고 connect를 종료하는 방식으로 만들었습니다.
동기/동기 모델이지만 접속이 엇나가는 일은 거의 없네요 LTE라서 그런가 ㅠㅠ
오라클 펌
Servlet Mode Advantages
- HTTP and HTTPS traffic is easily recognizable by routers, while socket mode communications is generally considered suspect and treated on an exception basis.
- Existing networking hardware can be used to support basic functions such as load-balancing and packet encryption for network transit.
- More resilient to network and firewall reconfigurations.
- More robust: servlet connections can be reestablished if network connections drop unexpectedly for Forms, Framework, and JSP-based pages.
- Is the only supported method for generic Oracle Forms customers, and therefore is more thoroughly tested by the Forms and E-Business Suite product groups.
- Performance traffic can be monitored via tools like Oracle Real User Experience Insight (RUEI).
- Socket mode is not supported on Windows-based server platforms.
Socket Mode Advantages
- Uses up to 40% less bandwidth than Forms servlet mode. This may be perceived by Wide Area Network (WAN) users as causing slower responsiveness, depending upon network latency.
- Uses fewer application-tier JVM resources than servlet mode, due to fewer TCP turns and lack of overhead associated with HTTP POST handling.
참고로 Apache는 HTTP 모듈을 얹은 서버이고, 때문에 원한다면 HTTP container를 올리지 않고 단순 서버로 사용할 수 있습니다.
이것은 Tomcat 등도 마찬가지이죠.
단순 요약한다면,
3G 네트워크 상에서는 모든 면에서 소켓 >>> 웹서버 입니다.
이것은 패킷 사이즈 때문입니다.
개발 측면에서 본다면
웹서버 >>>> 소켓 입니다.
웹서버를 활용할 경우, 프로토콜 설계가 매우 편리하고 서버의 유지보수 관리측면도 좋아지죠.
소켓통신을 하고자 한다면, C, Java 등보다 node.js 를 추천합니다.
event driven 방식은 서버에게 굉장한 이점이 있습니다.
C는 기본적으로 이를 구현할 수 있지만 매우 어려운 개념이고,
Java 는 Nio를 습득해야 하는데
그냥 node.js 를 배우는게 더 쉬울거라는 생각입니당
제가 말실수를 한것 같네요. 저는 맨위 댓글에 안드로이드는 그냥 아파치 상용 프로그램을이용해서 http통신을 한다고 한것에 반박하는 글을 하고싶었던것입니다.
저는 아직 학부생 3학년이라서 네트워크쪽 수업을 들었던 내용을 상기해서 썻던것이고 저도 TCP/IP를 이용해서 안드로이드 어플이나 PC용 어플리케이션을 개볼해본 경험밖에 없기 때문에 그 내용으로 설명했던 것입니다.
저도 동기/동기 서버모델로 진행햇지만 스마트폰의 연결이 고르지 못한것을 이미 많이 경험 했기때문에
직접 개발을 한다면 비동기 비연결 모델로 진행하는것을 추천하겟습니다 저도 추천하라고한다면 node.js를 추천합니다
안드로이드의 경우는 그냥 Http socket을 사용합니다.
Java 의 HttpURLConnection 또는 apache의 HttpClient 를 이용해서
컨넥트를 쉽게 처리 합니다.