서버 측에 적합한 XMPP Java 라이브러리?
Java로 간단한 XMPP 서버를 구현하고 싶었습니다.
내가 필요한 것은 클라이언트의 xmpp 요청을 구문 분석하고 이해할 수있는 라이브러리입니다. Smack (아래 언급)과 JSO를 살펴 보았습니다. Smack은 클라이언트 전용 인 것처럼 보이므로 패킷을 구문 분석하는 데 도움이 될 수 있지만 클라이언트에 응답하는 방법을 모릅니다. JSO는 매우 오래된 것처럼 보입니다. 유망한 유일한 방법은 전체 상용 (OSS) XMPP 서버 인 Openfire를 분리하는 것입니다.
Netty 또는 Mina 위에 몇 줄의 코드를 기대하고 있었기 때문에 유선에서 일부 메시지 처리를 시작할 수있었습니다.
조-
내가하려는 것에 대한 답은 다소 길다. 짧게 유지하려고 노력할 것이다.
느슨하게 관련된 두 가지가 있습니다.
1) 두 클라이언트가 통신 할 수있는 사용자 지정 프로토콜을 작성하는 것을 상상하기 때문에 XMPP 서버를 작성하고 싶었습니다. 기본적으로 저는 네트워크로 연결된 iPhone 앱을 생각하고 있지만 XMPP와 같은 것을 사용하면 앱이 로컬 Wi-Fi 기반 앱에서 인터넷 기반 앱으로 매우 빠르게 "성장"할 수 있기 때문에 저수준 바이너리 프로토콜에 의존하고 싶지 않았습니다. ...
교환되는 메시지는 상대적으로 낮은 지연 시간이어야하므로 엄밀히 말하면 바이너리 프로토콜이 가장 좋지만 XMPP가 오버 헤드를 너무 많이 도입하지 않아서 사용하고 확장 성의 이점을 얻을 수 있다면 살펴볼 가치가 있다고 느꼈습니다. 그리고 나중에 유연성.
2) 저는 테라코타에서 일하고 있습니다. 커스텀 서버 코드를 작성하는 것에 대해 생각하기 시작하자마자 클러스터링을하고 싶다고 생각했습니다. Terracotta는 Java POJO의 확장을 사소하게 만들었습니다. 그래서 저는 Terracotta 용 데모 앱으로 매우 간단한 XMPP 서버를 구축하려고했습니다. 기본적으로 각 사용자는 TCP 연결을 통해 서버에 연결하여 사용자를 해시 맵에 등록합니다. 각 사용자는 대기열에서 메시지를받는 리스너 스레드가있는 LinkedBlockingQueue를 갖게됩니다. 그런 다음 다른 사용자 (예 : 이전 채팅 응용 프로그램)에게 메시지를 보내려는 연결된 사용자는 연결을 통해 해당 사용자에게 (평상시처럼) XMPP 메시지를 보냅니다. 서버는이를 선택하고지도에서 해당 사용자 개체를 찾아 대기열에 메시지를 배치합니다. 큐가 클러스터되어 있으므로
그래서 요약이 너무 짧지 않은 것 같습니다. 하지만 그게 제가하고 싶은 일입니다. 나는 Openfire 용 플러그인을 작성하여 # 1을 수행 할 수 있다고 생각하지만 많은 배관 작업을 처리하므로 # 2를 수행하기가 더 어렵다고 생각합니다 (특히 A에 들어갈 수있는 매우 적은 양의 코드를 원했기 때문에 간단한 10-20kb Maven 프로젝트).
http://xmpp.org/xmpp-software/libraries/ 에는 XMPP 용 소프트웨어 라이브러리 목록이 있습니다. 다음은 오래된 스냅 샷입니다.
액션 스크립트
씨
C ++
C # / .NET / 모노
얼랑
플래시
Haskell
자바
자바 스크립트
Lisp
목표 -C
Perl
PHP
파이썬
루비
Tcl
나는 같은 수색을했다. 처음에 Smack을 시도한 다음 c2 (클라이언트에서 서버로)를 대상으로하고 필요한 것이 없다는 것을 깨달았습니다. 나는 Tinder를 보았지만 라이선스 모델이 마음에 들지 않았습니다 (또한 내가보기에는 훨씬 더 원시적이었습니다). 나는 마침내 Whack을 보았고 그것이 내가 필요하다는 것을 깨달았습니다.하지만 많은 것을 놓쳤습니다 (Tinder가 나온 이유입니다).
그래서 .. 내 솔루션? Forked Whack, 추상화를위한 코드 추가, 사용하기 더 쉽게 만들기 : http://github.com/Communitivity/Adirondack
외부 구성 요소 기반 에이전트를 만드는 데 도움이되도록이를 기반으로하는 Scala 라이브러리를 작성했습니다. http://github.com/Communitivity/Shellack 및 http://github.com/Communitivity/MinimalScalaXMPPComponent를 참조하십시오.
One of my main goals was to make it easy to write a component quickly. An example of such a component is below:
object Main {
/**
* @param args the command line arguments
*/
def main(args: Array[String]) :Unit = {
new XMPPComponent(
new ComponentConfig() {
def secret() : String = { "secret.goes.here" }
def server() : String = { "communitivity.com" }
def subdomain() : String = { "weather" }
def name() : String = { "US Weather" }
def description() : String = { "Weather component that also supported SPARQL/XMPP" }
},
actor {
loop {
react {
case (pkt:Packet, out : Actor) =>
Console.println("Received packet...\n"+pkt.toXML)
pkt match {
case message:Message =>
val reply = new Message()
reply.setTo(message.getFrom())
reply.setFrom(message.getTo())
reply.setType(message.getType())
reply.setThread(message.getThread())
reply.setBody("Received '"+message.getBody()+"', tyvm")
out ! reply
case _ =>
Console.println("Received something other than Message")
}
case _ =>
Console.println("Received something other than (Packet, actor)")
}
}
}
).start
}
}
Ignite Realtime shares its Tinder API which is a basic building block extracted from OpenFire just for the creation of server-side components and possibly other servers. It implements basic XMPP building blocks and you are free to start from there.
Also from Ignite Realtime is the Whack API which is specifically for building XMPP components
Whack is an Open Source XMPP (Jabber) component library for XMPP components. A pure Java library, it can be embedded into your applications to create anything from a full XMPP component to simple XMPP integrations such as sending intercepting and acting on certain messages.
Your best bet is to use an existing server, and add your functionality to it. Writing an entire server from scratch, even using a library, is going to be a lot harder than you expect.
Can you tell us more about the problem you are trying to solve? We can then point you to an appropriate server, and help you with the right place to plug in.
check this out:
this is a lower level library. it is in incubation status and it seems nobody is pushing it. but it is a great api and i hope it will progress.
http://java.net/project/jso-jabber-stream-objects
I think you already looked at the right solution: Openfire
It's not a commercial solution. It's an XMPP Server on top of Mina and Jetty written in Java released under the Apache License. Comes pretty close to what you asked for. While I know that you asked for a library, why not use some stable developed open source software that can easily be extended like openfire?
I found a good xmpp server based on Java : http://www.tigase.org/
Have a look at Vorpal. Its a Java EE 6 framework that implements XEP-0114 protocol.
I know that the intent is to build a small hack in the OP. However, if there is ever an interest in scaling it, end-to-end security, etc. I would suggest looking at Soapbox from Coversant. They are our partner. We use SMACK on our hard realtime virtual machine environment, JamaicaVM to communicate with Soapbox.
Also, if the intent is to communicate with a server app, and not to reimplement an XMPP server (e.g. Soapbox), the SMACK client can be used for that. It is a client to the XMPP server, but the instance of actual communications can be from client to client through the XMPP server.
참고URL : https://stackoverflow.com/questions/177514/good-xmpp-java-libraries-for-server-side
'Programing' 카테고리의 다른 글
ORDER BY 절은 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 유효하지 않습니다. (0) | 2020.12.02 |
---|---|
ffmpeg concat :“안전하지 않은 파일 이름” (0) | 2020.12.02 |
Android-홈 버튼 클릭을 비활성화 할 수 있습니까? (0) | 2020.12.02 |
VS2012 용 Crystal Reports-VS2013-VS2015-VS2017 (0) | 2020.12.01 |
프로그래밍 방식으로 Spring을 사용하여 작업 예약 (동적으로 설정되는 fixedRate 사용) (0) | 2020.12.01 |