【问题标题】:Java server JavaScript client WebSocketsJava 服务器 JavaScript 客户端 WebSockets
【发布时间】:2017-05-19 03:17:46
【问题描述】:

我正在尝试在 Java 中的服务器和 JavaScript 客户端之间建立连接,但我在客户端收到此错误:

与“ws://127.0.0.1:4444/”的 WebSocket 连接失败:在收到握手响应之前连接已关闭

它可能保持在 OPENNING 状态,因为从未调用过 connection.onopen 函数。 console.log('Connected!') 未被调用。

谁能告诉我这里出了什么问题?

服务器

import java.io.IOException;
import java.net.ServerSocket;

public class Server {

    public static void main(String[] args) throws IOException {

        try (ServerSocket serverSocket = new ServerSocket(4444)) {
            GameProtocol gp = new GameProtocol();

            ServerThread player= new ServerThread(serverSocket.accept(), gp);
            player.start();

        } catch (IOException e) {
            System.out.println("Could not listen on port: 4444");
            System.exit(-1);
        }

    }

}

服务器线程

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThread extends Thread{

    private Socket socket = null;
    private GameProtocol gp;

    public ServerThread(Socket socket, GameProtocol gp) {
        super("ServerThread");
        this.socket = socket;
        this.gp = gp;
    }

    public void run() {

        try (
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(
                                socket.getInputStream()));
                ) {
            String inputLine, outputLine;

            while ((inputLine = in.readLine()) != null) {
                outputLine = gp.processInput(inputLine);
                System.out.println(outputLine);
            }
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

游戏协议

public class GameProtocol {

    public String processInput(String theInput) {

        String theOutput = null;

        theOutput = theInput;

        return theOutput;
    }
}

客户

var connection = new WebSocket('ws://127.0.0.1:4444');

connection.onopen = function () {
    console.log('Connected!');
    connection.send('Ping'); // Send the message 'Ping' to the server
};

// Log errors
connection.onerror = function (error) {
    console.log('WebSocket Error ' + error);
};

// Log messages from the server
connection.onmessage = function (e) {
    console.log('Server: ' + e.data);
};

【问题讨论】:

  • 我试过了,它工作得很好......你用什么浏览器进行测试?另外,是否有任何防火墙可以阻止/干扰响应?
  • 我使用的是 Chrome 55。我不喜欢。另外,如果我在服务器端打印出响应,我会收到我在上面放置的消息。
  • 似乎一切正常...也许,试试另一个端口?像 12000 或更高,我听说有些系统不喜欢低端口号...我只是推测,因为我不知道我们的设置之间可能有什么区别...
  • 我已经尝试过您的建议,但问题仍然存在。您在 Chrome 中尝试过,但它没有打印 WebSocket 错误?
  • 是的,我使用的是 chrome 版本 54.0.2840.71 m(64 位),我在 eclispe 中启动了我的服务器,当我用我的脚本加载页面时,服务器写道:“客户端已连接。”

标签: javascript java websocket java-websocket


【解决方案1】:

首先,您的代码看起来与 Java 和 JavaScript 相同。两者都适用于它们的设计目的,但事实是您正在尝试将 WebSocket 客户端连接到套接字服务器。

据我所知,answer 是两个不同的东西。

我从来没有按照你的方式尝试过。也就是说,如果我有一个使用套接字的网络应用程序,那么它将是纯客户端/服务器套接字,如果它是一个 Web 应用程序,那么我也会在双方都使用 WebSocket。

到目前为止一切顺利..

为了完成这项工作,this answer 建议在服务器端使用任何可用的 WebSocket,您的问题就解决了。

我正在使用WebSocket for Java,这是我用您的客户端代码测试过的示例实现,它在客户端和服务器端都有效。

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

import java.net.InetSocketAddress;
import java.util.HashSet;
import java.util.Set;

public class WebsocketServer extends WebSocketServer {

    private static int TCP_PORT = 4444;

    private Set<WebSocket> conns;

    public WebsocketServer() {
        super(new InetSocketAddress(TCP_PORT));
        conns = new HashSet<>();
    }

    @Override
    public void onOpen(WebSocket conn, ClientHandshake handshake) {
        conns.add(conn);
        System.out.println("New connection from " + conn.getRemoteSocketAddress().getAddress().getHostAddress());
    }

    @Override
    public void onClose(WebSocket conn, int code, String reason, boolean remote) {
        conns.remove(conn);
        System.out.println("Closed connection to " + conn.getRemoteSocketAddress().getAddress().getHostAddress());
    }

    @Override
    public void onMessage(WebSocket conn, String message) {
        System.out.println("Message from client: " + message);
        for (WebSocket sock : conns) {
            sock.send(message);
        }
    }

    @Override
    public void onError(WebSocket conn, Exception ex) {
        //ex.printStackTrace();
        if (conn != null) {
            conns.remove(conn);
            // do some thing if required
        }
        System.out.println("ERROR from " + conn.getRemoteSocketAddress().getAddress().getHostAddress());
    }
}

在你的主要方法上:

new WebsocketServer().start();

您可能需要操作代码以使其适合此实现,但这应该是工作的一部分。

这是带有 2 个测试的测试输出:

New connection from 127.0.0.1
Message from client: Ping
Closed connection to 127.0.0.1
New connection from 127.0.0.1
Message from client: Ping

这里是 WebSocket maven 配置,否则手动下载 JAR 文件并将其导入您的 IDE/开发环境:

<!-- https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket -->
<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.3.0</version>
</dependency>

链接到WebSocket

【讨论】:

  • 那个网站已经不存在了。有没有办法在其他地方找到那个 API? @maytham-ɯɐɥʇʎɐɯ 谢谢!
  • @JaredScarito 这里是链接github.com/TooTallNate/Java-WebSocket 我不知道为什么站点关闭了,但是如果您使用 maven,它就会消失,让您的一天更顺利。祝你好运
  • @maytham-ɯɐɥʇʎɐɯ 你太棒了!非常感谢!
  • 我已经为此苦苦挣扎了好几天。谢谢你
猜你喜欢
  • 2011-06-09
  • 2016-11-12
  • 2014-03-16
  • 2017-06-19
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多