Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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 未从Jetty服务器发送WebSocket消息_Java_Websocket_Jetty 9 - Fatal编程技术网

Java 未从Jetty服务器发送WebSocket消息

Java 未从Jetty服务器发送WebSocket消息,java,websocket,jetty-9,Java,Websocket,Jetty 9,伙计们 我正在使用WebSocket实现一个聊天web应用程序,但是,当在Jetty 9.1.3.v20140225上运行时,在建立连接之后,客户端不会接收到从服务器端发送的一些消息。奇怪的是,这种错误行为发生在一些消息中,但其他消息是正常的(请参阅最后的PS) 我试过Chrome33(我知道它使用了Permessagedeflate扩展)和Firefox28(它没有),结果相似。事实上,Chrome收到了一些消息,但FireFox没有收到任何消息 当应用程序在Tomcat7.0.47上运行时,

伙计们

我正在使用WebSocket实现一个聊天web应用程序,但是,当在Jetty 9.1.3.v20140225上运行时,在建立连接之后,客户端不会接收到从服务器端发送的一些消息。奇怪的是,这种错误行为发生在一些消息中,但其他消息是正常的(请参阅最后的PS)

我试过Chrome33(我知道它使用了Permessagedeflate扩展)和Firefox28(它没有),结果相似。事实上,Chrome收到了一些消息,但FireFox没有收到任何消息

当应用程序在Tomcat7.0.47上运行时,它工作正常,所以我怀疑问题出在Jetty上

故事讲述让我们看看我的最小应用程序的代码,它再现了问题:

首先,有一个简单的页面,您可以通过单击相应按钮连接、发送消息(并接收响应)和断开WebSocket

hello.html:

<html>
<head>
<meta charset="ISO-8859-1">
<title>Minimum - WebSocket Sandbox</title>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        $("#connect").click(function() {
            connect();
        });
        $("#send").click(function() {
            send("John Doe");
        });
        $("#disconnect").click(function() {
            disconnect();
        });
    });
</script>
<script>
    var wsocket;

    function connect() {
        var base = getAppLocation("ws:");
        wsocket = new WebSocket(base + "/hello");
        wsocket.onmessage = function(e) {
            log("<<< " + e.data);
        };
        wsocket.onopen = function() {
            log("Connection opened.");
        };
        wsocket.onclose = function(e) {
            log("Connection closed.  Reason: (" + e.code + ") " + e.reason);
        };
        wsocket.onerror = function(e) {
            log("Error!");
        };
    }

    function disconnect() {
        wsocket.close(1000, "Closed by user.");
        wsocket = null;
    }

    function send(msg) {
        if ( !wsocket || wsocket.readyState != WebSocket.OPEN ) {
            log("Not connected.");
            return;
        }
        wsocket.send(msg);
        log(">>> " + msg);
    }

    function log(msg) {
        $("#output").append(msg + "<br/>");
    }

    /**
     * This just ajust WebSocket URL ocording to the server serving the page.
     */
    function getAppLocation(proto) {
        if ( !proto ) {
            proto = window.location.protocol;
        }
        else if ( proto == "ws:" && window.location.protocol == "https:" ) {
            proto = "wss:";
        }
        var host = window.location.host;
        var path = window.location.pathname.split('/')[1];
        var base = proto + "//" + host + "/" + path;
        return base;
    }
</script>
</head>
<body>
  <div>
    <button id="connect">Connect</button>
    <button id="send">Send</button>
    <button id="disconnect">Disconnect</button>
  </div>
  <div id="output"></div>
</body>
</html>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
             http://maven.apache.org/POM/4.0.0 
             http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <name>WebSocket Mininum</name>
  <description>WebSocket Minimum Web Application</description>
  <groupId>com.ciandt.helenov.sandbox</groupId>
  <artifactId>ws-min</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.7</java.version>
    <slf4j.version>1.7.2</slf4j.version>
    <logback.version>1.0.13</logback.version>
    <jetty.version>9.1.3.v20140225</jetty.version>
    <tomcat.version>7.0.47</tomcat.version>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <compilerVersion>${java.version}</compilerVersion>
          <source>${java.version}</source>
          <target>${java.version}</target>
          <encoding>${project.build.sourceEncoding}</encoding>
          <compilerArgument>-proc:none</compilerArgument>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <attachClasses>true</attachClasses>
        </configuration>
      </plugin>
      <!-- Support to use Eclipse -->
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-eclipse-plugin</artifactId>
          <version>2.7</version>
          <configuration>
              <downloadSources>true</downloadSources>
              <downloadJavadocs>true</downloadJavadocs>
              <wtpversion>2.0</wtpversion>
          </configuration>
      </plugin>
      <!-- Support to run Jetty on Eclipse -->
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty.version}</version>
        <configuration>
          <webAppConfig>
            <contextPath>/${project.artifactId}</contextPath>
          </webAppConfig>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>9090</port>
          <path>/${project.artifactId}</path>
          <systemProperties>
            <appserver.base>${project.build.directory}/tomcat-base</appserver.base>
            <appserver.home>${project.build.directory}/tomcat-home</appserver.home>
            <derby.system.home>${project.build.directory}/tomcat-base/logs</derby.system.home>
            <java.io.tmpdir>${project.build.directory}</java.io.tmpdir>
          </systemProperties>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>javax.websocket</groupId>
      <artifactId>javax.websocket-api</artifactId>
      <version>1.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

</project>
最后是这个pom.xml,它打包并运行web应用程序。我正在通过Eclipse中的嵌入式maven插件运行Jetty(出现问题的地方)和TomCat(运行得很好)

pom.xml:

