私が取り組んでいるcometdの例があります。この例では、javascript クライアント コードを示します。接続して同じことを実行できる Java クライアントを作成しようとしています。唯一の問題は、接続できないことです。
を呼び出すとhandshake();
、次のように返されます。
java.net.ProtocolException: Unexpected response 404: TransportExchange@f9e597=POST//localhost:8080/cometd/login/handshake#CONTENT(0ms)->COMPLETED(0ms)sent=45ms
何が起こっているのか正確にはわかりません。Javascript クライアント コードは次のとおりです。ユーザーがページ上のボタンをクリックすると呼び出されます。ハンドシェイクを実行します。
$('#connect').click(function() {
var u = $('#user').val();
if(u) {
$.post('login', {
user: u
}, function() {
_disconnecting = false;
cometd.handshake();
});
}
});
これを試して複製するために使用しているクライアント コードを次に示します。私はそれに渡しhttp://localhost:8080/cometd/login
ます:
public void handshake(String url) throws Exception {
// Create (and eventually setup) Jetty's HttpClient
HttpClient httpClient = new HttpClient();
// Here setup Jetty's HttpClient, for example:
// httpClient.setMaxConnectionsPerAddress(2);
httpClient.start();
// Prepare the transport
Map<String, Object> options = new HashMap<String, Object>();
ClientTransport transport = LongPollingTransport.create(options, httpClient);
ClientSession client = new BayeuxClient(url, transport);
// Here setup the BayeuxClient, for example:
client.getChannel(Channel.META_HANDSHAKE).addListener(new ClientSessionChannel.MessageListener() {
public void onMessage(ClientSessionChannel channel, Message message) {
if (message.isSuccessful()) {
System.out.println("HandShake yea!!");
}
}
});
client.handshake();
}
サーバー上で実行中のサーブレットがあります。私はそれにブレークポイントを持っています。ボタンがクリックされたときに呼び出されていることがわかります JavaScript バージョンを使用しています。ただし、自分のバージョンを使用しても呼び出されません。
それが役立つ場合は、サーブレットを次に示します。
public final class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(getUrl(req));
HttpSession session = req.getSession();
String existingUser = (String) session.getAttribute("user");
String user = req.getParameter("user");
if (user != null && user.trim().length() == 0) {
user = null;
}
if (user == null && existingUser == null) {
resp.setStatus(HttpServletResponse.SC_FORBIDDEN);
} else if (existingUser != null && !existingUser.equals(user)) {
resp.setStatus(HttpServletResponse.SC_FORBIDDEN);
} else if (user != null && existingUser == null) {
session.setAttribute("user", user);
resp.setStatus(HttpServletResponse.SC_OK);
}
}
}
そして、ここに web.xml ファイルがあります:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:j2ee="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>cometd</servlet-name>
<servlet-class>org.cometd.java.annotation.AnnotationCometdServlet</servlet-class>
<async-supported>true</async-supported>
<init-param>
<param-name>timeout</param-name>
<param-value>60000</param-value>
</init-param>
<init-param>
<param-name>logLevel</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>services</param-name>
<param-value>ChatService</param-value>
</init-param>
<init-param>
<param-name>transports</param-name>
<param-value>com.ovea.cometd.websocket.jetty8.Jetty8WebSocketTransport</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>cometd</servlet-name>
<url-pattern>/cometd/*</url-pattern>
</servlet-mapping>