001 package com.croftsoft.apps.client; 002 003 import java.io.*; 004 import java.net.*; 005 import java.util.*; 006 import java.util.concurrent.*; 007 008 import com.croftsoft.core.io.StreamLib; 009 import com.croftsoft.core.lang.*; 010 import com.croftsoft.core.lang.lifecycle.*; 011 import com.croftsoft.core.util.loop.*; 012 013 /********************************************************************* 014 * Network communications. 015 * 016 * @version 017 * $Id: ClientNet.java,v 1.7 2006/12/16 05:05:27 croft Exp $ 018 * @since 019 * 2006-10-30 020 * @author 021 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 022 *********************************************************************/ 023 024 public final class ClientNet 025 implements Lifecycle, Loopable 026 ////////////////////////////////////////////////////////////////////// 027 ////////////////////////////////////////////////////////////////////// 028 { 029 030 private final ClientConfig clientConfig; 031 032 private final Queue<ClientMessage> 033 modelQueue, 034 netQueue; 035 036 private final Looper looper; 037 038 // 039 040 private URL codeBase; 041 042 ////////////////////////////////////////////////////////////////////// 043 ////////////////////////////////////////////////////////////////////// 044 045 public ClientNet ( 046 final ClientConfig clientConfig, 047 final BlockingQueue<ClientMessage> netQueue, 048 final Queue<ClientMessage> modelQueue ) 049 ////////////////////////////////////////////////////////////////////// 050 { 051 NullArgumentException.checkArgs ( 052 this.clientConfig = clientConfig, 053 this.netQueue = netQueue, 054 this.modelQueue = modelQueue ); 055 056 looper = new Looper ( 057 this, // loopable 058 new NanoTimeLoopGovernor ( ), 059 null, // exceptionHandler 060 getClass ( ).getName ( ), // threadName 061 Thread.MIN_PRIORITY, 062 true ); // useDaemonThread 063 } 064 065 ////////////////////////////////////////////////////////////////////// 066 // interface Lifecycle methods 067 ////////////////////////////////////////////////////////////////////// 068 069 public void init ( ) 070 ////////////////////////////////////////////////////////////////////// 071 { 072 codeBase = clientConfig.getCodeBase ( ); 073 074 if ( codeBase == null ) 075 { 076 try 077 { 078 final String defaultCodeBaseName 079 = clientConfig.getDefaultCodeBaseName ( ); 080 081 codeBase = new URL ( defaultCodeBaseName ); 082 } 083 catch ( Exception ex ) 084 { 085 ex.printStackTrace ( ); 086 087 try 088 { 089 codeBase = new URL ( "http://localhost:8080/" ); 090 } 091 catch ( Exception ex2 ) 092 { 093 ex2.printStackTrace ( ); 094 } 095 } 096 } 097 098 LifecycleLib.init ( looper ); 099 } 100 101 public void start ( ) 102 ////////////////////////////////////////////////////////////////////// 103 { 104 LifecycleLib.start ( looper ); 105 } 106 107 public void stop ( ) 108 ////////////////////////////////////////////////////////////////////// 109 { 110 LifecycleLib.stop ( looper ); 111 } 112 113 public void destroy ( ) 114 ////////////////////////////////////////////////////////////////////// 115 { 116 LifecycleLib.destroy ( looper ); 117 } 118 119 ////////////////////////////////////////////////////////////////////// 120 ////////////////////////////////////////////////////////////////////// 121 122 public boolean loop ( ) 123 ////////////////////////////////////////////////////////////////////// 124 { 125 ClientMessage message = null; 126 127 while ( ( message = netQueue.poll ( ) ) != null ) 128 { 129 final ClientMessage.Type type = message.getType ( ); 130 131 switch ( type ) 132 { 133 case SEND_TEXT_REQUEST: 134 135 doSendTextRequest ( message ); 136 137 break; 138 139 default: 140 141 System.out.println ( getClass ( ).getName ( ) + ": " 142 + "unknown message type: " + type ); 143 } 144 } 145 146 return true; 147 } 148 149 ////////////////////////////////////////////////////////////////////// 150 ////////////////////////////////////////////////////////////////////// 151 152 private void doSendTextRequest ( final ClientMessage clientMessage ) 153 ////////////////////////////////////////////////////////////////////// 154 { 155 try 156 { 157 final String text = ( String ) clientMessage.getContent ( ); 158 159 String botIdParam = ""; 160 161 final String botId = clientConfig.getBotId ( ); 162 163 if ( botId != null ) 164 { 165 botIdParam = "botid=" + botId + "&"; 166 } 167 168 final URL url = new URL ( 169 codeBase, 170 "/programd/GetBotResponse?" 171 + botIdParam 172 + "input=" + URLEncoder.encode ( text, "UTF-8" ) ); 173 174 final HttpURLConnection httpURLConnection 175 = ( HttpURLConnection ) url.openConnection ( ); 176 177 final InputStream inputStream 178 = httpURLConnection.getInputStream ( ); 179 180 final String content = StreamLib.toString ( inputStream ); 181 182 inputStream.close ( ); 183 184 modelQueue.offer ( new ClientMessage ( 185 ClientMessage.Type.TEXT_EVENT, 186 "bot: " + content.toString ( ) ) ); 187 188 modelQueue.offer ( new ClientMessage ( 189 ClientMessage.Type.SPEECH_EVENT, 190 content.toString ( ) ) ); 191 } 192 catch ( final Exception ex ) 193 { 194 ex.printStackTrace ( ); 195 196 modelQueue.offer ( new ClientMessage ( 197 ClientMessage.Type.TEXT_EVENT, ex.getMessage ( ) ) ); 198 } 199 } 200 201 ////////////////////////////////////////////////////////////////////// 202 ////////////////////////////////////////////////////////////////////// 203 }