📄 talk.java
字号:
} } } catch(Exception e) { continue; } if (checkUserAdv(adv, name)) { return adv; } } } catch (Exception e) {} // Now, search remote discovery.getRemoteAdvertisements(null, DiscoveryService.ADV, PipeAdvertisement.NameTag, TalkNameTag + "." + name, 2, this); // Wait a bit in order to get an answer. int i=0; while (true) { try { if (i>MAXRETRIES) { println(""); break; } Thread.sleep( WaitingTime); print("."); i++; //one more query if (i == MAXRETRIES/2) { discovery.getRemoteAdvertisements(null, DiscoveryService.ADV, PipeAdvertisement.NameTag, TalkNameTag + "." + name, 2, this); } } catch (Exception e) {} try { synchronized(this) { if (results != null) { Iterator eachAdv = results.iterator(); while( eachAdv.hasNext() ) { try { PipeAdvertisement adv = (PipeAdvertisement) eachAdv.next(); if (checkUserAdv(adv, name)) { return adv; } } catch(Exception e) { continue; } } results.clear(); } } } catch (Exception e) {} } return null; } private void runDeamon(String name, PipeAdvertisement adv) { userAdv = adv; userName = name; try { pipeIn = getGroup().getPipeService().createInputPipe(userAdv); } catch (Exception ex) { printStackTrace( "Could not open InputPipe for " + userAdv.getPipeID(), ex ); return ; } if (pipeIn == null) { consoleMessage( "Could not open InputPipe for " + userAdv.getPipeID() ); return; } thread = new Thread(this, "Talk:Talk Deamon for " + name +"@"+getGroup().getPeerGroupName() ); thread.setDaemon( true ); thread.start(); ShellObject daemon = new CleanupShellObject( "Talk Deamon for : " + name +"@"+getGroup().getPeerGroupName(), this ); // Store this object env.add( EnvName + "." + name +"@"+getGroup().getPeerGroupName(), daemon ); } /** * Stops the talk daemon thread **/ private static class CleanupShellObject extends ShellObject { CleanupShellObject( String name, Object object ) { super( name, object ); } /** * {@inheritDoc} * * <p/>Closes the pipe if it is still open. **/ protected void finalize() throws Throwable { super.finalize(); talk daemon = (talk) getObject(); synchronized( daemon ) { if( null != daemon.pipeIn ) { daemon.pipeIn.close(); } } } } private void stopDeamon(String name) { // full name is required to find the object String dname = EnvName + "." + name + "@" + getGroup().getPeerGroupName(); ShellObject obj = env.get(dname); if (obj == null) { // Notify user that the logout failed consoleMessage( "Daemon(" + dname + ") for " + name + " not found"); return; } try { talk daemon = (talk) obj.getObject(); env.remove(dname); synchronized( daemon ) { if( null != daemon.pipeIn ) { daemon.pipeIn.close(); } } } catch (Exception e) { printStackTrace("Could not stop deamon for " + name, e); return; } } /** * {@inheritDoc} **/ public void run() { try { // Listen on the pipe while (true) { Message msg = null; try { msg = pipeIn.waitForMessage(); if( null == msg ) { consoleMessage( "Stop listening for " + userName ); break; } } catch ( InterruptedException woken ) { Thread.interrupted(); consoleMessage( "Stop listening for " + userName ); return; } String senderName = null; // Get sender information MessageElement nameEl = msg.getMessageElement(SenderName); if (nameEl != null) { senderName = nameEl.toString(); } else { println("received an unknown message"); continue; } if( null == senderName ) { senderName = "Anonymous"; } String senderMessage = null; MessageElement msgEl = msg.getMessageElement(SenderMessage); if (msgEl != null) { senderMessage = msgEl.toString(); } else { println("received an unknown message"); continue; } senderMessage += handleImageFromMsg(senderName, msg); // Get message if (senderMessage == null) { consoleMessage( senderName + " to " + userName + "> [empty message]" ); continue; } consoleMessage(senderName + " to "+ userName + "> "+senderMessage); } } catch( Throwable all ) { printStackTrace( "Uncaught Throwable in thread :" + Thread.currentThread().getName(), all ); } finally { synchronized( this ) { pipeIn = null; thread = null; } } } /** * Generate uniquePipeID that is independantly unique within a group * * @return The uniquePipeID value */ private PipeAdvertisement getMyJxtaPipeAdv() { byte [] preCookedPID = { (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1, (byte) 0xD1 }; PipeID id= (PipeID) IDFactory.newPipeID(getGroup().getPeerGroupID(), preCookedPID); PipeAdvertisement pipeAdv = (PipeAdvertisement) AdvertisementFactory.newAdvertisement( PipeAdvertisement.getAdvertisementType()); pipeAdv.setPipeID(id); pipeAdv.setName("JXME chat demo"); pipeAdv.setType(PipeService.PropagateType); return pipeAdv; } private int syntaxError() { consoleMessage( getDescription() ); println("Usage: talk -[r]egister <userName> [-[s]ecure | -[p]ropagate]"); println(" talk -[l]ogin <userName> "); println(" talk -[lo]gout <userName> "); println(" talk -[u] <senderName> <userName> "); println(" talk -search || -f <userName>"); return ShellApp.appParamError; } /** * {@inheritDoc} **/ public String getDescription() { return "Talk to another peer"; } /** * {@inheritDoc} **/ public void help() { println("NAME"); println(" talk - " + getDescription() ); println(" "); println("SYNOPSIS"); println(" "); println(" talk -[r]egister <userName> [-[s]ecure | -[p]ropagate]"); println(" talk -[l]ogin <userName> "); println(" talk -[lo]gout <userName> "); println(" talk -[u] <senderName> <userName> "); println(" talk -search || -f"); println(" "); println("DESCRIPTION"); println(" "); println("The 'talk command implements a simple instant messaging command"); println("where two users on two remote peers can exchange messages."); println("Messages are displayed on the Shell stdout. In order"); println("to use 'talk' the user needs to register himself. This is done"); println("via the following steps:"); println("Step 1: Register via 'talk -register <username>' command. This command"); println(" creates a Talk advertisement for that user. This has to"); println(" be done only once, the first time the user registers with"); println(" talk. The system remembers it accross reboot."); println(" -secure can be added in order to establish a secure talk session."); println(" -propagate can be added in order to establish a chatroom style talk session."); println(" "); println("Step 2: Login via 'talk -login <username>' command. This command"); println(" logs the user and starts a listener daemon. This has to"); println(" to be done everytime the peer is restarted."); println(" "); println("Step 3: User can talk to another user via the command"); println(" 'talk -u <myusername> <destusername>'. This command will prompt the user"); println(" to enter the message he/she wants to send"); println(" "); println(" JXTA>talk -u moi mike"); println(" # talk : Connected to user mike"); println(" Type your message. To exit, type '.' at beginning of line"); println(" "); println("To stop receiving any more talk messages. The user can stop the talk"); println("listener daemon by entering the command 'talk -logout <username>'"); println(" "); println("OPTIONS"); println(" "); println(" -register register a new user name."); println(" -login log user and set default user."); println(" -logout logout."); println(" -search search for talk users."); println(" -u specify current user name"); println(" "); println("EXAMPLES"); println(" "); println(" JXTA>talk -register me"); println(" JXTA>talk -login me"); println(" JXTA>talk -search"); println(" JXTA>talk -u me you"); println(" "); println("This example shows how a new user 'me' can register and log into talk,"); println(" an talk to the user 'you'. User 'you' needs to be registered and logged on."); println(" "); println("SEE ALSO"); println(" "); println(" xfer sftp mkpipe"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -