繁体   English   中英

SSL socket.io 客户端未收到服务器响应

[英]SSL socket.io client not receiving server response

##问题:客户端和服务器之间使用SSL建立套接字连接失败,同时模拟客户端连接成功。

源代码放在github 上

## 客户端

App.js与服务器的初始连接socket

 // Import Components import React, { Component } from "react"; // vvvvvvvvvvvvvvvvvvvvvvvvvvv // Below same code successfully in Server.js but failed in this client const io = require("socket.io-client"); const ioClient = io.connect("https://localhost:8080", { secure: true, reconnection: true, rejectUnauthorized: false }); ioClient.on("seq-num", (msg) => console.info('Client: ' + msg)); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ class App extends Component { render() { return (<div></div>); } } export default App;

## 服务器端

Server.js简单服务器只是为客户端创建套接字连接

 const expressApp = require("express")() const fs = require("fs") const https = require("https"); const secureServer = https.createServer({ key: fs.readFileSync('./ssl/server.key'), cert: fs.readFileSync('./ssl/server.crt') }, expressApp); const ios = require('socket.io')(secureServer); secureServer.listen(8080, () => { console.log("secure server started at 8080"); }) let sequenceNumberByClient = new Map(); // event fired every time a new client connects: ios.on("connection", (socket) => { console.info(`Client connected [id=${socket.id}]`); // initialize this client's sequence number sequenceNumberByClient.set(socket, 1); // when socket disconnects, remove it from the list: socket.on("disconnect", () => { sequenceNumberByClient.delete(socket); console.info(`Client gone [id=${socket.id}]`); }); }); // sends each client its current sequence number setInterval(() => { for (const [client, sequenceNumber] of sequenceNumberByClient.entries()) { client.emit("seq-num", sequenceNumber); sequenceNumberByClient.set(client, sequenceNumber + 1); } }, 1000); // ###### Simulate Client socket call // Below code failed to connect if placed in client App.js const io = require("socket.io-client"); const ioClient = io.connect("https://localhost:8080", { secure: true, reconnection: true, rejectUnauthorized: false }); ioClient.on("seq-num", (msg) => console.info('Simulated client: ' + msg));

解决方案

代码很好 只需 go 到https://localhost:8080 (或您的服务器),当浏览器请求许可时,接受自签名证书,您的客户端页面现在应该可以工作了。 希望这可以节省您的时间。

解释

由于客户端和服务器都在开发环境中运行并且服务器证书是自签名的,chrome(或其他浏览器)阻止了未经授权的 ssl 证书,即在这种情况下阻止与https://localhost:8080上的服务器的连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM