필자는 ichat와 같은 P2P 인스턴트 메신저 프로젝트를 진행하고 있지만 LAN에 대해서만 설명하고 있습니다.
서비스 발견을 위해 jmdns 라이브러리를 사용하고, pidgin으로 테스트하고 Bonjour 사용자로 로그인하십시오. 지금까지 _presence._tcp.local 서비스. 잘 발견되면,
그러면 우리는 이름 @ 호스트 : 포트와 같은 LAN에서 사용자의 정보를 알고 있으므로 Bonjour 클라이언트와 대화를 시작하는 방법은 무엇입니까?
XMPP를 조사했지만 P2P를 지원하지 않지만 P2P를 지원하는 확장 프로그램 인 jingle 용 라이브러리를 거의 찾을 수 없습니다.
대화를 나누려면 SIP를 사용해야할까요? 패킷 형식은 Bonjour와 호환됩니까? 또는 교환 된 패킷의 구조를 연구해야합니까?
LAN에 대해 ichat이 어떻게 작동하는지 조금이라도 설명 할 수 있습니까?
친절한 도움을 많이 주셔서 감사합니다.
이름 @ 호스트 : 포트를 알고있는 봉주르 클라이언트와 대화를 시작하는 방법?
답변
나는 약간 혼란 스럽다고 생각합니다.
Bonjour는 서비스를 찾기위한 메커니즘입니다. 서비스와 통신하는 것이 아닙니다. @ host : port 정보라는 이름을 찾으면 Bonjour가 완성됩니다.
다음 단계에서는 서비스에서 이해할 수있는 프로토콜에 대해 이야기해야합니다. 서비스 문자열의 _presence
토큰은 이것이 XMPP 서비스임을 나타냅니다. XMPP에 대해 이야기해야합니다. SIP에 SIP를 말할 수 없습니다. 찾은 호스트와 포트에 대한 XMPP 연결을 열어 보았습니까?
SIP와 징글 링에 대해 이야기합니다. 이들은 오디오 또는 비디오 호출을 설정하는 데 사용됩니다. 인스턴트 메시징 프로그램을 작성하는 경우이 작업을 수행 할 필요가 없습니다. XMPP만으로 충분합니다.
오디오 또는 비디오를 지원하려면 해당 프로토콜 중 하나가 필요합니다. 발견 한 서비스가 XMPP 서비스이기 때문에 Jingle을 사용해야합니다. 징글을 말할 수있는 도서관이 없다면 직접 코드를 작성해야합니다. Bonjour 정보에는 SIP 서비스를 식별하는 정보가 없으므로 다른 Bonjour 쿼리를 작성하고 SIP 서비스를 찾을 수있는 경우가 아니면 SIP를 사용할 수 없습니다.
저는 당신이 자바로 작업하고 있다고 추측합니다. Java에서 가장 많이 사용되는 XMPP 라이브러리는 Smack입니다.
SIP를 사용하실 수 있습니다. MDNS가 검색 메커니즘이 될 것이고 전화를 걸기 위해 일반 SIP를 사용할 것입니다. 하나는 다이얼하려는 URI를 배웠습니다.
SIPSIMPLE SDK (http://sipsimpleclient.com)는이 만료 된 초안을 사용하여이 기능을 구현합니다. http://tools.ietf.org/html/draft-lee-sip-dns-sd-uri-03 좋은 시작일 수 있습니다.
기본적으로 클라이언트는 sip : random_stuff @ ip : port와 같은 URI를 생성 한 다음 MDNS를 사용하여 표시 이름과 함께 게시합니다. 또한 응용 프로그램은 MDNS에서 LAN의 피어를 찾아 봅니다 (예 : _sipuri._udp). URI를 얻으면 SIP를 사용하여 전화를 걸 수 있습니다.
모두의 관심에 감사 드리며, 이제 나는 뭔가를 발견했습니다. XMPP는 P2P 모드를 지원하지 않으며 클라이언트 - 서버 클라이언트 만 지원합니다. 하지만 로컬 네트워크에서 P2P 채팅에 적합한 다른 표준 "XEP-0174 : Serverless Messaging"이 있습니다. DNS-SD + XEP-0174, ichat는 이러한 방식으로 작동합니다.
나는 가짜 라이브러리를 사용하기 때문에 p2P를 지원하지 않습니다. 누군가가 약간의 변경을했는데 여기에 링크가 있습니다 http://issues.igniterealtime.org/browse/SMACK-262.
나는이 XMPPLLConnection을 시도하지 않았으며, 나는 마약의 소스 코드를 조사했다. 소켓 연결을 기반으로한다. 불행히도 XEP-1074 용 자바 라이브러리가 없으므로 소켓을 통해 xml 스트림에서 작업해야합니다.
XMPP 연결을 여는 중입니다. 예, 문제가 해결되었습니다. 어떻게? 소켓 연결 또는 패킷의 형식을 신경 쓰지 않는 적절한 라이브러리가 있습니까? 답변 주셔서 감사합니다! – seaguest
아, 맞아. Smack이라는 라이브러리에 대한 링크를 추가했습니다. –
고마워요.하지만 실제로 나는 헤로인을 들여다 보았습니다. 서버의 도움으로 다른 사람들과 대화를 나눌 수 있다는 것을 알고 있습니다. 하지만 이제는 서버가 없으므로 P2P이므로 서버없이이 작업을 수행 할 수 있습니까? – seaguest