【问题标题】:Sockets - Java Client and NodeJS Server套接字 - Java 客户端和 NodeJS 服务器
【发布时间】:2017-07-23 18:40:37
【问题描述】:

我正在尝试将一个简单的 Java 客户端连接到 NodeJS 服务器,但不幸的是,事情并没有那么顺利。我从 Java Doc 中获取了客户端代码,只更改了主机名和端口。现在我的服务器与客户端在同一台计算机上运行,​​端口为 4555。如果我在客户端和服务器上没有相同的端口,则会引发错误,我已经检查过了。此外,如果我在客户端将主机名更改为任意名称(不是 localhost),则会引发错误。这表明如果我无法连接,则会引发错误。有趣的是,如果我将端口设置为 4555 并将主机名设置为“localhost”,我不会收到任何这些错误,而且我的客户端工作正常,这让我认为我正在建立连接,但我没有得到在我的服务器端消息“客户端已连接”。有什么建议吗?

服务器代码:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = 4555;

app.get('/', function(req, res)
{
    res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket)
{
    //When I connect to to localhost:4555 through the web browser(chrome)
    //this message is actually shown so the connection works there.
    console.log('client connected');
});

http.listen(port, function()
{
    //Message shown on program start
    console.log("app running");
});

客户端代码:

import java.io.*;
import java.net.*;

public class Main
{
    public static void main(String[] args) throws IOException
    {
        String hostName = "localhost";
        int portNumber = 4555;

        try (
            Socket echoSocket = new Socket(hostName, portNumber);
            PrintWriter out =
                new PrintWriter(echoSocket.getOutputStream(), true);
            BufferedReader in =
                new BufferedReader(
                    new InputStreamReader(echoSocket.getInputStream()));
            BufferedReader stdIn =
                new BufferedReader(
                    new InputStreamReader(System.in))
        ) {
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("echo: " + in.readLine());
            }
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host " + hostName);
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to " +
                hostName);
            System.exit(1);
        } 
    }
}

【问题讨论】:

  • 为什么不使用 ApacheHTTPClient 库从您的 Java 客户端发出请求?
  • 使用8000以上的端口号。
  • 你有一个客户端和一个服务器。你的服务器需要监听客户端连接的端口,客户端需要连接服务器监听的端口。除此之外,我不知道哪个错误来自服务器,哪个来自客户端。主机名也不是任意的,它必须解析为合理的。

标签: java node.js sockets socket.io


【解决方案1】:

要获得“客户端已连接”消息,您需要一个成功的 socket.io 连接。 socket.io 是一种建立在 webSocket 协议之上的消息传递数据格式。因此,要成功连接到 socket.io 服务器,您需要一个 socket.io 客户端。您无法使用普通 TCP 客户端连接到 socket.io 服务器,这似乎是您尝试做的。

只是为了让您了解这里可能发生的情况,socket.io 期望传入的 webSocket 连接(它以 HTTP 连接开始,然后由于传入的一些特殊标头而“升级”到 webSocket 协议) HTTP 连接。socket.io 在 webSocket 数据帧之上添加了自己的数据格式。因此,只有 socket.io 客户端可以与 socket.io 服务器通信。socket.io 服务器在连接后拒绝传入的连接因为连接上的初始数据不符合正确的格式。

请参阅Writing webSocket Servers 以了解连接到 webSocket 服务器所涉及的内容。有一个使用 HTTP 的初始连接请求格式,有一个升级请求,有安全标头,然后是升级到 webSocket 协议,然后有一个带有加密的数据帧格式,然后 socket.io 然后在上面添加一个消息数据格式这些所有。当您的客户端尝试连接到期望所有这些的服务器时,服务器只会说这是垃圾并断开连接。

如果你想要一个普通的 TCP 连接,那么你可以在你的 node.js 服务器中使用一个普通的 TCP 服务器并连接到它。你想要一个 socket.io 连接,然后你可以得到一个 socket.io client library for Java 并使用它而不是你的普通 Socket 来与你的 socket.io 服务器通信。

【讨论】:

  • @leburger - 这能回答你的问题吗?如果是这样,您可以通过单击答案左侧的绿色复选标记向社区表明这一点,这也将为您赢得一些声誉积分。
猜你喜欢
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2017-02-25
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多