Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ee7 websockets服务器终结点不工作_Java_Maven_Websocket - Fatal编程技术网

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。我收到消息后在服务器控制台中打印它。但对于所有用户来说,服务器是相互的,因为他们的消息都登录在同一个控制台中。奇怪。