繁体   English   中英

Javascript 客户端无法连接到 Java 服务器

[英]Javascript client can't connect to java server

我正在一个简单的服务器上工作,只是为了了解它是如何工作的。 我有一个 java 服务器和 java 客户端可以工作,但是试图让一个 javascript 客户端连接到同一个 java 服务器让我发疯!

Java服务器:

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

public class DateServer {

    public static void main(String[] args) throws IOException {
        ServerSocket listener = new ServerSocket(9091);
        System.out.println("Starting");
        try {
            while (true) {
                System.out.println("While");
                Socket socket = listener.accept();
                System.out.println("Accepted");
                BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String msg = input.readLine();
                System.out.println("Message from client: " + msg);
                try {
                    PrintWriter out =
                        new PrintWriter(socket.getOutputStream(), true);

                    System.out.println("Sending message...");
                    out.println("Hi");
                } finally {
                    System.out.println("Closing socket");
                    socket.close();
                }
            }
        }
        finally {
            listener.close();
        }
    }
}

Java客户端:(有效)

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

import javax.swing.JOptionPane;

public class DateClient {

    public static void main(String[] args) throws IOException {
        Socket s = new Socket("localhost", 9091);

        try {
            PrintWriter out =
                new PrintWriter(s.getOutputStream(), true);

            System.out.println("Sending message...");
            out.println("I'm the client");
        } finally {
            //System.out.println("Closing socket");
            //s.close();
        }

        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String msg = input.readLine();
        System.out.println(msg);
        JOptionPane.showMessageDialog(null, msg);
        s.close();
        System.exit(0);
    }
}

JavaScript 客户端:

<!DOCTYPE html>

<html>
<head>
        <title>Echo Test</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width">
    </head>
<body>
<div id="messages"></div>
<script type="text/javascript">

var connection = new WebSocket('ws://localhost:9091/');
var messages = document.getElementById("messages");

// When the connection is open, send some data to the server
connection.onopen = function (e) {
  writeResponse('sent');
  connection.send('Ping');
}

// Log errors
connection.onerror = function (error) {
  writeResponse('Error: ' + error);
}

connection.onclose = function(e){
    writeResponse("Disconnected: " + e.data);
}

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

function writeResponse(text){
                messages.innerHTML += "<br/>" + text;
            }

</script>
</body>
</html>

当我使用服务器运行 java 客户端时,我得到:

Starting
While
Accepted
Message from client: I'm the client
Sending message...
Closing socket
While

和客户端的输出:

Sending message...
Hi

所以这有效。 当我运行 javascript 客户端时,服务器的输出是:

Starting
While
Accepted
Message from client: GET / HTTP/1.1
Sending message...
Closing socket
While

javascript页面上的输出是:

Error: [object Event]
Disconnected: undefined

此外,firefox 控制台显示“Firefox 无法与位于 ws://localhost:9091/ 的服务器建立连接”。 我错过了什么? 谢谢!

来自浏览器的 webSocket 连接不仅仅是普通的 TCP 连接。 它必须支持完整的 webSocket 协议,否则浏览器将无法连接到它或交换数据。 这个完整的 webSocket 协议包括:

  1. 通过 HTTP 的初始连接
  2. 对 webSocket 协议的升级
  3. 初始化 webSocket 连接的安全过程
  4. webSocket数据包格式

您可以在此处阅读更多相关信息: https : //developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM