轻松入门:node.js 连接服务器教程 (node.js 连接服务器)
AB资源网 2023-09-20 01:59 6983 浏览 0 评论
Node.js 连接服务器教程

在互联网时代,服务器扮演着非常重要的角色。服务器不仅可以存储数据,还可以处理用户发来的各种请求,协调各种软件系统之间的运作。在这个背景下,Node.js 成为了一种热门的服务器开发技术。
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。它能够使 JavaScript 在服务器端运行,称为服务器端 JavaScript。在这里,我们将介绍如何使用 Node.js 连接服务器的步骤,以及注意事项。
1. 安装 Node.js
我们需要在本地计算机上安装 Node.js。可以到官网下载适用于你的操作系统的版本,并进行安装。
2. 选择 TCP 或 HTTP 协议
在连接服务器之前,我们需要先选择连接协议。Node.js 支持两种连接协议,TCP 和 HTTP 协议。
TCP 协议是一种面向连接的协议,它基于传输控制协议(TCP)实现。它提供了可靠的、按顺序传递的数据流,它也有一定的流控制机制,可以避免一些网络问题的出现。TCP 协议适用于需要稳定传输的数据,如在线游戏中需要实时传输数据的场景。
HTTP 协议则是一种无连接的、无状态的协议。HTTP 请求与响应之间是通过请求头和响应头进行约定的,因此 HTTP 协议通常用于客户端与服务器之间传输网页内容以及 ON 等数据格式。
3. 创建 Node.js 连接服务器的代码
Node.js 提供了 net 和 http 两个模块分别用于 TCP 和 HTTP 协议。在我们的示例中,我们使用的是 HTTP 协议进行连接。下面是代码示例:
“`
const http = require(“http”);
const hostname = “127.0.0.1”;
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader(“Content-Type”, “text/pln”);
res.end(“Hello World\n”);
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
“`
这段代码的作用是创建一个本地服务器,当有客户端向该服务器发送请求时,返回一个 “Hello World” 的响应。其中,常量 hostname 和 port 分别表示服务器的主机名和端口号,server 变量表示创建的服务器对象。createServer 函数是用于创建服务器的,它的参数是一个回调函数,该回调函数会在有请求到达服务器时被调用,req 和 res 分别表示请求和响应。
4. 使用浏览器访问服务器
代码创建完成之后,我们可以在本地启动服务器,并使用浏览器访问该服务器。在浏览器地址栏中输入 http://127.0.0.1:3000 或者 http://localhost:3000 即可。
5. 注意事项
在使用 Node.js 连接服务器时,有一些注意事项:
(1)要编写稳定的服务器代码,需要考虑高并发,异常处理等方面的问题。需要对服务器的内存占用、代码执行速度等进行优化。
(2)在处理复杂的业务逻辑时,可以使用第三方插件,如 express、koa 等。
(3)尽量避免使用同步代码,因为同步代码会在服务器执行期间阻塞进程。应该尽量使用异步代码来实现服务端处理业务逻辑。
(4)在开发过程中,可以使用工具如 Postman 进行接口测试,方便调试。
(5)需要注意服务器的安全问题,防止 SQL 注入、XSS 攻击等情况的出现。
本文简单介绍了如何使用 Node.js 连接服务器,其中包括选择连接协议、编写服务端代码等步骤。在使用 Node.js 连接服务器时,需要考虑高并发、异常处理等问题,并尽量采用异步代码进行服务端业务逻辑处理。此外,还需要注意服务器的安全问题。
相关问题拓展阅读:
- nodejs怎么部署到腾讯云服务器上
- nodejs可以接受tcp服务器的数据吗
- Linux系统下,node.js怎么远程连接SqlServer
nodejs怎么部署到腾讯云服务器上
先安装一个nodejs。
看你服务器操作系统了。
到小鸟云购买云服务器
作为一个穷逼+不熟悉服务器配置的菜鸟。选了更便宜的套餐: CPU: 1核 / 内存: 1024 MB / 带宽:1Mbps / 操作系统: CentOS
7.0 购买环节会设置 ssh 登陆密码,记下密码。 登陆到小鸟云,查看购买的实例。 注意公网 IP,下一步会用型笑到
2. 登陆服务器 sudo ssh 你的服务器ip地址
提示输入mac的密码,提示输入服务器密码。 输入后连接成功并显示服务器信息,如下:
登陆服务器后。这里对于我这个 Linux 菜鸟有个大坑………就是 Linux 系统常见的目录结构和文件放置区域。 使用 root
用户身份登陆后,会直接进入到下图 红色箭头标出的 root 目录下。先 cd .. 跳转到上一层, 再 ls -a
,就可以看到类似下图的目录结构了。
3.安装 node 和 mongodb
node – 编译后二进制文件应在/usr/local/bin/node 下 mongodb –安装在/usr/local/mongodb 下
下面就一步一步来,首先升级CentOS
yum -y update1
升级后,跳转到 /usr/local/src , 这个文件夹通常用来存放软件源代码
cd /usr/local/src1
下载 nodejs 代码,也可以使用scp命令直接上传,因为下载实在太慢了。
wget
注*根据最新版本号为准12
解压
tar -xzvf node-v0.12.5.tar.gz1
进入解压后的文件夹
cd node-v0.12.51
执行配置脚本来进行编译预处理
./configure1
编译源代码
make//注*这个时间可能会很久判雹12
当编译完成后,需要使之在系统范围内可用,
编译后的二进制文件将被放置到系统路径,默认情况下,Node二进制文件应该放在/user/local/bin/node文件夹下
make install1
安装 express 和 forever,这两个模块都推荐 global 安装
npm -g install express forever1
建立超级链接, 不然 sudo node 时会报 “command not found”
sudo ln -s /usr/local/bin/node /usr/bin/nodesudo ln -s /usr/local/lib/node
/usr/lib/nodesudo ln -s /usr/local/bin/npm /usr/bin/npmsudo ln -s
/usr/local/bin/node-waf /usr/bin/node-wafsudo ln -s /usr/local/bin/forever
/usr/bin/forever12345
Nodejs到这里就基本安装完成了。
下面来安装mongodb
软件安装位置:/usr/local/mongodb 数据存放位置:/var/mongodb/data
日志存放位置:/var/mongodb/logs
首先下载安装包
cd /usr/localwget
解压安装包,重命名文件夹为mongodb
tar zxvf mongodb-linux-x86_64-2.6.0.tgzmv mongodb-linux-x86_64-2.6.0
mongodb12
创建数据卜冲含和日志存放目录
mkdir /var/mongodbmkdir /var/mongodb/datamkdir /var/mongodb/logs123
打开rc.local文件,添加CentOS开机启动项:
vim /etc/rc.d/rc.local1
将mongodb启动命令追加到本文件中,让mongodb开机自启动:
/usr/local/mongodb/bin/mongod –dbpath=/var/mongodb/data –logpath
/var/mongodb/logs/log.log -fork12
关闭 vim 后,直接手动启动mongodb
/usr/local/mongodb/bin/mongod –dbpath=/var/mongodb/data –logpath
/var/mongodb/logs/log.log -fork12
看到类似的信息,说明已启动成功。我在这里发了个傻,以为26308是port号,导致后面设置port时折腾了好久。其实这里的 forked
process 和 port 号是两个东西, 这个是程序本身在Server上的进程。
forked process:
启动mongo shell
cd /usr/local/mongodb/bin/./mongo12
在 mongo shell 中创建管理员及数据库
use admin //admin 数据库db.createUser({user:
“用户名”,pwd:”登陆密码”,roles:
//超级管理员})use databaseFoo //nodeapp 要连接的数据库db.createUser({user:
“用户名”,pwd:”登陆密码”,roles:
//读写权限})213
到这里 mongodb 基本已经安装设置完成了。具体数据的迁移导入可自行研究。
4.配置及启动node app
我们把 nodeapp 的程序放在 /home 下
nodejs可以接受tcp服务器的数据吗
node_modules只是放一些依赖包,具槐伏逗体数据库文件当然是放在mysql目录下了。 2、要在铅卖不开编辑器前提下,使系统可访厅携问,你只要在控制台中定位到你系统的目录后,使用node命令来启动即可。
nodejs中我们使用net模块来创建tcp服务器,tcp客户端,实现服务器与客户端拍樱宴之前的数据通信
创建tcp服务器
var server=net.createServer(,)
optations:{allowHalfOpen:boolean}
allowHalfOpen:false 当服务器接受到客户端发送的一个FIN包时候,会回发一个FIN包,当为true时服务器不会回FIN包,使得tcp服务器可以继续发送数据到客户端,但是不会接受客户端发送的数据,开发者必须调动end方法来关闭socket,默认是false
connectionListener:当客户端与服务器连接上了,可以触发的回袭银调函数。
function(socket){
//…….
}
我们也可以不用回调函数来写连接上做什么处理,连接上会触发connection事件
var server=net.createServer()返回创建的tcp服务器
我们可以server.on(‘connection’,function(socket){
})
在创建完tcp服务器我们通知服务器要监听客户端连接
server.listen(port,,,)
port:监听的端口,为0时候tcp服务器分配一个随机的端口
host:监听的ip和主机名,省略该参数,服务器监听任何ipv4地址的客户端连接
backlog:指定等待队列中更大的客户端连接更大数量 默认511
当指定端口、ip这个时候服务器开始监听这个ip这个端口的客户端了,这个时候触发listening事件,可以指定callback参数来处理触发listening具体要做什么
我们也可以
server.on(‘lisening’,function(){
//…….
})
创建一个tcp服务器颂毁后可以用server.address()查看tcp服务器监听的信息
var address=server.address()
addres是一个对象
prot :监听的端口
address:监听的ip
family:ipv4还是ipv6
我们可以使用getConnections()查看与服务器连接的客户端的数量
server.getConnections(callback)
callback:function(err,count){
}
err:错误信息
count:为连接服务器的数量
我们也可以设置更大的连接数,超过这个数字,服务器不允许连接
server.maxConnections=2
服务器关闭
server.close()
这个 方法让tcp服务器拒绝新的客户端连接,原有已经连上的客户端是不关闭的,当所有的连接服务器的客户端关闭时候,服务器默认自动关闭,触发服务器的close事件
下面我们写一个tcp服务器
var net=require(“net”);
opations={allowHalfOpne:false}
var server=net.createServer(opations);
server.on(‘connection’,function(socket){
server.maxConnections=2;
console.log(“服务器更大连接数为%s”,server.maxConnections)
server.getConnections(function(err,count){
console.log(“已经有%s个客户端连接”,count)
})
console.log(“%s客户端与服务器建立连接”,server.address().address)
})
server.on(‘error’,function(err){
throw err;
})
server.on(‘listening’,function(){
console.log(“服务器开始监听%j”,server.address())
console.log(“服务器开始监听”)
})
server.listen(9966,’192.168.0.3′);
setTimeout(function(){
server.close(function(){
console.log(“tcp服务器关闭11111”)
})
console.log(“tcp服务器关闭”)
},20230)
注意连接成功的时候触发的connection事件,执行的方法,参数是一个socket端口对象,这个就是服务器所监听的端口对象,所以我们socket.address().address返回给我们的是监听ip
socket端口对象
port:端口
address:ip
family:ipv4 ipv6
socket端口对象,可以读取客户端发送的流数据,每次接收到客户端发送的数据触发data事件。
接受客户端发送的消息(在连接成功的触发函数中 让server监听data事件做相应的处理)
server.on(‘connection’,function(socket){
socket.on(‘data’,function(data){
socket.setEncoding(“utf-8”);
console.log(data)
//console.log(data.toString())
})
})
bytesRead为socket端口对象监听客户端发送的数据字节数
console.log(socket.bytesRead)
当客户端关闭时候,触发socket端口对象的end事件
我们把客户端连接发送的数据保存到一个文件下
var net=require(“net”);
var fs=require(“fs”);
var server =net.createServer();
var op={
flags:”a”,
encoding:”utf-8″
}
var file=fs.createWriteStream(‘./socket.txt’,op)
server.on(‘connection’,function(socket){
socket.on(‘data’,function(data){
file.write(data);
})
})
server.on(‘listening’,function(){
console.log(“监听开始”)
})
server.listen(‘1111′,’192.168.0.3’)
以管道形式发送数据到文件
var net=require(“net”);
var fs=require(“fs”);
var server =net.createServer();
var op={
flags:”a”,
encoding:”utf-8″
}
var file=fs.createWriteStream(‘./socket.txt’,op)
server.on(‘connection’,function(socket){
//socket.on(‘data’,function(data){
// file.write(data);
//})
socket.pipe(file,{end:false});
socket.on(“end”,function(){
file.end(“wanbi”)
})
})
server.on(‘listening’,function(){
console.log(“监听开始”)
})
server.listen(‘1111′,’192.168.0.3’)
tcp客户端
创建tcp客户端
var client =new net.socket()
optation:fd 一个现有的socket端口对象文件描述
type :ipv4 、ipv6
allowHalfOpne:true、false
连接服务器
client.connect(prot,,)
host不指定默认为本地ip
回调函数表示连接上了做什么
若没有可以socket端口对象触发connect事件
client.on(“connect”,function(){
})
当我们连接成功后客户端服务器端的socket端口对象有下面的属性
remoteAddress、remotePort、localAddress、localPort
socket端口对象可以写入服务器、客户端流数据
socket.write(data,,)
写入数据少时候我们直接写入缓存区,数据很多时候,缓存区满了,我们要把数据写入缓存队列中,这个时候write(data) 返回false,触发drain
我们可以用bufferSize看缓存队列中有多少个字节
socket.on(“error”,function(err){
})
当遇到error时候这个socket端口对象应该销毁
socket.destory()
socket.end(,)
这个方法表示我们要关闭socket端口对象,这个不是关闭服务器的close方法,后者是关闭服务器,实现的效果是不能让客户端连接了,前者是关闭连接(socket端口对象)
当我们使用服务器的socket端口对象(连接客户端得)的end(data,encoding)方法时候,会触发客户端socket端口对象end事件
服务器:
socket.end(’88’);
客户端会执行下面的代码:
client.on(“end”,function(){
//……
})
服务器端不会退出应用程序,即使所有的客户端都断开了,这个时候我们要server.unref(),退出程序,可以用server.ref()阻止程序退出.
当socket端口对象彻底关闭时候会触发close事件,我们可以指定当端口对象关闭时候做的处理
socket.on(”close’,faction(had_error){
if(had_error){}
else{}
})
socket.writtenBytes表示写了多少个字节
我们tcp服务器与客户端连接了,但是突然间有一个断电了,来不及向另一端发送关闭连接的FIN包,这样另一边这个socket端口永远处于连接状态,我们用socket.setKeepAlive(,)定时向另一端发送监测包,
我们实现一个服务器读一个文件的信息,当有客户单连接上,吧这个信息传给客户端,输出在控制台
服务器代码
var net=require(“net”);
var fs=require(“fs”);
var server =net.createServer();
var op={
flags:”r”,
encoding:”utf-8″
}
var file=fs.createReadStream(‘./socket.txt’,op)
server.on(‘connection’,function(socket){
file.on(‘data’,function(data){
socket.write(data);
})
socket.on(“end”,function(){
file.end(“wanbi”)
})
})
server.on(‘listening’,function(){
console.log(“监听开始”)
})
server.listen(‘1111′,’192.168.0.3’)
客户端代码
var net=require(“net”);
var client=new net.Socket();
client.connect(1111,’192.168.0.3′)
client.on(‘connect’,function(){
console.log(“ok”)
})
client.on(“data”,function(data){
console.log(data.toString())
Linux系统下,node.js怎么远程连接SqlServer
Node.js一直都与mysql , Nosql 配合使用,对于Sql Server却没有很好的支持,一直都是小众技术人员自己编写访问程序。
2023年微软公司官方发行一款Node.js访问Sql Server的驱动程序——msnodesql ,让Node.js访问SQL Server更加简单。
安装
msnodesql 下载地址:下载 自行选择与自己系统相符的版本,点击安装顷碰。
msnodesql 官方地址:
含wiki 和 疑问解答 。
在node.js环境下,安装方式和其他驱动安装一样,安拆核装命令:nmp install msnodesql
安装过程中需要注意的两个问题:
1、安装之前必须安装SQL Server Native Client 11.0 32位下载地址:下载 64位下载地址:下载 ,安装此程序不需要SQL server2023支持,经测试,SQL 2023和SQL 2023 可以正常安装使用。
2、安装过程中,如出现错误,检查是否在管理员界面下进行命令安装,这个问题我雀御谈纠结了好长一段时间。
(右键——以管理员身份运行)
使用
引用驱动
var sql = require(‘msnodesql’);
建立数据库连接
var conn_str = “Driver={SQL Server Native Client 11.0};Server={.};Database={nodetest};uid=sa;PWD=123456;”;
不要被 SQL Server Native Client 11.0 吓到,可以完美支持sql 2023和sql 2023 的。
打开数据库
sql.open(conn_str, function (err, conn) {
if (err) {
console.log(“Error opening the connection!”);
return;
}
//这里是查询语句
});
SQL操作
sql.queryRaw(conn_str,”SELECT * FROM TestTable”,
function (err, results)
{
if (err)
{
console.log(“Error running query!”);
return;
}
for (var i = 0; i
{
console.log(“0:” + results.rows); }
});
注意:此处的写法与wiki文档的写法有些不同,我用过wiki文档的写法(
/wiki),有时会出现无法查询数据的情况,w我这种写法是参考源代码中参数的写法,queryRaw包含四个参数:
connectionstring:链接字符串(wiki里面的居然没有用这个,直接用function里面的参数 conn,搞不懂)
query:SQL语句
param:参数(可选的)
callback:回传函数,操作完以后返回的事件
一个完整的例子
var sql=require(‘msnodesql’);
var conn_str=”Driver={SQL Server Native Client 11.0};Server={.};Database={nodetest};uid=sa;PWD=123456;”;
sql.open(conn_str, function (err, conn) {
if (err) {
console.log(‘发生错误’);
}
sql.queryRaw(conn_str, “select * from users”, function (err, results) {
if (err) {
console.log(err);
}
else {
for (var i = 0; i
console.log(results.rows + results.rows);
}
}
})
关于node.js 连接服务器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
相关推荐
- 云主机FTP软件:高效传输与安全管理的一站式解决方案
-
在云计算时代,云主机已成为企业和个人用户托管应用和存储数据的首选。为了方便文件传输,FTP(文件传输协议)软件在云主机环境中扮演着重要角色。本文将详细介绍如何在云主机上配置和使用FTP软件...
- 云主机FP:引领未来计算,解锁无限可能
-
云主机FP(FloatingPoint)是指在云计算环境中,针对浮点运算性能进行优化的虚拟机实例。浮点运算在科学计算、工程模拟、金融建模、图形处理等领域中占据重要地位,因此云主机FP的设计和配置...
- 云主机ECS:解锁企业数字化转型的新引擎,高效、安全、灵活的云计算解决方案
-
云主机ECS(ElasticComputeService)是阿里云提供的一种弹性计算服务,它允许用户在云端创建和管理虚拟机实例。ECS的核心优势在于其灵活性和可扩展性,能够满足各种规模和类型的业...
- 云主机D盘:解锁无限存储空间,轻松应对大数据挑战!
-
云主机是一种基于云计算技术的虚拟化服务器,它允许用户在云平台上创建、配置和管理虚拟机实例。在云主机中,磁盘分区是存储数据的关键部分,通常包括系统盘和数据盘。系统盘用于安装操作系统和运行应用...
- 云主机DNS解析:提升网站速度与稳定性的关键策略
-
云主机DNS(DomainNameSystem)是云计算环境中至关重要的一部分,它负责将域名转换为IP地址,从而使得用户能够通过易于记忆的域名访问云主机上的服务和应用。本文将深入探讨云主机DNS...
- 云主机C盘爆满?快速解决方法大揭秘,让你的服务器重获新生!
-
云主机C盘满了是一个常见但棘手的问题,尤其对于依赖云服务进行日常运营的企业和个人用户来说,这可能导致系统性能下降、应用程序崩溃,甚至数据丢失。本文将详细探讨云主机C盘满的原因、影响以及解决方法。...
- 云主机CPU选择指南:提升性能与效率的关键决策
-
在选择云主机的CPU时,用户需要考虑多个因素,以确保所选的CPU能够满足其应用的需求,同时优化成本效益。以下是一些关键点,帮助用户在云主机CPU选择过程中做出明智的决策。了解应用的性能需求...
- 云主机CPU性能大比拼:揭秘顶级云服务商的核心竞争力
-
云主机CPU是云计算环境中至关重要的组成部分,它直接影响着云服务的性能、稳定性和用户体验。CPU,即中央处理器,是计算机系统的核心,负责执行指令和处理数据。在云主机中,CPU的性能决定了虚...
- 云主机ASP:高效搭建动态网站,轻松实现业务扩展与性能优化
-
云主机ASP(ActiveServerPages)是一种在云环境中运行ASP应用程序的技术。ASP是一种由微软开发的动态网页技术,允许开发者使用VBScript或JScript等脚本语言编写服务...
- 云主机API:解锁无限可能,引领企业数字化转型新纪元
-
云主机API(ApplicationProgrammingInterface)是云计算服务提供商为用户提供的一种编程接口,允许开发者通过编程方式管理和操作云主机资源。这些API通常基于RESTf...
- 云主机99idc:高效稳定,轻松搭建您的专属云端空间,一键部署,畅享无限可能!
-
云主机99idc是一家专注于提供云计算服务的公司,其核心业务是为企业和个人用户提供高性能、高可靠性的云主机服务。随着数字化转型的加速,云计算已经成为企业IT基础设施的重要组成部分,而云主机99i...
- 云主机80端口:解锁无限可能,开启高效网络新时代!
-
云主机是一种基于云计算技术的虚拟化服务器,它通过互联网提供计算资源和服务。在云主机中,80端口是一个非常重要的端口,通常用于HTTP协议,即网页服务。本文将详细探讨云主机80端口的相关内容...
- 云主机403错误:解锁高效解决方案,提升网站性能与安全
-
云主机403错误是一个常见的网络问题,通常表示用户在尝试访问某个资源时被服务器拒绝。这种错误可能由多种原因引起,包括权限问题、配置错误、防火墙设置等。以下是关于云主机403错误的一些详细信...
- 云主机360:全方位云端解决方案,助力企业数字化转型无忧
-
云主机360是一种基于云计算技术的虚拟化服务器解决方案,它通过将物理服务器资源虚拟化,为用户提供灵活、高效、安全的计算服务。云主机360的核心优势在于其高度的可扩展性和弹性,用户可以根据业务需求...
- 云主机301:引领未来云计算的新纪元,高效稳定,助力企业数字化转型!
-
云主机301是一种常见的网络重定向状态码,通常用于指示用户请求的资源已被永久移动到新的URL。在云计算环境中,云主机301状态码的出现可能涉及到多种技术和管理策略,下面我们将详细探讨这一现象。...
你 发表评论:
欢迎- 一周热门
-
-
HostYun廉价洛杉矶三网回程CN2 GIA云服务器内测13元/月起(美国原生IP,去程10Gbps防御)
-
大网数据:双12秒杀聚惠,湖北100G高防云低至0元/月,湖北独服务器低至210元、200G高防+50Mbps带宽
-
HostYun洛杉矶大硬盘云服务器9折22.5元/月起(240G-500G硬盘/1Gbps/10G防御)
-
樊云香港双程CN2及洛杉矶50G高防三网CN2 GIA云服务器9折22.5元/月起
-
大网数据、湖北高防云服务器低至39元/月起、湖北高防独服务器低至245元起(200G硬防、金盾+傲盾防CC)
-
spinservers圣何塞/达拉斯10Gbps带宽高配服务器月付89美元起
-
tmhhost美国高防云服务器8折_CeRaNetworks机房/三网cn2直连/适合建站
-
高防服务器大网数据湖北独服务器低至210元、200G高防+50Mbps带宽
-
DogYun新上韩国独立服务器,E5/SSD+NVMe优惠后300元/月,自动化上架
-
初忆云 – 2020年中云聚惠全场五折 BGP云服务器低至88/年,抓紧上车
-
- 互动交流
- 标签列表
- 最新评论
-
您的文章条理清晰,论述有据,说服力强。您的文章情感真挚,能够触动人心,引起共鸣。https://www.renhehui.com/renhehui/1479.h
沉醉于月色 评论于:08-09虚拟机部署好后跟物理机一样当服务器的,只是它依赖了本地物理机不要关机为前提。对于外网访问内网场景,本地内网搭建服务器后需要提供到互联网上连接访问的,比较简便的
访客 评论于:03-01刘中宜 评论于:11-01
访客 评论于:06-03
AB资源网 评论于:05-08
AB资源网 评论于:11-22
AB资源网 评论于:11-22
頹廢了悲伤 评论于:11-15
南风知我意 评论于:11-15
心若冰凝 评论于:11-15