我正在尝试在我的Play应用中加入Websockets。 我的路线文件如下:
GET /login controllers.Application.login()
POST /login controllers.Application.authenticate()
GET /logout controllers.Application.logout()
GET /loggedin controllers.Presencelanding.loggedInSocket()
GET /loggedin controllers.Presencelanding.loggedIn()
我想在用户重定向到此/登录页面后立即创建一个websocket
现在我的控制器在场,我有
public static Result loggedIn(){
..... blah ....blah}
public static WebSocket loggedInSocket() {
try {
final Http.Session session = session();
String username = session(AppConstants.USERNAME);
connection = getConnection(username);
connection = XMPPConnectionHandler.performLogin(
xmppLogin.getLoggedinuser().getUsername(),
xmppLogin.getLoggedinuser().getPassword(),connection);
getAllData();
} catch (Exception e) {
e.printStackTrace();
Logger.error(e.getLocalizedMessage());
}
return new WebSocket() {
public void onReady(WebSocket.In in, WebSocket.Out out) {
System.out.println("ready");
in.onMessage(new F.Callback() {
public void invoke(String event) {
System.out.println(event);
}
@Override
public void invoke(Object a) throws Throwable {
System.out.println(a);
}
});
in.onClose(new F.Callback0() {
public void invoke() {
System.out.println("Disconnected");
}
});
out.write(loggedin.render(xmppLogin,completedChallenges,
pendingSentFromMeChal,pendingForMeChal,unseen));
}
};
}
从我在客户端的javascript中我有:
$(document).ready(function () {
getWebSocket();
});
function getWebSocket() {
var ws = new WebSocket("ws://localhost:9000/loggedInSocket");
}
但是当我在我的路线文件中添加websocket返回功能时,我得到以下错误: 无法使用将play.mvc.WebSocket [?0]作为Handler
返回的方法如果我删除此行并重试此操作,则在尝试设置websocket时出现Javascript控制台错误: 与'ws:// localhost:9000 / loggedInSocket'的WebSocket连接失败:意外的响应代码:500
QS2:我如何使用相同的websocket更新html?
问题3:关于使用scala的websockets,有很多关于使用Iteratees等的帖子。 java也有并行...
感谢任何帮助。谢谢!
答案 0 :(得分:1)
将您的路线更改为:
GET /login controllers.Application.login()
POST /login controllers.Application.authenticate()
GET /logout controllers.Application.logout()
GET /loggedInSocket controllers.Presencelanding.loggedInSocket()
GET /loggedin controllers.Presencelanding.loggedIn()
答案 1 :(得分:0)
感谢您的回答。 我可以通过在路径文件中添加以下行来解决这个问题:
GET /loggedin/loggedInSocket controllers.Presencelanding.loggedInSocket()