Java ee7 websockets服务器终结点不工作
这是我的服务器代码Java ee7 websockets服务器终结点不工作,java,maven,websocket,Java,Maven,Websocket,这是我的服务器代码 package local.xx.mavenws; import java.io.IOException; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMes
package local.xx.mavenws;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import javax.enterprise.context.ApplicationScoped;
import org.joda.time.DateTime;
@ApplicationScoped
@ServerEndpoint("/")
public class Server {
private final ArrayList<Session> sessions;
public Server() {
this.sessions = new ArrayList<>();
}
@OnOpen
public void onOpen(Session session) {
this.sessions.add(session);
this.echo("Client connected!");
}
@OnClose
public void onClose(Session session) {
this.sessions.remove(session);
this.echo("Client disconnected!");
}
@OnError
public void onError(Throwable error) {
this.echo("Error occured!");
this.echo(error.getLocalizedMessage());
}
@OnMessage
public void onMessage(String message, Session session) {
try {
message = "[" + this.currentDate() + "] " + message;
this.echo(message);
for( Session sess : this.sessions ) {
sess.getBasicRemote().sendText(message);
}
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void echo(String info) {
System.out.println(info);
}
private String currentDate() {
String dateArray[] = (new DateTime()).toString().split("T");
String date = dateArray[0] + " " + (dateArray[1].split("\\.")[0]);
return date;
}
}
package local.xx.mavenws;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.websocket.OnClose;
导入javax.websocket.OnError;
导入javax.websocket.OnMessage;
导入javax.websocket.OnOpen;
导入javax.websocket.Session;
导入javax.websocket.server.ServerEndpoint;
导入javax.enterprise.context.ApplicationScoped;
导入org.joda.time.DateTime;
@适用范围
@ServerEndpoint(“/”)
公共类服务器{
非公开最终ArrayList会议;
公共服务器(){
this.sessions=new ArrayList();
}
@奥诺彭
公共开放(会议){
this.sessions.add(session);
this.echo(“客户端已连接!”);
}
@一次
公共void onClose(会话){
此.sessions.remove(会话);
this.echo(“客户端已断开连接!”);
}
@一个错误
公共无效onError(可丢弃错误){
this.echo(“发生错误!”);
this.echo(error.getLocalizedMessage());
}
@OnMessage
公共void onMessage(字符串消息、会话){
试一试{
message=“[”+此.currentDate()+“]”消息;
这个.echo(消息);
对于(Session sess:this.sessions){
sess.getBasicRemote().sendText(消息);
}
}捕获(IOEX异常){
Logger.getLogger(Server.class.getName()).log(Level.SEVERE,null,ex);
}
}
私有空回显(字符串信息){
系统输出打印项次(信息);
}
私有字符串currentDate(){
字符串dateArray[]=(新的DateTime()).toString().split(“T”);
字符串日期=日期数组[0]+“”+(日期数组[1]。拆分(“\\”)[0]);
返回日期;
}
}
我希望它将收到的消息发送给所有连接的用户。问题是,它单独处理每个连接,就像每个连接都有自己的服务器实例一样。当我在两个浏览器窗口中连接时,消息将分别显示。有人对此有什么想法吗?终于成功了!解决方案是
sessions
变量必须是静态的,我必须始终通过Server
范围调用它,而不是this
。这意味着,尽管为每个连接的用户创建了一个新的Server
实例,但变量对每个人来说都是相互的。可能尝试创建一个单例类消息,并从该类中放置/检索消息。你所说的是什么意思,他们每个人都有自己的服务器实例?当两个用户连接时,您的会话的大小是多少?@JFPicard我认为这不会改变任何事情。。。关键是@karthik,我的会话
大小始终为1。我收到消息后在服务器控制台中打印它。但对于所有用户来说,服务器是相互的,因为他们的消息都登录在同一个控制台中。奇怪。