从JAVA向node.js/socket.io服务器发送数据

3
我将尝试使用Java向我的node.js/socket.io服务器发送消息。
以下是我用于发送消息的代码:
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

class socketMessage {

    public socketMessage() {
    }

    public static void send(String string) throws Exception {
        System.out.println("Sending message to Socket Server!");

        URL url = new URL("http://<mysite>:8000");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        try (OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream())) {
            System.out.println("Data Sent!");
            writer.write(string);
            writer.flush();
        }
        conn.getResponseCode(); // Thanks to BGR
    }
}

被调用的代码如下:socketMessage.send("Admin|notification|已在其他地方登录\n> 官方Java应用");

以下是服务器端的代码:

var http = require("http");
var io = require('socket.io');

var sessionsConnections = {};
var whereIsUserVisitingFrom = {};

console.log("\n\n-------------------------------- Server Started --------------------------------");

var server = http.createServer(function(req, res){ 
    var body = '';
    req.on('data', function(data){
        console.log('Received Data');
        body += data;
    });
    req.on('end', function() {
        // Emit the data to all clients
        ioServer.emit('message', { message: body });
    });
});
server.listen(8000);

var ioServer = io.listen(server, { log: false });

ioServer.on('connection', function(socket) {

    var currentUser;

    var parts;

    socket.on('started', function(data) {
        currentUser = data.username;
        sessionsConnections[currentUser] = socket.id;
        whereIsUserVisitingFrom[currentUser] = data.from;
        socket.emit("connected", { message: "Welcome, " + currentUser + "!" });

        socket.broadcast.emit("updateUsers", { message: sessionsConnections, from: whereIsUserVisitingFrom });
        socket.emit("updateUsers", { message: sessionsConnections, from: whereIsUserVisitingFrom });
    });

    socket.on('message', function(data) {
        var parts = data.message.split("|");

        socket.broadcast.emit("updateUsers", { message: sessionsConnections, from: whereIsUserVisitingFrom });
        socket.emit("updateUsers", { message: sessionsConnections, from: whereIsUserVisitingFrom });

        console.log("Message Recieved!");

        if( parts[0] == "*" ) {
            socket.broadcast.emit("display", { message: data.message });
        }else{
            if( parts[0] in sessionsConnections ) {
                io.sockets.socket(sessionsConnections[parts[0]]).emit("display", { message: data.message });
            }else{
                socket.emit("display", { message: "That user is not online!" });
            }
        }
    });

    socket.on('disconnect', function() {
        delete sessionsConnections[currentUser];
        socket.broadcast.emit("updateUsers", { message: sessionsConnections, from: whereIsUserVisitingFrom });
        socket.emit("updateUsers", { message: sessionsConnections, from: whereIsUserVisitingFrom });
    });

});

目前我的服务器基本上是这样的:当我访问我的网站时,就会从我的管理中心以"{user}|{action (例如通知)}|{text/额外参数}"的形式发送命令。然后服务器将向设置为{user}的客户端发送消息,我在客户端代码中拆分该消息并相应地更改网站的UI。但是我也想从我的Java应用程序中执行此操作,但它不起作用 :(

有任何想法吗?

Vinny

提前感谢。


你能定义一下“不工作”是什么意思吗?是出现错误?超时了吗?……? - ggrandes
服务器没有接收到数据,我让我的服务器在每次接收到数据时都写入控制台,但我不知道如何检查错误或超时。我猜它们会显示在 Netbeans 输出控制台的 Java 客户端一侧,如果是这样,那么就没有显示任何错误/超时。 - MRVDOG
2个回答

1
完成HTTP连接需要读取HTTP响应。
try块后插入conn.getResponseCode()

我已添加此内容,但我的节点服务器未收到消息 :/ - MRVDOG
@MRVDOG conn.getResponseCode() 的值是多少? - Bruno Grieder
conn.getResponseCode()返回'200'。 - MRVDOG
@MRVDOG,您的服务器已经接收到连接并进行了回复。请在服务器端运行调试器,您的客户端看起来很好或者没有发送任何内容。 - Bruno Grieder
好的,我会做的。我现在有工作,所以等回家后再试一下。谢谢你的帮助,我会告诉你进展如何。 - MRVDOG

0

添加后

conn.getResponseCode()

仍然无法使其工作。 最终我找到了socket.io-java-client,正是我们所需要的。因为socket.io不使用您使用的原始websocket,而是在其上添加了一个协议,因此您的代码中的"data"事件永远不会被触发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接