web-dev-qa-db-ja.com

JavaサーバーJavaScriptクライアントWebSocket

JavaのサーバーとJavaScriptクライアントの間で接続を行おうとしていますが、クライアント側で次のエラーが発生します。

'ws://127.0.0.1:4444 /'へのWebSocket接続に失敗しました:ハンドシェイク応答を受信する前に接続が閉じられました

_connection.onopen_関数が呼び出されないため、OPENNING状態のままになる可能性があります。 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);
        }

    }

}
_

ServerThread

_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();
        }
    }
}
_

GameProtocol

_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);
};
_
7
agfac

まず、両方のコードは同じように見えますJavaとJavaScriptのコード。どちらも設計どおりに機能しますが、実際には、WebSocketクライアントをソケットサーバーに接続しようとしています。 。

私が知っているように、これらはこれに関して2つの異なるものです answer

私はあなたのやり方でそれを試したことがありません。つまり、純粋なクライアント/サーバーソケットよりもソケットを使用するネットワークアプリケーションがある場合、およびそれがWebアプリケーションである場合は、両側でもWebSocketを使用します。

これまでのところ良い..

これを機能させるために、 この回答 はサーバー側で利用可能な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

これがWebSocketMaven構成です。それ以外の場合は、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 へのリンク。