我正在尝试将一个简单的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);
}
}
}
答案 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服务器通信。