无法从http模块创建套接字服务器

时间:2017-05-20 19:08:28

标签: node.js sockets

我想像Socket.io一样创建套接字服务器,因为socket.io不能与Corona SDK一起使用。所以我需要定制套接字服务器。我使用net模块创建套接字服务器,它工作正常。但我需要使用http模块,因为我编写了REST API。我尝试从http模块创建示例套接字服务器,但是有错误。

var net = require('net');
var HOST = 'localhost';
var PORT = 9999;

var server = require('http').createServer(function(request, response) {
    response.end('Hello from server');
});

server.on('connection', function(socket) {
    socket.on('data', function(data) {
        data = data.toString('utf-8');

        console.log(data);

        socket.write('Hello from server');
    });

    socket.on('error', function(error) {
        console.log(error);
    });
});

server.listen(PORT, HOST);

var client = new net.Socket();
client.connect(PORT, HOST, function() {
    console.log('CONNECTED TO: ' + HOST + ':' + PORT);

    client.write('I am Chuck Norris!');
});

client.on('data', function(data) {
    console.log('DATA: ' + data);

    client.destroy();
});

client.on('close', function() {
    console.log('Connection closed');
});

如果我运行此脚本,我收到错误:

CONNECTED TO: localhost:9999
I am Chuck Norris!
Error: This socket is closed
    at Socket._writeGeneric (net.js:692:19)
    at Socket._write (net.js:743:8)
    at doWrite (_stream_writable.js:329:12)
    at writeOrBuffer (_stream_writable.js:315:5)
    at Socket.Writable.write (_stream_writable.js:241:11)
    at Socket.write (net.js:670:40)
    at Socket.<anonymous> (/var/work/projects/edorium/Server/test/test.js:49:16)
    at emitOne (events.js:101:20)
    at Socket.emit (events.js:191:7)
    at readableAddChunk (_stream_readable.js:178:18)
{ Error: Parse Error
    at socketOnData (_http_server.js:411:20)
    at emitOne (events.js:101:20)
    at Socket.emit (events.js:191:7)
    at readableAddChunk (_stream_readable.js:178:18)
    at Socket.Readable.push (_stream_readable.js:136:10)
    at TCP.onread (net.js:560:20) bytesParsed: 0, code: 'HPE_INVALID_METHOD' }
Connection closed

为什么会发生这种情况以及如何解决这个问题?

回答

我添加了HTTP标头以供请求,并且一切正常!

以下代码示例:

var http = require('http');
var net = require('net');
var express = require('express');
var HOST = 'localhost';
var PORT = 9999;

var app = express();
var server = http.Server(app);
app.get('/', function (req, res) {
    res.send('Hello World!fff');
});

server.listen(PORT, HOST);

server.on('connection', function(socket) {
    socket.on('data', function(data) {
        data = data.toString('utf-8');

        console.log(data);

        socket.write('Hello from server');
    });

    socket.on('error', function(error) {
        console.log(error);
    });

    socket.on('end', function() {
        console.log('Socket end');
    });
});

// Client
var client = new net.Socket();
client.connect(PORT, HOST, function() {
    console.log('CONNECTED TO: ' + HOST + ':' + PORT);
    var messagae = '' +
        'GET /' +
        'Host:localhost:9999' +
        'Content-Type:text/plain;charset=windows-1251' +
        'Content-Length:6' +
        'Connection:Keep-Alive;' +
        'Hello!';
    client.write(messagae);
});

client.on('data', function(data) {
    console.log('DATA: ' + data);
});

client.on('close', function() {
    console.log('Connection closed');
});

2 个答案:

答案 0 :(得分:3)

at TCP.onread (net.js:560:20) bytesParsed: 0, code: 'HPE_INVALID_METHOD' }

由于您已明确创建HTTP服务器,因此该服务器需要HTTP请求。但你只是发送“我是查克诺里斯!”这绝对不是HTTP请求。因此,服务器关闭连接。

要发送HTTP请求,您可以使用http.request。或者,您可以研究HTTP standard并自己构建正确的HTTP请求。

答案 1 :(得分:0)

您的客户端已断开连接

var net = require('net');
var HOST = 'localhost';
var PORT = 9999;


var server = net.createServer(function(socket) {
    socket.write('Echo server\r\n');
    socket.on('data', function(data){
    console.log(data);
    textChunk = data.toString('utf8');
    console.log(textChunk);
    socket.write("================");
    });
});
server.listen(PORT, '127.0.0.1');

server.listen(PORT, HOST);

var client = new net.Socket();
client.connect(PORT, HOST, function() {
console.log('CONNECTED TO: ' + HOST + ':' + PORT);

client.write('I am Chuck Norris!');
});
var i = 0;
client.on('data', function(data) {
console.log('Received: ' + data);
i++;
if(i==2)
    client.destroy();  
} );
client.on('close', function() {
console.log('Connection closed'); 
});
相关问题