Topic: 寻找学习jini的朋友 |
Print this page |
1.寻找学习jini的朋友 | Copy to clipboard |
Posted by: h_q_x Posted on: 2003-03-23 15:50 一个人在学,觉得吃力。 希望有人可以讨论些问题。 谢谢! email: huahua1118@21cn.com |
2.Re:寻找学习jini的朋友 [Re: h_q_x] | Copy to clipboard |
Posted by: bluntsword Posted on: 2003-03-23 18:13 确实很吃力,我也是。我甚至找不到一个很好的入门点。 |
3.my question...... [Re: h_q_x] | Copy to clipboard |
Posted by: h_q_x Posted on: 2003-03-23 18:33 很高兴有点回应。 我是自己试着改些例子,基本按照http://www.plurb.com/misc/jini/index.html的最低要求做。 做到远程事件的时候就堵住了。走不下去。我做的事件产生器的注册在那个lookup browser里面看得到,在client查找的时候就是找不到,而我用的template是匹配全部的那种,别的(除了事件产生器)是找的到的。我觉得可能更rmi那套东东有关系。但我一时又看不清楚。着急! 烦死我了。今天什么都没做,就在找有没有可以交流的地方。 请问你进展如何?对事件这块了解吗? |
4.Re:寻找学习jini的朋友 [Re: h_q_x] | Copy to clipboard |
Posted by: SimonLei Posted on: 2003-03-23 22:09 //hand 我从jini1.0跟踪到现在,没碰到几个同行。 你的问题,我估计出在 codebase 上。 jini1.0到1.1到现在的1.2,变化不小, 所以以前的jini的书, 帮助不是很大,只能看文档。 网站的话,我推荐一些: http://www.jini.org http://www.artima.com/jini/index.html http://www.ecs.soton.ac.uk/~ra00r/jinidemia/projects.html |
5.Re:寻找学习jini的朋友 [Re: SimonLei] | Copy to clipboard |
Posted by: h_q_x Posted on: 2003-03-25 18:13 谢谢。 我对codebase是有些不清楚,当然不仅是codebase的问题。 细致一点说,烦请看看有几行代码这样写 注册时会出问题么?还有service-dl下面要放什么呢? ~~~ (因为还没有涉及到产生事件的部分,为了突出重点就省去了, 如果需要我再加。是改的corejini的程序) 还有,我不明白在lookup注册哪里用到了rmi而需要扩展Remote?register的方法不是通过rmi调用的吧。 问题比较弱,不好意思。 interface EventGen extends Remote{ public EventRegistration register(RemoteEventListener listener, long leaseLength) throws RemoteException; } public class HelloWorldService extends UnicastRemoteObject implements EventGen,Runnable { ...... // Inner class to listen for discovery events class Listener implements DiscoveryListener { // Called when we find a new lookup service. public void discovered(DiscoveryEvent ev) { System.out.println("discovered a lookup service!"); ServiceRegistrar[] newregs = ev.getRegistrars(); for (int i=0 ; i<newregs.length ; i++) { if (!registrations.containsKey(newregs[i])) { registerWithLookup(newregs[i]);//******* } } } public void discarded(DiscoveryEvent ev) { ...... } } ...... public HelloWorldService() throws IOException { System.out.println("is the super performed, strange ?"); item = new ServiceItem(null, this, null);//************** //主要就是这里用this行不行啊??用EventGen匹配为什么找不到?? ...... // Install a listener. disco.addDiscoveryListener(new Listener()); } ...... synchronized void registerWithLookup(ServiceRegistrar registrar) { ServiceRegistration registration = null; try { registration = registrar.register(item, LEASE_TIME);//****** } catch (RemoteException ex) { System.out.println("Couldn't register: " + ex.getMessage()); return; } catch (Exception ex){ System.out.println("Couldn't register: " + ex.getMessage()); return; } if (item.serviceID == null) { item.serviceID = registration.getServiceID(); System.out.println("Set serviceID to " + item.serviceID); } System.out.println("serviceID is set to " + item.serviceID); registrations.put(registrar, registration); } ...... //here is the method for EVENT GEN to register public synchronized EventRegistration register( RemoteEventListener listener, long leaseLength){ EventRegistration evtreg = new EventRegistration(1L,this,null,0); //这里用this有没有问题呢? listenerList.add(RemoteEventListener.class, listener); return evtreg; } ...... } |
6.Re:寻找学习jini的朋友 [Re: h_q_x] | Copy to clipboard |
Posted by: SimonLei Posted on: 2003-03-25 19:03 core jini 太老了, 它是为Jini1.0所写的,到Jini1.1/1.2已经变化很大了,更不用说2.0beta了。 不过我也是因为这本书才喜欢上JINI的,呵呵。 你那些地方用 this没有问题, 虽然一般来说, proxy 要和真正的实现分开比较合理。 至于能否注册上,我看了这些代码也不敢明确的说。因为Jini本身的配置也不是一件很简单的事情。不过我是把所有-dl.jar 文件都放在download目录下,因为基本上这些服务都会用到,呵呵。 要不你把你的源码以附件形式贴一下,我看看。 |
7.怎么“源码以附件形式贴”? [Re: SimonLei] | Copy to clipboard |
Posted by: h_q_x Posted on: 2003-03-25 21:23 我的代码乱七八糟的,而且东拼西凑, 因为了解jini的时间不长,中间的租约和manager那些类都看, 急于求成,就单独把事件这块拿出来跑跑看。 想想还是解释一下,虽然免不了一笑大方。 名字改了一点,重做了一个。 那个proxy的建议我觉得楼上的高手说的很有道理,不是我不想,是我还不会,这个程序是我照着corejini里面事件部分画出来的,那个东西就用的this。 我只在把那个东西精简成一个单纯一点的事件也没做好 。:-s 附件怎么用也不知道,先把整个贴上来吧。 真得很惭愧......有些地方还没来得及改好,因为是想走一步算一步的 但是编译通过了。 贴在下一贴里。 |
8.见笑了 [Re: h_q_x] | Copy to clipboard |
Posted by: h_q_x Posted on: 2003-03-25 21:28 package corejini.chapter5; import net.jini.discovery.DiscoveryListener; import net.jini.discovery.DiscoveryEvent; import net.jini.discovery.LookupDiscovery; import net.jini.core.lookup.ServiceItem; import net.jini.core.lookup.ServiceRegistrar; import net.jini.core.lookup.ServiceRegistration; import net.jini.core.entry.Entry; import net.jini.lookup.entry.*; import net.jini.core.event.*; import java.util.HashMap; import java.io.IOException; import java.io.Serializable; import java.rmi.RemoteException; import java.rmi.Remote; import java.rmi.RMISecurityManager; import java.rmi.MarshalledObject; import java.rmi.server.UnicastRemoteObject; import javax.swing.event.EventListenerList; // This is the proxy object that will be downloaded // by clients. It's serializable and implements // our well-known HelloWorldServiceInterface. ////////////////add here for EVENT GENERATOR!!! interface EventGena extends Remote{ public EventRegistration register(RemoteEventListener listener, long leaseLength) throws RemoteException; } // HelloWorldService is the "wrapper" class that // handles publishing the service item. public class HelloWorldServicea extends UnicastRemoteObject implements EventGena,Runnable { // 10 minute leases protected final int LEASE_TIME = 1000 * 60 * 1000; protected HashMap registrations = new HashMap(); protected ServiceItem item; protected LookupDiscovery disco; //here r the variants for the EVENT GEN protected long lastEventSeqNo = 0; EventListenerList listenerList = new EventListenerList(); // Inner class to listen for discovery events class Listener implements DiscoveryListener { // Called when we find a new lookup service. public void discovered(DiscoveryEvent ev) { System.out.println("discovered a lookup service!"); ServiceRegistrar[] newregs = ev.getRegistrars(); for (int i=0 ; i<newregs.length ; i++) { if (!registrations.containsKey(newregs[i])) { registerWithLookup(newregs[i]); } } } // Called ONLY when we explicitly discard a // lookup service, not "automatically" when a // lookup service goes down. Once discovered, // there is NO ongoing communication with a // lookup service. public void discarded(DiscoveryEvent ev) { ServiceRegistrar[] deadregs = ev.getRegistrars(); for (int i=0 ; i<deadregs.length ; i++) { registrations.remove(deadregs[i]); } } } public HelloWorldServicea() throws IOException { item = new ServiceItem(null, this , null); // Set a security manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } // Search for the "public" group, which by // convention is named by the empty string disco = new LookupDiscovery(new String[] { "" }); // Install a listener. disco.addDiscoveryListener(new Listener()); } // This work involves remote calls, and may take a // while to complete. Thus, since it's called from // discovered(), it will prevent us from responding // in a timely fashion to new discovery events. An // improvement would be to spin off a separate short- // lived thread to do the work. synchronized void registerWithLookup(ServiceRegistrar registrar) { ServiceRegistration registration = null; System.out.println("enter lookup register..."); try { registration = registrar.register(item, LEASE_TIME); } catch (RemoteException ex) { System.out.println("Couldn't register: " + ex.getMessage()); return; } catch (Exception ex){ System.out.println("Couldn't register: " + ex.getMessage()); return; } // If this is our first registration, use the // service ID returned to us. Ideally, we should // save this ID so that it can be used after // restarts of the service if (item.serviceID == null) { item.serviceID = registration.getServiceID(); System.out.println("Set serviceID to " + item.serviceID); } System.out.println("serviceID is set to " + item.serviceID); registrations.put(registrar, registration); } //here is the method for EVENT GEN public synchronized EventRegistration register( RemoteEventListener listener, long leaseLength){ EventRegistration evtreg = new EventRegistration(1L,this,null,0); listenerList.add(RemoteEventListener.class, listener); return evtreg; // } //here is the one to send those EVENT protected void sendEvent(){ RemoteEvent remoteEvent = null; // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event for (int n = listeners.length - 2; n >= 0; n -= 2) { if (listeners[n] == RemoteEventListener.class) { RemoteEventListener listener = (RemoteEventListener) listeners[n+1]; if (remoteEvent == null) { remoteEvent = new RemoteEvent(this, 1L, lastEventSeqNo++, null); } try { listener.notify(remoteEvent); } catch(UnknownEventException e) { e.printStackTrace(); } catch(java.rmi.RemoteException e) { e.printStackTrace(); } } } } // This thread does nothing but sleep, but it // makes sure the VM doesn't exit. public void run() { while (true) { try { Thread.sleep(1000000); sendEvent(); } catch (InterruptedException ex) { } } } // Create a new HelloWorldService and start // its thread. public static void main(String args[]) { try { HelloWorldServicea hws = new HelloWorldServicea(); new Thread(hws).start(); } catch (IOException ex) { System.out.println("Couldn't create service: " + ex.getMessage()); } } } |
9.我不会粘了两次吧 [Re: h_q_x] | Copy to clipboard |
Posted by: h_q_x Posted on: 2003-03-25 21:30 package corejini.chapter5; import net.jini.discovery.DiscoveryListener; import net.jini.discovery.DiscoveryEvent; import net.jini.discovery.LookupDiscovery; import net.jini.core.lookup.ServiceItem; import net.jini.core.lookup.ServiceRegistrar; import net.jini.core.lookup.ServiceRegistration; import net.jini.core.entry.Entry; import net.jini.lookup.entry.*; import net.jini.core.event.*; import java.util.HashMap; import java.io.IOException; import java.io.Serializable; import java.rmi.RemoteException; import java.rmi.Remote; import java.rmi.RMISecurityManager; import java.rmi.MarshalledObject; import java.rmi.server.UnicastRemoteObject; import javax.swing.event.EventListenerList; // This is the proxy object that will be downloaded // by clients. It's serializable and implements // our well-known HelloWorldServiceInterface. ////////////////add here for EVENT GENERATOR!!! interface EventGena extends Remote{ public EventRegistration register(RemoteEventListener listener, long leaseLength) throws RemoteException; } // HelloWorldService is the "wrapper" class that // handles publishing the service item. public class HelloWorldServicea extends UnicastRemoteObject implements EventGena,Runnable { // 10 minute leases protected final int LEASE_TIME = 1000 * 60 * 1000; protected HashMap registrations = new HashMap(); protected ServiceItem item; protected LookupDiscovery disco; //here r the variants for the EVENT GEN protected long lastEventSeqNo = 0; EventListenerList listenerList = new EventListenerList(); // Inner class to listen for discovery events class Listener implements DiscoveryListener { // Called when we find a new lookup service. public void discovered(DiscoveryEvent ev) { System.out.println("discovered a lookup service!"); ServiceRegistrar[] newregs = ev.getRegistrars(); for (int i=0 ; i<newregs.length ; i++) { if (!registrations.containsKey(newregs[i])) { registerWithLookup(newregs[i]); } } } // Called ONLY when we explicitly discard a // lookup service, not "automatically" when a // lookup service goes down. Once discovered, // there is NO ongoing communication with a // lookup service. public void discarded(DiscoveryEvent ev) { ServiceRegistrar[] deadregs = ev.getRegistrars(); for (int i=0 ; i<deadregs.length ; i++) { registrations.remove(deadregs[i]); } } } public HelloWorldServicea() throws IOException { item = new ServiceItem(null, this , null); // Set a security manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } // Search for the "public" group, which by // convention is named by the empty string disco = new LookupDiscovery(new String[] { "" }); // Install a listener. disco.addDiscoveryListener(new Listener()); } // This work involves remote calls, and may take a // while to complete. Thus, since it's called from // discovered(), it will prevent us from responding // in a timely fashion to new discovery events. An // improvement would be to spin off a separate short- // lived thread to do the work. synchronized void registerWithLookup(ServiceRegistrar registrar) { ServiceRegistration registration = null; System.out.println("enter lookup register..."); try { registration = registrar.register(item, LEASE_TIME); } catch (RemoteException ex) { System.out.println("Couldn't register: " + ex.getMessage()); return; } catch (Exception ex){ System.out.println("Couldn't register: " + ex.getMessage()); return; } // If this is our first registration, use the // service ID returned to us. Ideally, we should // save this ID so that it can be used after // restarts of the service if (item.serviceID == null) { item.serviceID = registration.getServiceID(); System.out.println("Set serviceID to " + item.serviceID); } System.out.println("serviceID is set to " + item.serviceID); registrations.put(registrar, registration); } //here is the method for EVENT GEN public synchronized EventRegistration register( RemoteEventListener listener, long leaseLength){ EventRegistration evtreg = new EventRegistration(1L,this,null,0); listenerList.add(RemoteEventListener.class, listener); return evtreg; // } //here is the one to send those EVENT protected void sendEvent(){ RemoteEvent remoteEvent = null; // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event for (int n = listeners.length - 2; n >= 0; n -= 2) { if (listeners[n] == RemoteEventListener.class) { RemoteEventListener listener = (RemoteEventListener) listeners[n+1]; if (remoteEvent == null) { remoteEvent = new RemoteEvent(this, 1L, lastEventSeqNo++, null); } try { listener.notify(remoteEvent); } catch(UnknownEventException e) { e.printStackTrace(); } catch(java.rmi.RemoteException e) { e.printStackTrace(); } } } } // This thread does nothing but sleep, but it // makes sure the VM doesn't exit. public void run() { while (true) { try { Thread.sleep(1000000); sendEvent(); } catch (InterruptedException ex) { } } } // Create a new HelloWorldService and start // its thread. public static void main(String args[]) { try { HelloWorldServicea hws = new HelloWorldServicea(); new Thread(hws).start(); } catch (IOException ex) { System.out.println("Couldn't create service: " + ex.getMessage()); } } } |
10.Re:怎么“源码以附件形式贴”? [Re: h_q_x] | Copy to clipboard |
Posted by: SimonLei Posted on: 2003-03-26 09:02 没关系的,刚开始学Jini的时候,我也和你一样碰到了 不少问题。到现在我都还有很多问题没有闹清楚。 所以高手二字不敢当。 以附件形式,就是你在发表文章的时候, 可以选择一个文件当做附件发表。不过没关系,我看看你的代码吧。 |
11.Re:寻找学习jini的朋友 [Re: h_q_x] | Copy to clipboard |
Posted by: SimonLei Posted on: 2003-03-26 09:46 你的代码只看见注册服务,没看见注册事件啊。 |
12.Re:怎么“源码以附件形式贴”? [Re: SimonLei] | Copy to clipboard |
Posted by: bluntsword Posted on: 2003-03-26 14:26 SimonLei wrote: 现在有什么比较好的Jini入门资料么? |
13.Re:怎么“源码以附件形式贴”? [Re: bluntsword] | Copy to clipboard |
Posted by: SimonLei Posted on: 2003-03-26 14:44 http://pandonia.canberra.edu.au/java/jini/tutorial/Jini.xml 不过这个也只是for 1.1 的 更新的比较少。 |
14.注册事件? [Re: SimonLei] | Copy to clipboard |
Posted by: h_q_x Posted on: 2003-03-27 17:06 首先,谢谢SimonLei。虽然这里不是一个表示感动的场所。你一直非常热心的关注着我的烂问题。而我说实话本来是个很浮躁的人,现在又为其他一些事忙着,没太多时间专注的学习这个东西。但是你无形中给了我很多鼓励。谢谢。 另外,我不明白怎么叫“注册事件”?还要把事件在lookup中注册吗?我以为的过程是: client在找到lookup service后,顺着可以找到HelloWorldServicea的stub,调用上面的register函数,register...执行中,service端的listenerList增加了,这样在sendevent时候,扫描listenerList中的listener被notify,也就使client被告知了。 不知道是不是这样。 我把client的代码贴一下吧。 |
15.Re:寻找学习jini的朋友 [Re: h_q_x] | Copy to clipboard |
Posted by: SimonLei Posted on: 2003-03-27 18:15 不要客气。我现在也比较忙,所以渐渐没空去跟踪Jini新的东西了。 所以希望能有个朋友也关心这个领域,时不时的互相交流一下。呵呵。 我试了一下你的client,没有仔细看,不过运行没问题,也能找到HelloWorldServicea,输出结果如下: lookup the template of anytype Reg knows about com.sun.jini.reggie.RegistrarProxy@3d9c4084 with id 32f19763-d4ce-418f-b9bd-fede621e68b6 pay attention please : class net.jini.core.lookup.ServiceItem Reg knows about techtry.HelloWorldServicea_Stub[RemoteStub [ref: [endpoint:[61.149.87.53:4075](remote),objID:[124bbbf:f42ee8088f:-8000, 0]]]] with id e2fd8197-dc95-4bba-ba28-ff26a65f8f49 pay attention please : class net.jini.core.lookup.ServiceItem Reg knows about com.sun.jini.mahalo.TxnManagerImpl_Stub[RemoteStub [ref: sun.rmi.server.UnicastRef2@29ab3e]] with id 68daa79b-4ae0-4de2-a3f5-e879b8eced14 pay attention please : class net.jini.core.lookup.ServiceItem Reg knows about com.sun.jini.fiddler.FiddlerProxy@3c6e8be5 with id 033cb937-f0c7-401c-af8b-917aa310721e pay attention please : class net.jini.core.lookup.ServiceItem Reg knows about com.sun.jini.norm.NormServerImpl_Stub[RemoteStub [ref: sun.rmi.server.UnicastRef2@1a99561]] with id 981d8c49-3b68-47ba-b464-cb5aaa88509c pay attention please : class net.jini.core.lookup.ServiceItem Reg knows about com.sun.jini.outrigger.SpaceProxy@c1fd7dc with id 83cfc3f8-3289-48fc-9a46-bfacc014f106 pay attention please : class net.jini.core.lookup.ServiceItem Reg knows about com.sun.jini.mercury.MailboxProxy@2b512d82 with id b349b2cb-396f-4f5b-96d1-936f9b82f90c pay attention please : class net.jini.core.lookup.ServiceItem not found however... |
16.Re:寻找学习jini的朋友 [Re: h_q_x] | Copy to clipboard |
Posted by: 房客 Posted on: 2003-03-29 22:43 我也学习过一些时间 个人感觉:这类技术在于思想——直接表现在设计——可以以图形化来描述——最后才是出现代码的组合 请板之 |
17.Re:寻找学习jini的朋友 [Re: h_q_x] | Copy to clipboard |
Posted by: 房客 Posted on: 2003-03-29 23:00 http://www.kedwards.com/jini/ Jini Links Here are some useful pointers to other Jini sites. I hope you find them helpful. Many of these are cited in the book. Essentials http://www.jini.org This is the home of the Jini Community, and should definitely be in your hotlist if you're a Jini developer. http://www.javasoft.com/jini/ This is the main JavaSoft page on Jini--information on licensing, white papers, etc. http://developer.java.sun.com/developer/products/jini/ The place to go for Jini downloads. Click the "product offerings" link to see what's available. http://archives.java.sun.com/archives/jini-users.html This site contains full archives of the JINI-USERS mailing list. Interesting Reading http://java.sun.com/people/jag/green/index.html James Gosling's web page. Great reading on the history of Java, complete with a picture of the Star-7 device! http://ubiq.com/hypertext/weiser/UbiHome.html This is Mark Weiser's page on his vision of ubiquitous computing. The Scientific American article is the seminal paper on UbiComp. http://www.nytimes.com/library/tech/98/07/biztech/articles/15sun.html This is the article that broke the story on Jini. This site requires registration, but it's free. http://wired.com/news/technology/story/13744.html After the Times got hold of the Jini story, Wired was quick to follow suit. Here's the article. http://www.sunlabs.com/technical-reports/1994/abstract-29.html This paper predates Jini by a number of years, but clearly sets forth the vision of distributed computing that key members of the Jini team espoused. Great reading. http://jini.pagina.nl Big collection of Jini links, including well-known Jini sites, news articles, etc. Supporting Material/Related Topics http://java.sun.com/beans/docs/goodbean.pdf A good, brief overview of what JavaBeans is and how to write beans. http://java.sun.com/docs/books/tutorial/javabeans/ A more in-depth track from the Java online tutorial on JavaBeans. This site may be useful if you're getting started with Jini's EntryBeans. http://www.kedwards.com/jini/draft-leach-uuids-guids-01.txt This is the IETF draft on universally unique IDs, which is the basis for Jini's service ID scheme. http://www.cs.yale.edu/HTML/YALE/CS/Linda/linda.html The home page for the Linda project at Yale, which is the precursor to JavaSpaces. http://www.gigaspaces.com A commercial implementation of the JavaSpaces technology. http://www.almaden.ibm.com/cs/TSpaces/index.html T-Spaces is an IBM research project that is another Linda-derived tuplespace system. http://www.javasoft.com/products/jdk/1.2/docs/guide/security/permissions.html A quick guide to using Java 2 security permissions. http://www.javasoft.com/products/jdk/1.2/docs/guide/security/PolicyFiles.html A tutorial for writing and using security policy files. If you want to break the habit of using simple "all permissions" policy files, this is a good starting point. http://www.javasoft.com/products/jdk/1.2/docs/guide/rmi/index.html The home page for RMI. Lots of good resources here. http://www.javasoft.com/products/jdk/1.2/docs/guide/serialization/index.html All you need to know about Java object serialization. http://www.javasoft.com/products/jdk/1.2/docs/guide/rmi/faq.html The Frequently Asked Questions list about RMI. This page is a good resource when you run into RMI trouble. Pages with Examples and Tutorials http://www.artima.com/jini/index.html Bill Venners' excellent site with his Jiniology articles from JavaWorld, sample code, a tutorial, and more. http://pandonia.canberra.edu.au/java/jini/tutorial/Jini.html Jan Newmarch's Jini tutorial. This is a great, step-by-step way to get started with Jini. http://www.cswl.com/whiteppr/tutorials/jini.html Some starter examples covering discovery and lookup. http://www.enete.com/download/# nuggets Noel Enete's Nuggets examples are a well-used way to get started with Jini. IMHO, Jan Newmarch's tutorial (above) will carry you a quite a bit further, though. |
18.Re:寻找学习jini的朋友 [Re: h_q_x] | Copy to clipboard |
Posted by: ccic134302 Posted on: 2003-05-09 10:50 有没有中文的jini资料?我是初学者能不能给出jini的开发环境,并使用的软件,谢谢 |
19.Re:寻找学习jini的朋友 [Re: ccic134302] | Copy to clipboard |
Posted by: sharedata Posted on: 2003-05-27 13:47 算我一个!我的E-mail/MSN:ejbstart@hotmail.com |
20.Re:寻找学习jini的朋友 [Re: h_q_x] | Copy to clipboard |
Posted by: lovepsf Posted on: 2004-11-15 13:14 我也在学啊,请大家加我QQ啊QQ:342383957(标明J2SE) |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |