1:接触多了RMI,以前感觉分布式很神奇,其实现在看看感觉就是 把一个大的系统分开很多独立的子系统,主要是解决子系统间相互通信的问题。
在java中 : 实现的方法有: RMI, SPEING RMI等
这个是基于 远程服务
2:基于消息的实现。 java io 或者 java nio 或 apache mina服务器 管理socket等。
最近接触到XMPP协议 ,实现推送的 , 在研究 androidpn代码, 看到 有大神 直接打包在tomcat下部署了的,忘了在那个地方了。
下面说说,xmpp的JID的。
public class JID
implements Comparable<JID>, Serializable
{
private static final long serialVersionUID = 8135170608402192877L;
private static final ConcurrentMap<String, ValueWrapper<String>> NODEPREP_CACHE = ConcurrentLinkedHashMap.create(ConcurrentLinkedHashMap.EvictionPolicy.SECOND_CHANCE, 10000);
private static final ConcurrentMap<String, ValueWrapper<String>> DOMAINPREP_CACHE = ConcurrentLinkedHashMap.create(ConcurrentLinkedHashMap.EvictionPolicy.SECOND_CHANCE, 500);
private static final ConcurrentMap<String, ValueWrapper<String>> RESOURCEPREP_CACHE = ConcurrentLinkedHashMap.create(ConcurrentLinkedHashMap.EvictionPolicy.SECOND_CHANCE, 10000);
private final String node;
private final String domain;
private final String resource;
private final String cachedFullJID;
private final String cachedBareJID;
public JID(String node, String domain, String resource, boolean skipStringprep)
{
if (domain == null) {
throw new NullPointerException("Domain cannot be null");
}
if (skipStringprep) {
this.node = node;
this.domain = domain;
this.resource = resource;
}
else
{
if ((node != null) && (node.equals(""))) {
node = null;
}
if ((resource != null) && (resource.equals(""))) {
resource = null;
}
try
{
this.node = nodeprep(node);
this.domain = domainprep(domain);
this.resource = resourceprep(resource);
}
catch (Exception e) {
StringBuilder buf = new StringBuilder();
if (node != null) {
buf.append(node).append("@");
}
buf.append(domain);
if (resource != null) {
buf.append("/").append(resource);
}
throw new IllegalArgumentException("Illegal JID: " + buf.toString(), e);
}
}
StringBuilder buf = new StringBuilder(40);
if (this.node != null) {
buf.append(this.node).append("@");
}
buf.append(this.domain);
this.cachedBareJID = buf.toString();
if (this.resource != null) {
buf.append("/").append(this.resource);
this.cachedFullJID = buf.toString();
}
else {
this.cachedFullJID = this.cachedBareJID;
}
}
static String[] getParts(String jid)
{
String[] parts = new String[3];
String node = null;
if (jid == null) {
return parts;
}
int atIndex = jid.indexOf("@");
int slashIndex = jid.indexOf("/");
if (atIndex > 0) {
node = jid.substring(0, atIndex);
}
if (atIndex + 1 > jid.length())
throw new IllegalArgumentException("JID with empty domain not valid");
String domain;
String domain;
if (atIndex < 0)
{
String domain;
if (slashIndex > 0) {
domain = jid.substring(0, slashIndex);
}
else
domain = jid;
}
else
{
String domain;
if (slashIndex > 0) {
domain = jid.substring(atIndex + 1, slashIndex);
}
else
domain = jid.substring(atIndex + 1);
}
String resource;
String resource;
if ((slashIndex + 1 > jid.length()) || (slashIndex < 0)) {
resource = null;
}
else {
resource = jid.substring(slashIndex + 1);
}
parts[0] = node;
parts[1] = domain;
parts[2] = resource;
return parts;
}
这个是tinder-1.2.1.jar包中的JID实现。
下面看 xmpp中JID的定义:
每个JID 由三部分组成:节点、域和资源。域部分总是必需的,但其他两部分是可选的,
具体取决于它们所处的具体环境。
域是实体(服务器、组件或插件)的可解析DNS 名称。仅由域组成的JID 是有效地址,它表
示服务器地址。指向域的节将由服务器自身处理,并可能被路由到某个组件或插件。
本地部分通常会识别域中的一个特定用户。它出现在JID 的开头并位于域之前,它与JID
剩余部分之间通过@字符隔开,就像是电子邮件地址的节点部分。本地部分还可以用来识别
androidpn中:
sessionManage类中:
public ClientSession getSession(String username) {
// return getSession(new JID(username, serverName, null, true));
return getSession(new JID(username, serverName, RESOURCE_NAME, true));
}
private static final String RESOURCE_NAME = "AndroidpnClient";