From: Greg W. (JIRA) <ji...@co...> - 2007-12-21 05:41:59
|
[ http://jira.codehaus.org/browse/JETTY-483?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Greg Wilkins reassigned JETTY-483: ---------------------------------- Assignee: Greg Wilkins > org.mortbay.jetty.EofException thrown when handshake between BayeuxClient and servlet based on SSL > -------------------------------------------------------------------------------------------------- > > Key: JETTY-483 > URL: http://jira.codehaus.org/browse/JETTY-483 > Project: Jetty > Issue Type: Bug > Components: Bayeux > Affects Versions: 6.1.6rc1 > Environment: Winxp > Reporter: scg > Assignee: Greg Wilkins > Attachments: BayeuxClient.java > > > I always meet this problem. Actually, when I use Http , not Https, and SelectChannelConnector , it is no problem to publish event from server to client or request from client to server. But when I start a servlet with SslSelectChannelConnector and then start client to connect it , the "WARN: Handshake:org.mortbay.jetty.EofException" always thrown. Maybe it is not a bug for Bayeux, but could u tell me how to resolve it? > The fllowing is the output of console: > [main] : CometdSSLClient------Beginning to start Client... > 2007-12-19 10:32:38.746::INFO: Logging to STDERR via org.mortbay.log.StdErrLog > [main] : CometdSSLClient------Start BayeuxClient:null > [main] : CometdSSLClient------Start Client successfully! > [main] : CometdSSLClient------clientPublish toChannel:/noticiation/tier3 data:{"user":"test","action":"register_client"} msgId:0 > 2007-12-19 10:32:38.011::WARN: Handshake:org.mortbay.jetty.EofException > org.mortbay.jetty.EofException > at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:303) > at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205) > at org.mortbay.jetty.client.HttpConnection.handle(HttpConnection.java:238) > at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) > at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450) > The below is a part of my sourcecodes in client and servlet, and I have attched the BayeuxClient.java in attachment. > Server side: > ... > public void startCometdSSLServlet() { > try { > Logger.log(Logger.LOG_NORMAL, "Beginning to start CometdSSLServlet..."); > String sUserDir = System.getProperty("user.dir"); > Server server = new Server(); > SelectChannelConnector connector; > if (_sslEnabled.equalsIgnoreCase("Y")) { > //the connector is for SSL connection > connector = new SslSelectChannelConnector(); > ((SslSelectChannelConnector)connector).setKeystore(_sKeystore); > ((SslSelectChannelConnector)connector).setPassword(_sPwd); > ((SslSelectChannelConnector)connector).setKeyPassword(_sKeyPwd); > ((SslSelectChannelConnector)connector).setNeedClientAuth(_sEnableClientAuth.equals("Y") ? true : false); > //((SslSelectChannelConnector)connector).setPort(_sPort); > } > else{ > connector = new SelectChannelConnector(); > } > connector.setPort(_sPort); > server.addConnector(connector); > //System.setProperty("javax.net.ssl.trustStore", _sKeystore); > Context context = new Context(server, "/", Context.NO_SECURITY | Context.NO_SESSIONS); > context.setResourceBase(sUserDir + "/myweb/"); > ContinuationCometdServlet cometd_servlet = new ContinuationCometdServlet(); > ServletHolder cometd_holder = new ServletHolder(cometd_servlet); > //cometd_holder.setInitParameter("filters","/WEB-INF/filters.json"); > cometd_holder.setInitParameter("timeout", "240000"); > cometd_holder.setInitParameter("interval", "0"); > cometd_holder.setInitParameter("multiFrameInterval", "1500"); > //cometd_holder.setInitParameter("JSONCommented","true"); > //context.addServlet(cometd_holder, "/cometd/*"); > context.addServlet(cometd_holder, "/myweb/*"); > context.addServlet("servlet.DefaultHttpServlet", "/"); > _listener = new BayeuxCometdStartupListener(); > context.addEventListener(_listener); > server.start(); > > AbstractBayeux bayeux = cometd_servlet.getBayeux(); > bayeux.setSecurityPolicy(new AbstractBayeux.DefaultPolicy() { > public boolean canHandshake(Map message) { > System.err.println("BayeuxServlet-------------------canHandshake(Message)"); > // if (_testHandshakeFailure < 0) { > // _testHandshakeFailure++; > // return false; > // } > return true; > } > }); > Logger.log(Logger.LOG_NORMAL, "CometdSSLServlet start successfully!"); > } catch (Exception ex) { > Logger.log(Logger.LOG_ERR, "CometdSSLServlet starts error!"); > ex.printStackTrace(); > } > } > public void pushEvent(Map<String, Object> msg) { > _listener.pushDebugEvent(msg); > } > public static void main(String[] args) { > CometdSSLServlet cometServlet = CometdSSLServlet.getInstance(); > cometServlet.startCometdSSLServlet(); > int i = 0; > while (true) { > try { > Map<String, Object> msg = new HashMap<String, Object>(); > msg.put("eventId", "" + i); > msg.put("eventType", "system"); > msg.put("content", "test" + i); > cometServlet.pushEvent(msg); > i++; > Thread.sleep(5000); > } catch (InterruptedException ex) { > ex.printStackTrace(); > } > } > } > ... > client side: > ..... > private void start() { > Logger.log(Logger.LOG_NORMAL, "CometdSSLClient------Beginning to start Client..."); > try { > try { > startHttpClient(); > } catch (Exception ex) { > Logger.log(Logger.LOG_ERR, "CometdSSLClient------Start HttpClient error"); > ex.printStackTrace(); > } > startBayeuxClient(); > } catch (IOException ex) { > Logger.log(Logger.LOG_ERR, "CometdSSLClient------Start BayeuxClient error"); > ex.printStackTrace(); > } > Logger.log(Logger.LOG_NORMAL, "CometdSSLClient------Start Client successfully!"); > } > private void startHttpClient() throws Exception { > _httpClient = new HttpClient(); > _httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); > _httpClient.setMaxConnectionsPerAddress(MAX_CONNECTION_PERADDRESS); > BoundedThreadPool pool = new BoundedThreadPool(); > pool.setMaxThreads(MAX_THREAD); > //pool.setDaemon(true); > pool.setName("COMETDCLIENT_HREADPOOL"); > _httpClient.setThreadPool(pool); > _httpClient.start(); > } > private void startBayeuxClient() throws IOException { > _bClient = new BayeuxClient(_httpClient, _address, _uri, _isHttps); > Listener listener = new Listener() { > public void deliver(Client fromClient, Client toClient, Map<String, Object> msg) { > Logger.log(Logger.LOG_DEBUG, "CometdSSLClient------------Get Time:" + (new Date())); > Logger.log(Logger.LOG_DEBUG, "CometdSSLClient------------FromClient:" + fromClient + " toClient:" + toClient.getId() + " Message:" + msg); > Object data = (Object) msg.get(AbstractBayeux.DATA_FIELD); > //filtered the "/meta/channel" connection information and only keep "/service/channel" and "/notification/channel" message. > if (data != null) { > //Event event = EventConstructor.constructEvent(msg); > //dispatch Event to every components registered in the event dispatcher via different event filter. > //dispatch(event); > } > } > public void removed(String clientId, boolean timeout) { > } > }; > _bClient.setListener(listener); > _bClient.subscribe(Configurator.CLIENT_NOTIFICATIONCHANNEL); > _bClient.start(); > Logger.log(Logger.LOG_NORMAL, "CometdSSLClient------Start BayeuxClient:" + _bClient.getId()); > } > private void clientPublish(String toChannel, JSON.Literal jsonMsg, String msgId) { > synchronized (_bClient) { > Logger.log(Logger.LOG_DEBUG, "CometdSSLClient------clientPublish toChannel:" + toChannel + " data:" + jsonMsg + " msgId:" + msgId); > _bClient.publish(toChannel, jsonMsg, msgId); > } > } > /** > * > * @param clientType > * please see CometdConfigurator.CLIENT_NOTIFICATION, CometdConfigurator.CLIENT_SERVICE > * > */ > public void registerClient(String clientType) { > // TODO : redefine the registry message. > // or register the client via specified message_id. > String regMsg = "{\"user\":\"test\",\"action\":\"register_client\"}"; > JSON.Literal data = new JSON.Literal(regMsg); > if (clientType.equals(Configurator.CLIENT_NOTIFICATIONCHANNEL)) { > clientPublish(Configurator.CLIENT_NOTIFICATIONCHANNEL, data, "" + 0); > } else { > clientPublish(Configurator.CLIENT_SERVICECHANNEL, data, "" + 1); > } > } > /** > * > * @param clientType > * please see CometdClient.CLIENT_NOTIFICATION, CometdClient.CLIENT_SERVICE > * > */ > public void unregisterClient(String clientType) { > // TODO : redefine the unregistry message. > String regMsg = "{\"user\":\"test\",\"action\":\"unregister_client\"}"; > JSON.Literal data = new JSON.Literal(regMsg); > if (clientType.equals(Configurator.CLIENT_NOTIFICATIONCHANNEL)) { > clientPublish(Configurator.CLIENT_NOTIFICATIONCHANNEL, data, "" + 0); > } else { > clientPublish(Configurator.CLIENT_SERVICECHANNEL, data, "" + 1); > } > } > public static void main(String[] args) { > CometdSSLClient sslClient = CometdSSLClient.getInstance(); > sslClient.start(); > sslClient.registerClient(Configurator.CLIENT_NOTIFICATIONCHANNEL); > } > ...... -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira |