【发布时间】: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)
});
我有一些问题
- 如何将 JSON 对象写入我的服务器应用程序 (C++)。我知道 JSON.stringify(obj) 会返回字符串并且可以被覆盖?
- 如何在另一端编写我的 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。