【问题标题】:How to write a JSON File over TCP Socket in express to C++ program如何在 Express 到 C++ 程序中通过 TCP 套接字编写 JSON 文件
【发布时间】:2021-03-26 20:16:03
【问题描述】:

这与问题About server-client architecture in express.js有关

我目前正在编写程序的客户端部分,它应该在 express.jsvar 中

var request = require('request'),
    express = require('express'),
    path    = require('path');

const net = require('net');

var app = express();

// for Express 4.16 above use this instead of
// using body-Parser: app.use(bodyParser.json())
app.use(express.json());


// configuration setting
const PORT1 = 5000;
const port2 = 5001;
const PORT3 = 1337;
const HOST = '127.0.0.1';

app.set('port', (process.env.PORT || PORT1));

var client = new net.Socket();
var id = 0;

// start a tcp connection to connect to server
client.connect(PORT3, HOST, function() {
    console.log('SEND PORT CONNECTED TO: ' + HOST + ':' + PORT3);
});

// using Github for testing web hook
app.post('/getGithub', function(req, res) 
{
    // tester code
    //var data = "20a980dc00b413dc3d0000a3";
    //var data = "e36ace0044ed3d0cc3810000";
    var data = req.body;
    console.log(data);
        
    client.write('Hello, server! Love, Client.' + id + " ");
    client.write(data);
    res.json(data);

});

// http server location
var server = app.listen(app.get('port'), function() {
    var host   = server.address().address
    var portid = server.address().port

    console.log('App listening at http://%s:%s', host, portid)
    console.log("App listening on port " + app.get('port'));
});

// error handler
app.use(function (err, req, res, next) {
    res.status(400).send(err.message)
});

我有一些问题

  1. 如何将 JSON 对象写入我的服务器应用程序 (C++)。我知道 JSON.stringify(obj) 会返回字符串并且可以被覆盖?
  2. 如何在另一端编写我的 C++ 程序?我已经编写了一些 C++ 程序,但是在使用另一个 express 程序时似乎出现了一些问题,这似乎还可以。当我运行 C++ 程序时,express 中的客户端程序不断给我 ECONNECT 拒绝

我的 C++ 程序

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <jsoncpp/json/json.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main()
{
    /* all previous code until
    printf("Reading from client\n"); */

   int listenfd = 0, connfd = 0;    //related with the server
   int MAX_SIZE = 158;
   struct sockaddr_in serv_addr;

   //json_object * jobj;
   char buf[MAX_SIZE], i;

   memset(&buf, '0', sizeof(buf));
   listenfd = socket(AF_INET, SOCK_STREAM, 0);

   serv_addr.sin_family = AF_INET;
   serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
   serv_addr.sin_port = htons(1337); 

   bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
   printf("binding\n");

   listen(listenfd, 5);
   printf("listening\n");
   connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);

   printf("Reading from client\n");
    ssize_t r;

    for (;;)
    {
        r = read(connfd, buf, MAX_SIZE);

        if (r == -1)
        {
            perror("read");
            return EXIT_FAILURE;
        }
        if (r == 0)
            break;

        printf("READ: %s\n", buf);
    }

    return EXIT_SUCCESS;
}

错误是:

Error: connect ECONNREFUSED 127.0.0.1:1337
    at Object._errnoException (util.js:1022:11)
    at _exceptionWithHostPort (util.js:1044:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1198:14)

【问题讨论】:

  • 您需要将其作为文本发送。服务器应该接收它作为它接收的任何其他数据。但请注意,它接收到的数据不会是一个以空字符结尾的字符串。如果要使用printf 格式%s 打印数据,则需要添加空终止符。
  • @Someprogrammerdude :所以我应该称之为 client.write(JSON.stringify(data));而在服务器端(C++ 代码)我应该只是将传入的消息作为文本读取?
  • 是的,就是这样。但请记住 C++ 程序中的空终止符部分。
  • @Someprogrammerdude :那我能不能麻烦你,为什么我的 C++ 服务器程序无法工作......每次我启动它然后使用客户端(快速)它都会收到错误消息 ECONNECT 被拒绝。
  • 现在是时候做一些你应该立即做的事情了:在你的服务器程序中添加错误检查。您调用的所有套接字函数都可能失败,但您只检查read

标签: c++ node.js express tcp


【解决方案1】:

不管 languaje 是服务器:一旦你发送一个 Json 字符串,它就独立于服务器:你可以有一个 java 程序、一个 C++ 程序,甚至是一个 Apache/PHP 程序(在最后一种情况下,通过 HTTP 调用、使用库或添加标头)。

首先你需要你的 json 数据

var obj = { name: "John", age: 30, city: "New York" };
var myJSONData = JSON.stringify(obj);

然后,你应该做一个原始套接字连接:

var net = require('net');
var HOST = '127.0.0.1';
var PORT = 1337;

// (a) =========
var client = new net.Socket();
client.connect(PORT, HOST, function() {

    console.log('CONNECTED TO: ' + HOST + ':' + PORT);
    // Write a message to the socket as soon as the client is connected, the server will receive it as message from the client
    client.write(myJSONData );

});
client.destroy();

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 2016-02-15
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多