如何在不使用 http 模块的情况下创建 socket.io 服务器?
How to create socket.io server without using http module?
有 http
模块可以创建服务器并将 express 应用程序上下文传递给它,然后收听它。
我见过 express' app.listen
returns 一个服务器上下文
现在如何使用 app.listen
的上下文
创建 socket.io 服务器
我试过下面的代码,但它不起作用。
onst express = require('express')
const socket = require('socket.io')
const PORT = 5000
const app = express()
const server = app.listen(PORT, () => console.log(`Server started on port ${PORT}`))
const io = new socket.Server(server)
io.on("connection", function(socket) {
console.log("A new socket has joined: " + socket.id)
socket.on("hello", function(data) {
console.log(data);
})
})
代码启动时没有抛出任何错误,但套接字服务器没有启动
Socket IO 的文档中有一节是关于 integrating with Express 的。他们的示例代码如下所示:
const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', (socket) => {
console.log('a user connected');
});
server.listen(3000, () => {
console.log('listening on *:3000');
});
虽然仍然直接使用 http
模块,但您或许可以将 http.createServer(app)
替换为 app.listen
调用。请注意,我很确定 app.listen
实际上在幕后使用了 http.createServer
。根据 their documentation 他们确实如此。
我连接了 React Native 'socket.io-client',你的代码对我有用
这是我的 React 本机代码
import React,{ Component } from "react";
import {View,TextInput,Text,StyleSheet} from 'react-native'
import io from "socket.io-client";
export default class ChatApp extends Component{
constructor(props) {
super(props);
this.state = {
chatMessage: "",
chatMessages: []
};
}
componentDidMount() {
this.socket = io("http://127.0.0.1:5000");
this.socket.on("hello", msg => {
this.setState({ chatMessages: [...this.state.chatMessages, msg]
});
});
}
submitChatMessage() {
this.socket.emit('hello', this.state.chatMessage);
this.setState({chatMessage: ''});
}
render() {
const chatMessages = this.state.chatMessages.map((chatMessage,index) => (
<Text key={index} style={{borderWidth: 2, top: 500}}>{chatMessage}</Text>
));
return (
<View style={styles.container}>
{chatMessages}
<TextInput
style={{height: 40, borderWidth: 2, top: 500}}
autoCorrect={false}
value={this.state.chatMessage}
onSubmitEditing={() => this.submitChatMessage()}
onChangeText={chatMessage => {
this.setState({chatMessage});
}}
/>
</View>
)
}
}
const styles = StyleSheet.create({
container: {
height: 400,
flex: 1,
},
});
您确定您的套接字服务器没有启动吗?可能是你的客户端有问题...
我添加了 index.html
客户端代码,它成功连接到后端。
结帐:https://github.com/theanurin/Whosebug.68511005
P.S.
Server started on port 5000
A new socket has joined: IqEjjc0dBHYSHqpMAAAB
有 http
模块可以创建服务器并将 express 应用程序上下文传递给它,然后收听它。
我见过 express' app.listen
returns 一个服务器上下文
现在如何使用 app.listen
的上下文
我试过下面的代码,但它不起作用。
onst express = require('express')
const socket = require('socket.io')
const PORT = 5000
const app = express()
const server = app.listen(PORT, () => console.log(`Server started on port ${PORT}`))
const io = new socket.Server(server)
io.on("connection", function(socket) {
console.log("A new socket has joined: " + socket.id)
socket.on("hello", function(data) {
console.log(data);
})
})
代码启动时没有抛出任何错误,但套接字服务器没有启动
Socket IO 的文档中有一节是关于 integrating with Express 的。他们的示例代码如下所示:
const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', (socket) => {
console.log('a user connected');
});
server.listen(3000, () => {
console.log('listening on *:3000');
});
虽然仍然直接使用 http
模块,但您或许可以将 http.createServer(app)
替换为 app.listen
调用。请注意,我很确定 app.listen
实际上在幕后使用了 http.createServer
。根据 their documentation 他们确实如此。
我连接了 React Native 'socket.io-client',你的代码对我有用
这是我的 React 本机代码
import React,{ Component } from "react";
import {View,TextInput,Text,StyleSheet} from 'react-native'
import io from "socket.io-client";
export default class ChatApp extends Component{
constructor(props) {
super(props);
this.state = {
chatMessage: "",
chatMessages: []
};
}
componentDidMount() {
this.socket = io("http://127.0.0.1:5000");
this.socket.on("hello", msg => {
this.setState({ chatMessages: [...this.state.chatMessages, msg]
});
});
}
submitChatMessage() {
this.socket.emit('hello', this.state.chatMessage);
this.setState({chatMessage: ''});
}
render() {
const chatMessages = this.state.chatMessages.map((chatMessage,index) => (
<Text key={index} style={{borderWidth: 2, top: 500}}>{chatMessage}</Text>
));
return (
<View style={styles.container}>
{chatMessages}
<TextInput
style={{height: 40, borderWidth: 2, top: 500}}
autoCorrect={false}
value={this.state.chatMessage}
onSubmitEditing={() => this.submitChatMessage()}
onChangeText={chatMessage => {
this.setState({chatMessage});
}}
/>
</View>
)
}
}
const styles = StyleSheet.create({
container: {
height: 400,
flex: 1,
},
});
您确定您的套接字服务器没有启动吗?可能是你的客户端有问题...
我添加了 index.html
客户端代码,它成功连接到后端。
结帐:https://github.com/theanurin/Whosebug.68511005
P.S.
Server started on port 5000
A new socket has joined: IqEjjc0dBHYSHqpMAAAB