套接字 - Java客户端和NodeJS服务器

时间:2017-07-23 18:40:37

标签: java node.js sockets socket.io

我正在尝试将一个简单的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);
        } 
    }
}

1 个答案:

答案 0 :(得分:2)

让您的客户连接"消息,您需要一个成功的socket.io连接。 socket.io是基于webSocket协议构建的消息传递数据格式。因此,要成功连接到socket.io服务器,您需要一个socket.io客户端。您无法使用普通TCP客户端连接到socket.io服务器,这是您尝试执行的操作。

为了让您了解这里可能发生的事情,socket.io需要一个传入的webSocket连接(它作为HTTP连接开始生活,然后升级到#34;到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服务器通信。