<html>
<head>
<meta charset="ISO-8859-1">
<title>Minimum - WebSocket Sandbox</title>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        $("#connect").click(function() {
            connect();
        });
        $("#send").click(function() {
            send("John Doe");
        });
        $("#disconnect").click(function() {
            disconnect();
        });
    });
</script>
<script>
    var wsocket;

    function connect() {
        var base = getAppLocation("ws:");
        wsocket = new WebSocket(base + "/hello");
        wsocket.onmessage = function(e) {
            log("<<< " + e.data);
        };
        wsocket.onopen = function() {
            log("Connection opened.");
        };
        wsocket.onclose = function(e) {
            log("Connection closed.  Reason: (" + e.code + ") " + e.reason);
        };
        wsocket.onerror = function(e) {
            log("Error!");
        };
    }

    function disconnect() {
        wsocket.close(1000, "Closed by user.");
        wsocket = null;
    }

    function send(msg) {
        if ( !wsocket || wsocket.readyState != WebSocket.OPEN ) {
            log("Not connected.");
            return;
        }
        wsocket.send(msg);
        log(">>> " + msg);
    }

    function log(msg) {
        $("#output").append(msg + "<br/>");
    }

    /**
     * This just ajust WebSocket URL ocording to the server serving the page.
     */
    function getAppLocation(proto) {
        if ( !proto ) {
            proto = window.location.protocol;
        }
        else if ( proto == "ws:" && window.location.protocol == "https:" ) {
            proto = "wss:";
        }
        var host = window.location.host;
        var path = window.location.pathname.split('/')[1];
        var base = proto + "//" + host + "/" + path;
        return base;
    }
</script>
</head>
<body>
  <div>
    <button id="connect">Connect</button>
    <button id="send">Send</button>
    <button id="disconnect">Disconnect</button>
  </div>
  <div id="output"></div>
</body>
</html>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
             http://maven.apache.org/POM/4.0.0 
             http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <name>WebSocket Mininum</name>
  <description>WebSocket Minimum Web Application</description>
  <groupId>com.ciandt.helenov.sandbox</groupId>
  <artifactId>ws-min</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.7</java.version>
    <slf4j.version>1.7.2</slf4j.version>
    <logback.version>1.0.13</logback.version>
    <jetty.version>9.1.3.v20140225</jetty.version>
    <tomcat.version>7.0.47</tomcat.version>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <compilerVersion>${java.version}</compilerVersion>
          <source>${java.version}</source>
          <target>${java.version}</target>
          <encoding>${project.build.sourceEncoding}</encoding>
          <compilerArgument>-proc:none</compilerArgument>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <attachClasses>true</attachClasses>
        </configuration>
      </plugin>
      <!-- Support to use Eclipse -->
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-eclipse-plugin</artifactId>
          <version>2.7</version>
          <configuration>
              <downloadSources>true</downloadSources>
              <downloadJavadocs>true</downloadJavadocs>
              <wtpversion>2.0</wtpversion>
          </configuration>
      </plugin>
      <!-- Support to run Jetty on Eclipse -->
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty.version}</version>
        <configuration>
          <webAppConfig>
            <contextPath>/${project.artifactId}</contextPath>
          </webAppConfig>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>9090</port>
          <path>/${project.artifactId}</path>
          <systemProperties>
            <appserver.base>${project.build.directory}/tomcat-base</appserver.base>
            <appserver.home>${project.build.directory}/tomcat-home</appserver.home>
            <derby.system.home>${project.build.directory}/tomcat-base/logs</derby.system.home>
            <java.io.tmpdir>${project.build.directory}</java.io.tmpdir>
          </systemProperties>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>javax.websocket</groupId>
      <artifactId>javax.websocket-api</artifactId>
      <version>1.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

</project>

4.0.0
最小网袋
WebSocket最小Web应用程序
com.ciandt.helenov.sandbox
ws-min
0.0.1-快照
战争
UTF-8
1.7
1.7.2
1.0.13
9.1.3.v20140225
7.0.47
org.apache.maven.plugins
maven编译器插件
3.1
${java.version}
${java.version}
${java.version}
${project.build.sourceEncoding}
-过程:无
org.apache.maven.plugins
maven战争插件
2.4
真的
org.apache.maven.plugins
maven eclipse插件
2.7
真的
真的
2
org.eclipse.jetty
jetty maven插件
${jetty.version}
/${project.artifactId}
org.apache.tomcat.maven
tomcat7 maven插件
2.2
9090
/${project.artifactId}
${project.build.directory}/tomcat base
${project.build.directory}/tomcat home
${project.build.directory}/tomcat base/logs
${project.build.directory}
javax.websocket
javax.websocket-api
1
假如
就这些

在Jetty上运行应用程序时(通过调用mvn Jetty:run),我请求连接一个WebSocket(通过单击第页上的Connect按钮),端点中的onOpen()方法运行,并将消息发送回客户端,但由于我希望它显示,所以没有收到消息。在TomCat上运行相同的应用程序时(通过调用mvn tomcat7:run),它工作得非常好

有人有类似的问题吗?有人知道发生了什么事吗?这可能是Jetty服务器上的错误吗

蒂亚和问候

海伦诺


PS:我打算在我的应用程序中使用Spring和SockJS,但SockJS会在服务器上中继,在连接打开后发送一个“开放帧”(只是一个“o”),但由于没有收到它,它会返回其备用连接,放弃WebSocket连接并进行XHR流。这就是我想要避免的。但是,由于我成功地在没有Spring和SockJS的情况下重现了这个问题(如本文代码所示),因此我已经解除了他们与这个问题的任何关系