我试图使用带有spark的web套接字并使用/ chat作为终点url。以下是我的代码。
@ServerEndpoint("/chat")
public class Main {
public static void main(String[] args) {
port(Integer.valueOf(System.getenv("PORT")));
Spark.staticFileLocation("/public");
}
private static final Set<Session> sessions = Collections
.synchronizedSet(new HashSet<Session>());
private static final HashMap<String, String> nameSessionPair = new HashMap<String, String>();
private JSONUtils jsonUtils = new JSONUtils();
public static Map<String, String> getQueryMap(String query) {
Map<String, String> map = Maps.newHashMap();
if (query != null) {
String[] params = query.split("&");
for (String param : params) {
String[] nameval = param.split("=");
map.put(nameval[0], nameval[1]);
}
}
return map;
}
@OnOpen
public void onOpen(Session session) {
System.out.println(session.getId() + " has opened a connection");
Map<String, String> queryParams = getQueryMap(session.getQueryString());
String name = "";
if (queryParams.containsKey("name")) {
name = queryParams.get("name");
try {
name = URLDecoder.decode(name, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
nameSessionPair.put(session.getId(), name);
}
sessions.add(session);
try {
session.getBasicRemote().sendText(
jsonUtils.getClientDetailsJson(session.getId(),
"Your session details"));
} catch (IOException e) {
e.printStackTrace();
}
sendMessageToAll(session.getId(), name, " joined conversation!", true,
false);
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("Message from " + session.getId() + ": " + message);
String msg = null;
try {
JSONObject jObj = new JSONObject(message);
msg = jObj.getString("message");
} catch (JSONException e) {
e.printStackTrace();
}
sendMessageToAll(session.getId(), nameSessionPair.get(session.getId()),
msg, false, false);
}
@OnClose
public void onClose(Session session) {
System.out.println("Session " + session.getId() + " has ended");
String name = nameSessionPair.get(session.getId());
sessions.remove(session);
sendMessageToAll(session.getId(), name, " left conversation!", false,
true);
}
private void sendMessageToAll(String sessionId, String name,
String message, boolean isNewClient, boolean isExit) {
for (Session s : sessions) {
String json = null;
if (isNewClient) {
json = jsonUtils.getNewClientJson(sessionId, name, message,
sessions.size());
} else if (isExit) {
json = jsonUtils.getClientExitJson(sessionId, name, message,
sessions.size());
} else {
json = jsonUtils
.getSendAllMessageJson(sessionId, name, message);
}
try {
System.out.println("Sending Message To: " + sessionId + ", "
+ json);
s.getBasicRemote().sendText(json);
} catch (IOException e) {
System.out.println("error in sending. " + s.getId() + ", "
+ e.getMessage());
e.printStackTrace();
}
}
}
}
问题是永远不会调用onOpen
方法,当用户到达终点url时,会抛出404错误。为什么会这样?
我正在使用heroku部署它,我使用socket_url作为我的站点名称,并且我在js文件中将端口留空了。
我该如何解决这个问题?
答案 0 :(得分:1)
此代码不适用于example from Heroku.com。这是因为tomcat和jetty runners不支持websockets注释(不知道原因)。您将能够使用嵌入式Jetty运行它。主要方法的示例,maven的pom和heroku的procfile,您可以在privateblog.info找到:
web: java $JAVA_OPTS -cp target/JettyServer-0.0.1-SNAPSHOT-jar-with-dependencies.jar info.privateblog.Proxy $PORT