怎样实现从服务器向所有与它连接的客户端发通知? 看你是用什么连接的啦~!Scoket连接的话,直接用连接发就是了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 NOTE: 问题的关键在于服务器在Internet上,而客户端通过局域网上网访问,它们不在同一个网络内。所以上述二位的方法行得通吗? OK提得不错请看package csm.jms;import javax.swing.*;import javax.naming.*;import javax.jms.*;import java.util.*;import csm.jms.exception.*;import csmcore.jms.entitybean.*;import csmcore.jms.entityview.*;import csmcore.jms.exception.*;import javax.ejb.*;import java.rmi.*;import csmcore.jms.sessionbean.*;public class CsmPublisher { private String hostName=""; private String topicName=""; private CsmSubPubConnMgr mgr=null; private JmsClientDetail bean=null; private TopicConnectionFactory topicFactory=null; private TopicSession topicSession=null; private TopicPublisher publisher=null; private Topic topic=null; public CsmPublisher(String host,String topic) { this.hostName = host; this.topicName = topic; mgr = CsmSubPubConnMgr.getInstance(host, topic); bean = mgr.getJmsClientDetail(); topicFactory = mgr.getFactory(); //topic = mgr.getTopic(); } public void sendMsg(String msg)throws JmsPublisherException{ try { String uid=bean.assignUser("p"); if(!uid.equals("none")) { TopicConnection conn = topicFactory.createTopicConnection(uid, uid); topicSession = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); publisher = topicSession.createPublisher(mgr.getTopic()); conn.start(); TextMessage txtMsg = topicSession.createTextMessage(); txtMsg.setText(msg); publisher.publish(txtMsg); conn.close(); bean.unassignUser(uid); }else { JOptionPane.showMessageDialog(null,"用于发送的客户连接数已经用尽"); } }catch(Exception ex){ throw new JmsPublisherException("连接JMS服务器出错:"+ex); } }}package csm.jms;import javax.naming.*;import javax.jms.*;import java.util.*;import csm.jms.exception.*;import csmcore.jms.entitybean.*;import csmcore.jms.entityview.*;import csmcore.jms.exception.*;import javax.ejb.*;import java.rmi.*;import csmcore.jms.sessionbean.*;public class CsmSubPubConnMgr { private static Context ctx=null; private static TopicConnectionFactory topicFactory=null; private static TopicConnection conn=null; private static TopicSession topicSession=null; private static Topic topic=null; private static TopicSubscriber sub=null; private static CsmSubPubConnMgr m_instance=null; private static JmsClientDetail bean=null; private CsmSubPubConnMgr() { } public JmsClientDetail getJmsClientDetail(){ return bean; } public Topic getTopic(){ return topic; } public TopicConnectionFactory getFactory(){ return topicFactory; } synchronized public static CsmSubPubConnMgr getInstance(String hostName,String topicName) { if(m_instance==null) { try { Properties p = new Properties(); System.setProperty("java.security.policy","policy"); System.setProperty("javax.net.ssl.trustStore", "csmkey"); System.setProperty("javax.net.debug","ssl"); Properties sessionp = System.getProperties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming"); p.put(Context.PROVIDER_URL, hostName); //JOptionPane.showMessageDialog(null,hostName+":343"); p.setProperty("jnp.timeout", "0"); p.setProperty("jnp.sotimeout", "0"); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); p.put(Context.PROVIDER_URL, hostName); ctx = new InitialContext(p); Object obj = ctx.lookup("JmsClientDetail"); JmsClientDetailHome home = (JmsClientDetailHome) javax.rmi.PortableRemoteObject.narrow( obj, JmsClientDetailHome.class); bean = home.create(); topic = (Topic) ctx.lookup(topicName); topicFactory = (TopicConnectionFactory) ctx.lookup("ConnectionFactory"); }catch(Exception ex){ System.out.println("jms error:"+ex); return null; } m_instance=new CsmSubPubConnMgr(); } return m_instance; }}import csmcore.jms.entitybean.*;import csmcore.jms.entityview.*;import csmcore.jms.exception.*;import javax.ejb.*;import java.rmi.*;import csmcore.jms.sessionbean.*;public class CsmSubscriber extends Thread implements MessageListener{ private static TopicSubscriber sub=null; private static String csmMsg=""; private static TopicConnection conn=null; private static TopicConnectionFactory factory=null; private static TopicSession topicSession=null; private static CsmSubPubConnMgr mgr=null; private static JmsClientDetail bean=null; private static Topic topic=null; private static String uid=""; private static CsmSubscriber m_instance=null; public String returnUid(){ return this.uid; } public void closeProcess(){ try { conn.close(); //JOptionPane.showMessageDialog(null,""+uid); bean.unassignUser(uid); }catch(Exception ex){ JOptionPane.showMessageDialog(null,"error:"+ex); } } public void closeProcess(String userName){ try { conn.close(); //JOptionPane.showMessageDialog(null,""+uid); bean.unassignUser(userName); }catch(Exception ex){ JOptionPane.showMessageDialog(null,"error:"+ex); } } synchronized public static CsmSubscriber getInstance(String hostName,String topicName){ if(m_instance==null) { try { System.out.println("begin"); mgr = CsmSubPubConnMgr.getInstance(hostName, topicName); System.out.println("done1"); factory = mgr.getFactory(); System.out.println("done2"); bean = mgr.getJmsClientDetail(); System.out.println("done3"); uid = bean.assignUser("s"); //JOptionPane.showMessageDialog(null,"assign user:"+uid); if (!uid.equals("none")) { conn = factory.createTopicConnection(uid, uid); System.out.println("done3"); topic = mgr.getTopic(); System.out.println("done4"); //conn.setClientID("csmsubid"); topicSession = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); System.out.println("done5"); sub = topicSession.createDurableSubscriber(topic, "csmjms"); System.out.println("done6"); } else { JOptionPane.showMessageDialog(null, "用于接收的客户连接数已经用尽"); } //JOptionPane.showMessageDialog(null,""+sub.getTopic().toString()); } catch (Exception ex) { JOptionPane.showMessageDialog(null, "init error:" + ex); return null; } m_instance=new CsmSubscriber(); } return m_instance; } private CsmSubscriber() { } public void run() { try { sub.setMessageListener(this); conn.start(); }catch(Exception ex) { JOptionPane.showMessageDialog(null,"set listener error:"+ex); } } public String getMessage() { try { return this.csmMsg; }catch(Exception ex){ JOptionPane.showMessageDialog(null,"error:"+ex); return ""; } } public void onMessage(Message msg) { try { TextMessage tm=(TextMessage)msg; //JOptionPane.showMessageDialog(null,"tm:"+tm.getText()); this.csmMsg=tm.getText(); //return; }catch(Exception ex){ JOptionPane.showMessageDialog(null,"error:"+ex); } }} 关键在于发送方:TopicConnection conn = topicFactory.createTopicConnection(uid, uid); topicSession = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); publisher = topicSession.createPublisher(mgr.getTopic()); conn.start(); TextMessage txtMsg = topicSession.createTextMessage(); txtMsg.setText(msg); publisher.publish(txtMsg); conn.close();接收方:public void onMessage(Message msg) { try { TextMessage tm=(TextMessage)msg; //JOptionPane.showMessageDialog(null,"tm:"+tm.getText()); this.csmMsg=tm.getText(); //return; }catch(Exception ex){ JOptionPane.showMessageDialog(null,"error:"+ex); }记住,我上面的是全部的源码,你会看到一个bean = mgr.getJmsClientDetail();这是一个EJB方法,作用在于动态的在运行时给JMS分配一个CLIENTID和PWD,为什么要这样,因为JBOSS不能N个客户端共用一个CLIENTID,而WEBLOGIC可以,因此一个CLIENT端要连,就要分配一个(动态的改JBOSS内的XML和数据库)中的一个CLIENTID下面给出JMS BEAN的源码package csmmdb;import javax.ejb.MessageDrivenBean;import javax.jms.MessageListener;import javax.ejb.MessageDrivenContext;import javax.ejb.CreateException;import javax.jms.Message;import javax.jms.*;public class csmjmsBean implements MessageDrivenBean, MessageListener { MessageDrivenContext messageDrivenContext; public void ejbCreate(){ } public void ejbRemove() { } public String getAss(){ return "asshole"; } public void onMessage(Message msg) { try { TextMessage tm=(TextMessage)msg; System.out.println(tm.getText()); }catch(Exception ex){ System.out.println("jms server error:"+ex); } } public void setMessageDrivenContext(MessageDrivenContext messageDrivenContext) { this.messageDrivenContext = messageDrivenContext; }}ejb-jar.xml:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"><ejb-jar> <display-name>csmjms</display-name> <enterprise-beans> <message-driven> <display-name>csmjms</display-name> <ejb-name>csmjms</ejb-name> <ejb-class>csmmdb.csmjmsBean</ejb-class> <transaction-type>Container</transaction-type> <message-driven-destination> <destination-type>javax.jms.Topic</destination-type> <subscription-durability>Durable</subscription-durability> </message-driven-destination> </message-driven> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>csmjms</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor></ejb-jar>jboss.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.2//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_2.dtd"><jboss> <enterprise-beans> <message-driven> <ejb-name>csmjms</ejb-name> <destination-jndi-name>topic/csmjms</destination-jndi-name> <mdb-user>csm</mdb-user> <mdb-passwd>isdnymk</mdb-passwd> <mdb-subscription-id>csmjms</mdb-subscription-id> </message-driven> </enterprise-beans></jboss> 这样就会有一个很好玩的效果,你发一条消息,所有连在服务器上的CLIENT就会同时得到,这时如果有一个CLIENT把网线刚连上这台SERVER,这台新连上的CLIENT端也会得到消息,这就是durable/publisher的好处,至于有人说什么用SOCKET,OMG,在J2EE的中间件内用SOCKET通信,你去试试看 jQuery+json+struts2的ajax返回的问题 求解决!!!删了重做.还是这个情况。数据库查询是两表联查! struts2整合sitemesh的多装饰器问题 <s:if>获取不到我传递过来的值! tomcat的问题 80分type Exception report! struts2的异常 sql语句取不到表里字段值 数据库驱动问题 如何把jdom生成的domcument对象放到request.setAttribute中传递? 问个jdbComboBox组件的问题。 Struts如何实现动态的checkbox,希望高手们都来关注一下!200分
提得不错
请看
package csm.jms;
import javax.swing.*;
import javax.naming.*;
import javax.jms.*;
import java.util.*;
import csm.jms.exception.*;
import csmcore.jms.entitybean.*;
import csmcore.jms.entityview.*;
import csmcore.jms.exception.*;
import javax.ejb.*;
import java.rmi.*;
import csmcore.jms.sessionbean.*;
public class CsmPublisher {
private String hostName="";
private String topicName="";
private CsmSubPubConnMgr mgr=null;
private JmsClientDetail bean=null;
private TopicConnectionFactory topicFactory=null;
private TopicSession topicSession=null;
private TopicPublisher publisher=null;
private Topic topic=null;
public CsmPublisher(String host,String topic)
{
this.hostName = host;
this.topicName = topic;
mgr = CsmSubPubConnMgr.getInstance(host, topic);
bean = mgr.getJmsClientDetail();
topicFactory = mgr.getFactory();
//topic = mgr.getTopic();
}
public void sendMsg(String msg)throws JmsPublisherException{
try
{
String uid=bean.assignUser("p");
if(!uid.equals("none"))
{
TopicConnection conn = topicFactory.createTopicConnection(uid, uid);
topicSession = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
publisher = topicSession.createPublisher(mgr.getTopic());
conn.start();
TextMessage txtMsg = topicSession.createTextMessage();
txtMsg.setText(msg);
publisher.publish(txtMsg);
conn.close();
bean.unassignUser(uid);
}else
{
JOptionPane.showMessageDialog(null,"用于发送的客户连接数已经用尽");
}
}catch(Exception ex){
throw new JmsPublisherException("连接JMS服务器出错:"+ex);
}
}
}package csm.jms;
import javax.naming.*;
import javax.jms.*;
import java.util.*;
import csm.jms.exception.*;
import csmcore.jms.entitybean.*;
import csmcore.jms.entityview.*;
import csmcore.jms.exception.*;
import javax.ejb.*;
import java.rmi.*;
import csmcore.jms.sessionbean.*;public class CsmSubPubConnMgr {
private static Context ctx=null;
private static TopicConnectionFactory topicFactory=null;
private static TopicConnection conn=null;
private static TopicSession topicSession=null;
private static Topic topic=null;
private static TopicSubscriber sub=null;
private static CsmSubPubConnMgr m_instance=null;
private static JmsClientDetail bean=null;
private CsmSubPubConnMgr() {
}
public JmsClientDetail getJmsClientDetail(){
return bean;
}
public Topic getTopic(){
return topic;
}
public TopicConnectionFactory getFactory(){
return topicFactory;
}
synchronized public static CsmSubPubConnMgr getInstance(String hostName,String topicName)
{
if(m_instance==null)
{
try
{
Properties p = new Properties();
System.setProperty("java.security.policy","policy");
System.setProperty("javax.net.ssl.trustStore", "csmkey");
System.setProperty("javax.net.debug","ssl");
Properties sessionp = System.getProperties();
p.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming");
p.put(Context.PROVIDER_URL, hostName);
//JOptionPane.showMessageDialog(null,hostName+":343");
p.setProperty("jnp.timeout", "0");
p.setProperty("jnp.sotimeout", "0");
p.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
p.put(Context.PROVIDER_URL, hostName);
ctx = new InitialContext(p);
Object obj = ctx.lookup("JmsClientDetail");
JmsClientDetailHome home = (JmsClientDetailHome) javax.rmi.PortableRemoteObject.narrow(
obj, JmsClientDetailHome.class);
bean = home.create();
topic = (Topic) ctx.lookup(topicName);
topicFactory = (TopicConnectionFactory) ctx.lookup("ConnectionFactory");
}catch(Exception ex){
System.out.println("jms error:"+ex);
return null;
}
m_instance=new CsmSubPubConnMgr();
}
return m_instance;
}
}import csmcore.jms.entitybean.*;
import csmcore.jms.entityview.*;
import csmcore.jms.exception.*;
import javax.ejb.*;
import java.rmi.*;
import csmcore.jms.sessionbean.*;public class CsmSubscriber extends Thread implements MessageListener{
private static TopicSubscriber sub=null;
private static String csmMsg="";
private static TopicConnection conn=null;
private static TopicConnectionFactory factory=null;
private static TopicSession topicSession=null;
private static CsmSubPubConnMgr mgr=null;
private static JmsClientDetail bean=null;
private static Topic topic=null;
private static String uid="";
private static CsmSubscriber m_instance=null;
public String returnUid(){
return this.uid;
}
public void closeProcess(){
try
{
conn.close();
//JOptionPane.showMessageDialog(null,""+uid);
bean.unassignUser(uid);
}catch(Exception ex){
JOptionPane.showMessageDialog(null,"error:"+ex);
}
}
public void closeProcess(String userName){
try
{
conn.close();
//JOptionPane.showMessageDialog(null,""+uid);
bean.unassignUser(userName);
}catch(Exception ex){
JOptionPane.showMessageDialog(null,"error:"+ex);
}
}
synchronized public static CsmSubscriber getInstance(String hostName,String topicName){
if(m_instance==null)
{
try {
System.out.println("begin");
mgr = CsmSubPubConnMgr.getInstance(hostName, topicName);
System.out.println("done1");
factory = mgr.getFactory();
System.out.println("done2");
bean = mgr.getJmsClientDetail();
System.out.println("done3");
uid = bean.assignUser("s");
//JOptionPane.showMessageDialog(null,"assign user:"+uid);
if (!uid.equals("none")) {
conn = factory.createTopicConnection(uid, uid);
System.out.println("done3");
topic = mgr.getTopic();
System.out.println("done4");
//conn.setClientID("csmsubid");
topicSession = conn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
System.out.println("done5");
sub = topicSession.createDurableSubscriber(topic, "csmjms");
System.out.println("done6");
}
else {
JOptionPane.showMessageDialog(null, "用于接收的客户连接数已经用尽");
}
//JOptionPane.showMessageDialog(null,""+sub.getTopic().toString());
}
catch (Exception ex) {
JOptionPane.showMessageDialog(null, "init error:" + ex);
return null;
}
m_instance=new CsmSubscriber();
}
return m_instance;
}
private CsmSubscriber() { }
public void run()
{
try
{ sub.setMessageListener(this);
conn.start();
}catch(Exception ex)
{
JOptionPane.showMessageDialog(null,"set listener error:"+ex);
} }
public String getMessage()
{
try
{
return this.csmMsg;
}catch(Exception ex){
JOptionPane.showMessageDialog(null,"error:"+ex);
return "";
}
}
public void onMessage(Message msg)
{
try
{ TextMessage tm=(TextMessage)msg;
//JOptionPane.showMessageDialog(null,"tm:"+tm.getText());
this.csmMsg=tm.getText();
//return;
}catch(Exception ex){
JOptionPane.showMessageDialog(null,"error:"+ex);
}
}
}
发送方:
TopicConnection conn = topicFactory.createTopicConnection(uid, uid);
topicSession = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
publisher = topicSession.createPublisher(mgr.getTopic());
conn.start();
TextMessage txtMsg = topicSession.createTextMessage();
txtMsg.setText(msg);
publisher.publish(txtMsg);
conn.close();
接收方:
public void onMessage(Message msg)
{
try
{ TextMessage tm=(TextMessage)msg;
//JOptionPane.showMessageDialog(null,"tm:"+tm.getText());
this.csmMsg=tm.getText();
//return;
}catch(Exception ex){
JOptionPane.showMessageDialog(null,"error:"+ex);
}
记住,我上面的是全部的源码,你会看到一个bean = mgr.getJmsClientDetail();
这是一个EJB方法,作用在于动态的在运行时给JMS分配一个CLIENTID和PWD,为什么要这样,因为JBOSS不能N个客户端共用一个CLIENTID,而WEBLOGIC可以,因此一个CLIENT端要连,就要分配一个(动态的改JBOSS内的XML和数据库)中的一个CLIENTID
下面给出JMS BEAN的源码
package csmmdb;import javax.ejb.MessageDrivenBean;
import javax.jms.MessageListener;
import javax.ejb.MessageDrivenContext;
import javax.ejb.CreateException;
import javax.jms.Message;
import javax.jms.*;
public class csmjmsBean
implements MessageDrivenBean, MessageListener {
MessageDrivenContext messageDrivenContext;
public void ejbCreate(){
} public void ejbRemove() {
}
public String getAss(){
return "asshole";
}
public void onMessage(Message msg) {
try
{
TextMessage tm=(TextMessage)msg;
System.out.println(tm.getText()); }catch(Exception ex){
System.out.println("jms server error:"+ex);
}
} public void setMessageDrivenContext(MessageDrivenContext messageDrivenContext) {
this.messageDrivenContext = messageDrivenContext;
}
}
ejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<display-name>csmjms</display-name>
<enterprise-beans>
<message-driven>
<display-name>csmjms</display-name>
<ejb-name>csmjms</ejb-name>
<ejb-class>csmmdb.csmjmsBean</ejb-class>
<transaction-type>Container</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.Topic</destination-type>
<subscription-durability>Durable</subscription-durability>
</message-driven-destination>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>csmjms</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
jboss.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.2//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_2.dtd">
<jboss>
<enterprise-beans>
<message-driven>
<ejb-name>csmjms</ejb-name>
<destination-jndi-name>topic/csmjms</destination-jndi-name>
<mdb-user>csm</mdb-user>
<mdb-passwd>isdnymk</mdb-passwd>
<mdb-subscription-id>csmjms</mdb-subscription-id>
</message-driven>
</enterprise-beans>
</jboss>