分类: 服务器

服务器

tomcat是干什么的

这个软件用来装载你的javaweb程序,可以称它为web容器,你的jsp/servlet程序需要运行在Web容器上,Web容器有很多种,JBoss、WebLogic等等,Tomcat是其中一种。tomcat是一种web服务器,也可以称作运行在服务器(物理意义上的计算机)上的一种软件包。用来对服务器上的HTML文档提供访问权限控制。
以上的说法可能太专业化,一时难以理解。其实用通俗的语言来讲,万维网本质上就是“超文本文档”(HTML文档)组成的一个通过超级链接互相访问交互网络。你从甲计算机上的文档A通过超链接访问乙计算机上的文档B,而B必须放在Web服务器(Tomcat)里才能被访问。Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,*新的Servlet和Jsp规范总能在Tomcat中得到体现。
与传统的桌面应用程序不同,Tomcat中的应用程序是一个WAR(WebArchive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录很重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)。通常这些所依赖的类也可以打包成JAR放到WEB-INF下的lib目录下,当然也可以放到系统的CLASSPATH中,但那样移植和管理起来不方便。
Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如Apache。我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet。这种集成只需要修改一下Apache和Tomcat的配置文件即可。

总结:就是web应用放到tomcat里面才能跑得起来,而tomcat里面对项目有规定特定的格式,就是war包的格式,这就是为什么我们需要把项目打成war才能丢进去

简单总结下,tomcat是一个中间件,在B/S架构中,浏览器发出的http请求经过tomcat中间件,转发到*终的目的服务器上,响应消息再通过tomcat返回给浏览器。

tomcat所做的事情主要有:开启监听端口监听用户的请求,解析用户发来的http请求然后访问到你指定的应用系统,然后你返回的页面经过tomcat返回给用户。

通俗点说他是jsp网站的服务器之一,就像asp网站要用到微软的IIS服务器,php网站用apache服务器一样,
因为你的jsp动态网站使用脚本语言等写的,需要有服务器来解释你的语言吧,服务器就是这个功能。如果你的网页是纯html的,
浏览器就可以直接解释查看效果,但是你的网页一但是.jsp .asp .php 等的动态网页时浏览器自己就无法解释了,需要上面说到的服务器
。tomcat便可以解释jsp等java编写的网站。

Java中 Tomcat 是干什么的?

Tomcat是web容器。它的作用稍后给你解释。
你在做web项目时,多数需要http协议,也就是基于请求和响应,比如你在百度输入一行内容搜索,
那么百度服务器如何处理这个请求呢,他需要创建servlet来处理,servlet其实就是java程序,只是在服务器端的java程序,
servlet通过配置文件拦截你的请求,并进行相应处理,然后展示给你相应界面,那么servlet如何创建? 这时候tomcat用到了,
它就是帮助你创建servlet的东西,所以也称web容器,没有它,没法运行web项目。相对应的web容器有很多,
比如JBOSS,WEBLOGIC等。
Tomcat是一个应用服务器。他可以运行你按照J2EE中的Servlet规范编写好的Java程序。
简单的说它是一个Web网站的运行容器,把你写好的网站放进去就可以运行。
Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展,处理动态网页部分。
Eclipse+tomcat=网络应用,如JSP类应用

Tomcat服务器结构浅析

*近有点懒,博客更新少,补上一篇之前的欠债。。。这篇博客内容基于《Tomcat架构解析》,这里把Tomcat主要的结构介绍了下,更详细的内容大家可以参考该书。

Tomcat是全世界*著名的基于Java语言的轻量级应用服务器,是一款完全开源免费的Servlet容器实现。同时,它支持HTML,JS等静态资源的处理,因此也可作为轻量级的WEB服务器来使用。在以前的WEB开发当中,我们主要通过将程序打包,将打包文件放到webapps下来进行访问,而在使用SpringBoot作为开发框架的情况下,由于SpringBoot已内嵌Tomcat,不需要将打包文件放在特定的文件夹下,而是直接运行程序即可。这篇博客*部分内容将介绍Tomcat的整体架构,第二部分介绍SpringBoot内嵌Tomcat的实现。

Tomcat总体架构
首先,让我们来看一张图:
%title插图%num

Tomcat总体的设计便是围绕着这张图来的。下面我们依次对上图中的各个部分做一下介绍。

Lifecycle 接口
该接口主要定义了容器整个生命周期过程中的各个阶段

public interface Lifecycle {
public void init() throws LifecycleException;

public void start() throws LifecycleException;

public void stop() throws LifecycleException;

public void destroy() throws LifecycleException;

public void addLifecycleListener(LifecycleListener listener);


}

该接口包含了容器初始化,开始,停止,销毁等过程。其实现类的各个组件在容器的工作过程当中需要做的工作,即在这几个函数中来完成。

Server
表示整个Servlet容器,因此Tomcat运行环境中只有唯一一个Server实例。在该接口的唯一实现类StandardServer中,除了表示Service的一个对象数组外,主要是一些关于Tomcat的属性,比如port,address等。该容器的这些属性,可以通过properties文件或者yaml文件进行配置(比如端口通过server.port=8080进行配置),或者是原来的开发方式,通过Server.xml进行配置。

Service
Service表示一个或者多个Connector的集合,这些Connector共享同一个Container(即Engine)来处理其请求。在同一个Tomcat实例内可以包含任意多个Service实例,它们彼此独立。Service其实是作为Tomcat中接收请求,以及处理请求的容器的纽带存在的。tomcat中的实现类StandardService有以下几个重要的属性:

public class StandardService extends LifecycleMBeanBase implements Service {
private Server server = null;
protected Connector connectors[] = new Connector[0];
private Engine engine = null;
protected final Mapper mapper = new Mapper();
}

server表示其所属Server,Engine作为处理该service中Connector的容器。Mapper可以看作是映射器,要来处理请求地址到处理该请求的容器及Servlet的映射。

Engine
在Tomcat中,Engine为*高层级的容器对象。尽管Engine不是直接处理请求的容器,却是获取目标容器的入口。

Host
Host 作为一类容器,表示Servlet引擎(Engine) 中的虚拟机, 与一个服务器的网络名有关,如域名等。客户端可以使用这个网络名连接服务器,这个名称必须要在DNS服务器上注册

Context
Context作为一类容器,用于表示ServetContext ,在Servlet规范中, 一个ServletContext表示一个独立的Web应用

Wrapper
Wrapper作为一类容器, 用于表示Web应用中定义的Servlet(其实是对Servlet进行了一层封装)。

Connector
表示Tomcat中的链接器,其主要作用是监听并转化Socket请求,并交由Container处理。其实就是对不同协议及协议处理器进行的封装。下面是我们需要关注的几个属性域:

public class Connector extends LifecycleMBeanBase {
protected Service service = null;
protected final ProtocolHandler protocolHandler;
}

Service是其父容器,ProtocolHandler表示协议处理器

ProtocolHandler
ProtocolHandler表示协议处理器,是一个接口,其实现类有以下几种:

%title插图%num

从图中我们大概能够猜到,其中的每一个实现类,其实都代表着一种I/O协议的处理过程,我们以同步非阻塞I/O的处理器Http11NioProtocol为例,其*初继承于抽象类AbstractProtocol,它的定义如下:

public abstract class AbstractProtocol<S> implements ProtocolHandler,
MBeanRegistration {
private final AbstractEndpoint<S> endpoint;
private Handler<S> handler;
private final Set<Processor> waitingProcessors = Collections.newSetFromMap(new ConcurrentHashMap<Processor, Boolean>());
}

AbstractEndpoint代表的是协议端点,比如,Nio使用的是NioEndpoint类,即为nio的实现逻辑,对nio类型的Socket进行监听, Handler作为AbstractEndpoint接收到I/O后,用来处理I/O的处理器。

请求处理过程
当我们的浏览器或者是其他工具发起一个Http请求时候,Tomcat的整个处理过程如下:

%title插图%num

从一开始的Endpoint监听到Http请求后,调用Processor进行处理,Process调用CoyoteAdapter进行处理,CoyoteAdapter通过Mapper获取到处理该请求的顶级容器Engine,通过一层层的查找,*终获取到处理该请求的Wrapper,经过Tomcat中定义的一系列过滤器(Filter)后,*终由Servlet(在SpringMVC中,便是被DispatcherServlet)进行了消费。Tomcat整个处理的流程便是这样的。

SpringBoot内嵌Tomcat
再完成了Tomcat简单的解析之后,我们还要问,在启动SpringBoot应用的过程当中,是如何启动Tomcat的呢?在Tomcat中,其已经为我们提供了一个表示其实例的Tomcat类,通过查找,我们知道,该类的实例是在TomcatEmbeddedServletContainerFactory类的getEmbeddedServletContainer函数中被创建的。启动一个简单的SpringBoot应用,通过断点,我们能够看到它被调用的路径:

%title插图%num

从上图可知,到Springboot应用刷新容器的时候,会在该过程当中创建Tomcat的实例,我们来下看下函数的实现过程:

public class TomcatEmbeddedServletContainerFactory
extends AbstractEmbeddedServletContainerFactory implements ResourceLoaderAware {
@Override
public EmbeddedServletContainer getEmbeddedServletContainer(
ServletContextInitializer… initializers) {
// 创建Tomcat的实例
Tomcat tomcat = new Tomcat();

// 为Tomcat设置应用的根目录
File baseDir = (this.baseDirectory != null ? this.baseDirectory
: createTempDir(“tomcat”));
tomcat.setBaseDir(baseDir.getAbsolutePath());

// 根据Springboot使用的I/O协议,创建Connector,默认的协议是`String DEFAULT_PROTOCOL = “org.apache.coyote.http11.Http11NioProtocol`,及NIO协议(同步非常阻塞)
Connector connector = new Connector(this.protocol);
// 为Service添加Connector,若Tomcat还没有Service,则getService函数中会创建
tomcat.getService().addConnector(connector);
customizeConnector(connector);
tomcat.setConnector(connector);

// 通过配置autoDeploy禁止虚拟主机自动部署Web应用
tomcat.getHost().setAutoDeploy(false);

// 配置Tomcat的顶级容器Engine
configureEngine(tomcat.getEngine());

// 添加额外的自定义协议的Connector
for (Connector additionalConnector : this.additionalTomcatConnectors) {
tomcat.getService().addConnector(additionalConnector);
}

// 配置虚拟主机Host,其内会进一步初始化Host的字容器
prepareContext(tomcat.getHost(), initializers);

// 对Tomcat进行包装,返回TomcatEmbeddedServletContainer的实例
return getTomcatEmbeddedServletContainer(tomcat);
}
}

关于Tomcat的内容其实还有很多,只是由于时间限制,不能在这里更深入地讲解,若后期有机会,会继续更加深入地介绍Tomcat的各个组件,这篇内容就做为Tomcat容器系列的*篇吧~

 

 

tomcat服务器、http

一、Tomcat服务器(会)
1、Web开发概述
javaSE:

javaEE:13种

javaME:

JavaEE规范: 13种技术的总称。Servlet/Jsp  JDBC  JNDI JTA…

Tomcat:Servlet/Jsp容器,轻量级服务器。

 

2、Tomcat的安装与配置
3.1、安装:
直接解压到指定目录即可。(注:目录不要太深;目录不要有中文或空格)

3.2、启动服务器:
F:\apache-tomcat-7.0.52\bin\startup.bat

启动服务器的前题:

配置JAVA_HOME:jdk的安装路径  path=%JAVA_HOME%\bin

进入到F:\apache-tomcat-7.0.52\bin>startup.bat才能执行命令

配置CATALINA_HOME: 没必要配置

F:\apache-tomcat-7.0.52

 

startup.bat 启动命令

shutdown.bat 停止命令

 

 

如果tomcat端口被占用,解决办法

> 修改F:\apache-tomcat-7.0.52\conf\server.xml

第70行:  <Connector port=”8081″/>

> 关闭端口号对应的进程:

cmd–>netstat-ano –>找到pid–>任务管理器–>显示pid–>关闭进程

3.3、测试服务器是否启动成功
http://localhost:8080

 

 

3.4、Tomcat的主要目录:(重要)
3、标准的JavaWeb应用的目录结构(很重要:记住)
应用:

MyApp

1.html

Css

myStyle.css

Js

My.js

WEB-INF : 注意:固定写法。此目录下的文件不能被外部直接访问。

classes:    我们编写的程序代码。.class文件

lib :  应用需要用的jar文件
web.xml  : 应用的配置信息

4、部署应用到Tomcat服务器
手动部署

> 开放目录部署方式

首先在F:\apache-tomcat-7.0.52\webapps下自己创建一个文件夹

然后把应用下webroot里面的内容直接复制到这个文件夹里面。

> 把应用打成war包。

打war包命令:jar  -cvf  MyApp.war .

把war包直接复制到F:\apache-tomcat-7.0.52\webapps下,应用自动解压

 

注:webapps目录下有几个目录就代表有几个应用;webapps就默认代表服务器的根目录。

 

自动部署

Tomcat服务器与MyEclipse集成(一定要掌握)

1、Tomcat集成

2、创建web应用

3、部署

 

修改myeclipse自带tomcat端口号方法:在myEclipse界面的左边,Servers->MyEclipseTomcat v7.0-config->server.xml   进到里面修改端口号(20,63,83行处)

 

URL: 统一资源定位符(网址)

URI: 统一资源标识符

http://localhost:8080/day08_02/1.html

协议  主机IP(端口号) URI(当前应用的资源路径)

 

5、配置默认端口、默认应用、默认主页
A、把server.xml中<Connector port=”80″protocol=”HTTP/1.1″

connectionTimeout=”20000″

redirectPort=”8443″/>

浏览器http默认端口:80

B、默认应用:

默认应用:把配置的虚拟目录的配置文件名改为ROOT.xml即可。

C、默认主页

修改当前应用web.xml,添加以下内容:

当前的应用被执行了 在服务器端部署应用的过程

1安装服务器

2.打开服务器

3.创建应用

4.应用的发布: 手动发布:将应用(webroot下)放在服务器的webapps下面

自动发布:利用myeclipse实现发布 通过在myeclipse中安装服务器实现对服务器的操作 >安装的过程有两种:

1.使用myeclipse自带的服务器 2.使用单独的服务器与myeclipse关联 5.测试

 

 

二、HTTP协议
1、HTTP协议概述
> HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,传输HTML文件。

> 用于定义WEB浏览器与WEB服务器之间交换数据的过程及数据本身的格式。

 

2、请求部分
1、请求消息行

GET  /day08_02/1.html  HTTP/1.1

请求方式:Get(默认) POST  DELETE  HEAD等

GET:明文传输 不安全,数据量有限,不超过1kb

GET/day08_02/1.html?uName=tom&pwd=123 HTTP/1.1

POST: 暗文传输,安全。数据量没有限制。

 

URI:统一资源标识符。去协议和IP地址。

 

协议/版本 :

 

2、请求消息头

从第2行到空行处,都叫消息头

Accept:浏览器可接受的MIME类型

告诉服务器客户端能接收什么样类型的文件。

Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集

Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip

Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。可以在浏览器中进行设置。

Host:初始URL中的主机和端口

Referrer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面

Content-Type:内容类型

 

告诉服务器浏览器传输数据的MIME类型,文件传输的类型

application/x-www-form-urlencoded

 

If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT利用这个头与服务器的文件进行比对,如果一致,则从缓存中直接读取文件。

User-Agent:浏览器类型.

Content-Length:表示请求消息正文的长度

Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接

Cookie:这是*重要的请求头信息之一 (在讲会话时解析)

Date:Date: Mon, 22Aug 2011 01:55:39 GMT请求时间GMT

 

3、消息正文: 当请求方式是POST方式时,才能看见消息正文

uName=tom&pwd=123

3、响应部分
1、响应消息行

*行:

HTTP/1.1   200  OK

协议/版本   响应状态码  对响应码的描述(一切正常)

响应状态码:

常用的就40多个。

200(正常)  一切正常

302/307(临时重定向)

304(未修改)

表示客户机缓存的版本是*新的,客户机可以继续使用它,无需到服务器请求。

404(找不到)  服务器上不存在客户机所请求的资源。

500(服务器内部错误)

 

2、响应消息头

Location: http://www.it315.org/index.jsp指示新的资源的位置

通常和302/307一起使用,完成请求重定向

Server:apachetomcat指示服务器的类型

Content-Encoding: gzip服务器发送的数据采用的编码类型

Content-Length:80 告诉浏览器正文的长度

Content-Language:zh-cn服务发送的文本的语言

Content-Type: text/html; charset=GB2312服务器发送的内容的MIME类型

Last-Modified:Tue, 11 Jul 2000 18:23:51 GMT文件的*后修改时间

Refresh: 1;url=http://www.it315.org指示客户端刷新频率。单位是秒

Content-Disposition: attachment; filename=aaa.zip指示客户端下载文件

Set-Cookie:SS=Q0=5Lb_nQ;path=/search服务器端发送的Cookie

Expires: -1

Cache-Control: no-cache (1.1)

Pragma: no-cache  (1.0)  表示告诉客户端不要使用缓存

Connection:close/Keep-Alive

Date:Tue, 11 Jul 2000 18:23:51 GMT
————————————————
版权声明:本文为CSDN博主「Bigoted_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Bigoted_/article/details/79320809

C语言实现一个简单的服务器

服务端
socket函数
为了执行网络I/O,一个进程必须做的*件事情就是创建一个socket函数

/* family 表示协议族 AF_INET(IPv4协议)、AF_INET6(IPv6协议)、AF_LOCAL(Unix域协议)、AF_ROUTE(路由套接字)、AF_KEY( 密钥套接字)
type 表示套接字类型 SOCK_STREAM(字节流套接字)、SOCK_DGRAM(数据报套接字)、SOCK_SEQPACKET(有序分组套接字)、SOCK_ROW(原始套接字)
protocol 表示传输协议 IPPROTO_TCP(TCP传输协议)、IPPROTO_UDP(UDP传输协议)、IPPROTO_SCTP(SCTP传输协议)
若成功返回非负描述符,若出错返回-1 */
int socket(int family, int type, int protocol);

bind函数
bind函数把一个本地协议地址赋予一个套接字,对于网际协议,协议地址就是IP加端口的组合

/* sockfd 初始化的套接字
myaddr 协议地址
addrlen 协议地址长度
若成功返回0 出错返回-1 */
int bind(int sockfd, const struct sockaddr * myaddr, socklen_t addrlen)

这个函数的第二个参数是协议地址,注意,这个协议地址已经有定义好的结构体,使用IPv4套接字结构地址时候,地址结构体定义如下

struct sockaddr_in {
uint8_t sin_len; //结构体长度
sa_family_t sin_family; //AF_INET
in_port_t sin_port; //端口(16-bie)
struct in_addr sin_addr; //IPv4地址(32-bit)
char sin_zero[8]; //没啥用,设置0即可
}

listen函数
listen函数仅有服务器调用,它完成两件事情:
1. 当使用socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将发送connect发起连接的客户端套接字。当调用listen函数之后,它被转成一个被动套接字,只是内核应该接受连接请求。所以,调用listen之后套接字由CLOSED状态转到LISTEN状态
2. 这个函数规定内核应该为相应套接字排队的*大连接数

//失败时返回-1
int listen(int sockfd, int backlog)

backlog参数的设定其实是表示两个队列的总和,这两个队列分别是
1. 未完成连接队列,在客户端发送一个SYN直到三次握手完成,都是这个状态,SYN_RCVD状态。

2. 已完成连接队列,这个表示三次握手完成的状态,ESTABLISHED状态
accept函数
accept函数是由TCP服务器调用,用于从已完成连接队列的队头返回下一个已完成连接,如果已完成连接队列为空,那么进程进入睡眠模式

// sockdf 服务器套接字莫描述符
// cliaddr 已连接的客户端协议地址
// addrlen 已连接的客户端协议地址长度
// 成功返回非负描述符,出错返回-1
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

当accept成功时,返回值是由内核自动生成的全新描述符,代表与所返回的客户端TCP连接。所以,在我们讨论accept函数时,我们称*个参数为监听套接字,它的返回值是已连接套接字,一个服务器通常指创建一个监听套接字(通常是80端口),内核为每个由服务器进程接受的客户端连接创建一个已连接套接字,当服务器完成对某个给定的客户端服务时,连接就会被关闭。
函数的第二个参数也是一个协议地址结构体,这个结构体和服务端协议地址是同一个结构体。我们可以不关心客户端的协议,直接传空,我们关系的是这个函数的返回值,因为它返回的是客户端连接描述符,我们可以对这个描述符进行写操作,从而实现给客户端传输数据。

write函数
// sockfd socket文件描述符
// buf 文件内容
// count 内容长度
ssize_t write(int sockfd, const void * buff, size_t count);

完整的服务器代码
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
int main()
{
int listenfd = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

if(listenfd < 0){
printf(“socket error”);
return -1;
}

struct sockaddr_in svraddr;/*声明一个变量,类型为协议地址类型*/
svraddr.sin_family = AF_INET;/*使用IPv4协议*/
svraddr.sin_port = htons(8887);/*监听8887端口*/
svraddr.sin_addr.s_addr = htonl(INADDR_ANY);/*绑定本机IP,使用宏定义绑定*/

if(bind(listenfd ,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr)) < 0){
printf(“bind error”);
return -1;
}

if(listen(listenfd, 20) < 0){
printf(“listen error”);
return -1;
}

struct sockaddr_in cliaddr;/*只是声明,并没有赋值*/
memset(&cliaddr, 0, sizeof(cliaddr));
socklen_t ret = sizeof(cliaddr);
int sockfd= accept(listenfd, (struct sockaddr*)&cliaddr, &ret );

if(sockfd < 0){
printf(“appect error”);
return -1;
}

char str[] = “Hello World”;
write(sockfd , str, sizeof(str));

close(sockfd );
close(listenfd);
}

客户端
socket函数
客户端要和服务端进行网络通讯,首先也必须调用socket函数,这里的socket函数和服务端的一样。

connect函数
TCP客户端就是使用connect函数和服务端建立连接

// sockfd 客户端TCP描述符
// sockaddr 服务端协议地址
// addrlen 服务端协议地址长度
int connect(int sockfd, const struct sockaddr * servaddr, socklen_t addrlen);

这个函数将触发客户端和服务端三次握手,函数的*个参数sockfd表示客户端返回的描述符,这里不需要调用bind函数绑定端口,系统会自动分配。函数的第二个参数需要配置服务端IP和端口信息,同样有结构体规范这些信息,结构体也是和服务端一样使用sockaddr_in类型。

read函数
客户端连接上服务器之后返回的是一个Socket文件描述符,既然是文件描述符,就可以通过简单的read函数获取网络数据。

// sockdf 文件描述符
// buf 文件内容存放地址
// count 内容长度
ssize_t read(int sockfd,void *buf,size_t count)

完整的客户端代码
#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
int main()
{
int sockfd= socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

if(sockfd== -1){
printf(“socket error”);
return -1;
}

struct sockaddr_in svraddr;
svraddr.sin_family = AF_INET;/*使用IPv4协议*/
svraddr.sin_port = htons(8887);/*需要连接的远程服务器端口*/
svraddr.sin_addr.s_addr = inet_addr(“127.0.0.1”);/*需要连接的远程服务器IP*/

if(connect(sockfd, (struct sockaddr *)&svraddr, sizeof(servaddr)) < 0){
printf(“connect error”);
return -1;
}

char str[64];
read(sockfd, str, 64);
printf(str);

close(sockfd);
}

迭代服务器
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
int main()
{
int listenfd = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

if(listenfd < 0){
printf(“socket error”);
return -1;
}

struct sockaddr_in svraddr;/*声明一个变量,类型为协议地址类型*/
svraddr.sin_family = AF_INET;/*使用IPv4协议*/
svraddr.sin_port = htons(8887);/*监听8887端口*/
svraddr.sin_addr.s_addr = htonl(INADDR_ANY);/*绑定本机IP,使用宏定义绑定*/

if(bind(listenfd,(struct sockaddr *)&svraddr,sizeof(svraddr)) < 0){
printf(“bind error”);
return -1;
}

if(listen(listenfd, 20) == -1){
printf(“listen error”);
return -1;
}

for ( ; ; ){
struct sockaddr_in cliaddr;/*只是声明,并没有赋值*/
socklen_t cliaddr_size = sizeof(cliaddr);
int sockfd = accept(listenfd, (struct sockaddr*)&cliaddr, &cliaddr_size );

if(sockfd < 0){
printf(“appect error”);
return -1;
}

char str[] = “Hello World”;
sleep(3);//3秒之后再向客户端发送数据
write(sockfd, str, sizeof(str));

close(sockfd);
/*close(listenfd);*/
}
}

并发服务器
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>

void doit(int sockfd);

int main()
{
int listenfd= socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
pid_t pid;

if(listenfd < 0){
printf(“socket error”);
return -1;
}

struct sockaddr_in svraddr;/*声明一个变量,类型为协议地址类型*/
svraddr.sin_family = AF_INET;/*使用IPv4协议*/
svraddr.sin_port = htons(8887);/*监听8887端口*/
svraddr.sin_addr.s_addr = htonl(INADDR_ANY);/*绑定本机IP,使用宏定义绑定*/

if(bind(listenfd,(struct sockaddr *)&svraddr,sizeof(svraddr)) < 0){
printf(“bind error”);
return -1;
}

if(listen(listenfd, 20) < 0){
printf(“listen error”);
return -1;
}

for( ; ; ){
struct sockaddr_in cliaddr;/*只是声明,并没有赋值*/
socklen_t cliaddr_size = sizeof(cliaddr);
int sockfd= accept(listenfd, (struct sockaddr*)&cliaddr, &cliaddr_size );

if(sockfd < 0){
printf(“appect error”);
return -1;
}

if( (pid = fork()) == 0 ){
close(listenfd);/*子进程不需要监听,关闭*/
doit(sockfd);/*针对已连接的客户端套接字进行读写*/
close(sockfd);/*处理完毕,关闭客户端连接*/
exit(0);/*自觉退出*/
}

close(sockfd);
/*close(listenfd);*/
}
}

void doit(int sockfd){
char str[] = “Hello World”;
sleep(3);//3秒之后再向客户端发送数据
write(sockfd, str, sizeof(str));
}

C++服务器 (一) 服务器概述

*近从学长那里拿到了一些C++服务器的学习视频,通过看视频之后简单的对自己看过的视频进行一个小总结。

首先,简单介绍一下,现在很多语言都可以用来进行服务器编程,例如:python、java、ruby等等,但是我们这里用的是C++,为什么要用C++来编写,这里*重要的就是效率。效率可以从两方面来看,一个是运行效率一个是开发效率,运行效率就不用多说,除了汇编语言外,运行效率*高的就是C语言和C++了。甚至在某些方面来看C++的运行效率甚至比C语言还要高。开发效率来看,学习C++的大家都知道C++的开发很累,很慢,其他语言几十行就可以解决的问题,C++可能就需要几百行甚至可能上千行。但是在C++发展到现在C++11甚至C++14的版本,已经有了很大的提升,相对来说C++已经具备了两种效率。

在服务器这方面我也是个纯新手,什么都不了解,在服务器方面不仅仅是需要C++的基础十分牢固还需要有TCP/IP、Socket方面的知识。所以会通过博客和笔记一点点补这些知识。服务器方面和其他不一样,服务器方面的基础要十分的扎实,这样的话才能让自己以后编写起来更加的方便,这次项目的环境在我们的linux ubuntu下开发的。之后我也会编写博客来给大家写环境的搭建步骤。

C++和java、python等有一个很大的区别,就是第三方库,比如我们现在要进行一个服务器方面或者说图形化方面等等,在你安装环境的时候都已经自带好了的第三方库,我们都可以直接使用,但是C++和C语言来说只在一些十分必要的库才有提前准备好,所以一些很多大公司都会有一些自己的库,只供自己公司内部人调用。我们这次编写的时候用的都是一些开源的标准的库,并不存在说我在这里可以使用在其他时候会出现问题的情况。主要是用到了boost库。

因为我也是个初级小白,没有任何知识,所以在前期我会把所有代码一行一行分析出来,打实基础。

下边我们进行一个小思考,假如你现在进入了一个公司,接受了一个类似QQ的项目,而你负责的是服务器方面,那你应该从哪里下手,应该如何实现如何开始呢?看到题目我也没有任何的想法,没有任何思路,服务器并没有说可以单纯的通过学习视频来实现,这就好像我们可以学会C语言C++,但是和某些大佬比起来你的功能是实现了, 但是你的代码的可读性效率等等都还需要有很大的提升,服务器方面也是,如果要写出来好的服务器,优秀的服务器还是有很长很长的路要走。

今天对服务器只是一个简单的介绍,*个视频结束前老师留了一个C++编程方面的题目,是将一个单链表进行逆置,也就是说我传入的链表是1-2-3,通过程序将链表数据变为3-2-1
逆置有两种方法, 一种是特别好理解的我们拿到一个链表之后,再创建一个新的节点,然后每次从旧链表中找到*后一个数据,将*后一个数据插入到新链表的尾部,但是这种情况的时间复杂度是很高的,因为这是一个单项链表并不能保存你的前一项数据或者是直接找到链表中*后一个元素,所以每次都需要找到*后一个元素。每次都需要将当前列表的长度遍历一遍。
%title插图%num

另一种是简洁但是不好理解的一种方式就是三指针方法。通过三个指针来分别保存三个相邻的数据,然后保证你将第二个数据的next指向*个数据的同时,而不会使得第二个数据之前的next丢失,这样不断的将三个指针向后移动,操作第二个数据的指针进行变化,知道第二个数据是*后一个数据,也就是第三个指针变成空的时候停止移动,此时的链表头就是第二个指针。

%title插图%num

我还没有接触过公司项目,所以也一直好奇公司里的代码是不是就是我们现在学的if else等等简单语句来组成的,就比如的我听到服务器根本不知道从何下手根本不知道要怎么做,但是通过*个视频老师留下的思考,就是链表的逆置,让我感觉到,其实任何程序都是通过你学过的简单的知识简单的语法来组成的,只要自己一点点来补充自己的基础知识,打实基础就可以。之后我会尽量每天给大家介绍服务器方面的学习知识。

服务器运维基础指南

#服务器运维基础指南

作为一个开发人员,对于服务器的操作不可避免。*常用的操作就是部署应用到服务器,及在生产,测试环境通过查看日志排查问题。

一般服务器都是linux操作系统并且是无图形界面的,所以进行任何操作都是通过命令行,由于从新一代程序员接触电脑都是从图形界面开始,所以在开始使用命令行的时候都不是很习惯,如果使用命令行习惯了,发挥现命令行可以干很多有趣,高效率的事情,提高生产力,让程序员更加专注在高技术含量的工作中。

##链接服务器入口
mac使用自带的终端,就可以直接登录服务器。windows需要下载工具例如:xshell

##登录服务器ssh
登录服务器有两种方式:

通过密码登录
免密码登录
ssh -l user ip/域名

ssh: secure shell 安全外壳协议,专为远程登录会话和其他网络服务提供安全性的协议。利用ssh协议可以有效防止远程管理过程中的信息泄漏问题。

###通过密码登录

输入: ssh -l user ip/域名

user:登录用户名

ip/域名: 服务器所属的公网id地址,或者应用的域名,如果要查看域名解析后的ip,在命令行输入 ping 域名,可以查看应用所属的公网ip(前提服务器没有做均衡负载,代理…)。

终端会提示你输入密码,此时输入密码,密码正确就可以登录服务器。

###免密码登录
免密码登录方式*次还是需要输入密码登录,不同的是,在登录之后把自己的密钥加入到服务器,下次就可以免密码登录。

生成ssh key
登录进服务器进入 ~ 目录下的 .ssh 打开 authorized_keys 文件如果没有则创建,把自己的公钥加入到authorized_keys里。之后再次使用ssh进入服务器的时候,不用输入密码就可以直接登录。

小技巧:mac可以新建一个.sh文件把ssh -l user ip/域名加入.sh文件,放在桌面默认使用终端打开,以后就可以双击.sh文件直接进入服务器(甚至可以在.sh写其他命令实现自动化)。

##退出服务器exit
exit

##查看当前目录位置 pwd
pwd

##显示当前目录下的所有文件ls

ls :列出当前目录下的所有文件

ls -l :列出当前目录下的所有文件及文件的详情

##进入退出目录cd

cd … :返回到上级目录
cd /. :返回根目录
cd 目录名 : 进入具体目录

##新建目录mkdir
mkdir file/filename

##启动运行脚本./

./xx.sh

##查看文件内容cat/tail

cat xxx.xx :查看文件的所有内容

tail -n 行数 xxx.xxx : 查看文件末尾xx行数

vi/vim xxx.xxx : 查看并且可以修改文件内容

##移动文件到具体目录 mv

mv xx sss : 移动xx文件到sss目录

建议删除文件时,先把文件移动到 /tmp目录下(linux的临时目录关机会清空,建议在此目录下进行删除)。

##删除文件 rm

rm -f xxx :强制删除文件

rm -rf xxx : -r 表示向下递归删除 -f 删除不提示 注意: rm -rf (不跟参数)会删除整个系统 , 就算有参数 linux没有回收站的概念 慎用慎用

rm -f *. * :梅花大法慎用,可能会误删除删除整个服务器

##修改文件的用户权限chown/chmod
chown -R user:user file :修改文件的用户权限 文件支持通配符

chmod 777 xxxx :改变文件权限 777就是高权限(读、写、执行 )登录用户他所在的组和其他人都有*高权限。(比较危险的操作)

###查看java程序的相关进程jps

jps :查看java程序进程

###拷贝文件到具体目录cp/scp

cp -r copyed copy : 把copyed复制到copy目录

scp xxx root@ip:/目录 : 复制xxx到远程ip服务器目录下

###启动服务关闭终端继续运行nohup

有时我们需要在服务器运行一些jar打包的应用,关闭终端后应用就关闭我们可以在 启动jar应用的命令前增加 nohup

###解压/压缩文件 unzip/zip

unzip -o xxx.xx -d sss :解压文件xxx.xx到sss并且全部覆盖

zip -r xxx.zip ./* : 压缩文件当前目录下的所有文件

如果没有unzip zip 命令执行,可以安装unzip/zip

yum install -y unzip zip

##总结
目前这些命令基本能够满足日常开发韵味服务器,但这只是简单的一些操作服务器的命令,如果有更多的需求可以系统的学习linux,那也是一个很大的话题 运维。
————————————————
版权声明:本文为CSDN博主「我爱看明朝」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013565163/article/details/79071026

认识服务器&&常见的Web服务器

今天带大家来认识一下常用的web服务器,先来解释一下,什么是web服务器,所谓的web服务器就是针对Web应用软件提供运行服务的容器,当我们开发好了自己的一个web应用软件的时候他是需要一个容器才能运行的,而这个容器就是就是我们常说的web服务器。

好了,简单的介绍了下web服务器,那么什么是服务器呢?上面的一段话中说到了,Web服务器就是针对Web应用提供服务支持的一个容器,那么毫无疑问,所谓的服务器那就是对外提供服务的机器了,也就是我们常说的计算机。不过这个计算机主要是对外提供各种服务的。和我们一般使用的计算机不同。

大家可以想象一下,我们买笔记本的时候,会有游戏本和办公本以及什么超博本之类的分类,虽然他们的叫法不同,但是他们本质上都是计算机对不对。只不过适合打游戏的配置商家就把它叫做游戏本,适合办公的就把它叫做办公本,设计的比较轻薄的就把它叫做轻薄本,再比如网吧里的每台计算机上都装了游戏,这个时候你就可以把这台计算机叫做游戏机,同样的,办公室的每台计算机都装了办公软件,这个时候你也可以称它为办公机。那么如果我们在一台计算机上安装一个Web服务器的话,我们当然就称这台计算机为服务器了。好了,简单的给大家介绍了一下服务器。

我们都知道一般的计算机长什么样,那么服务器长什么样呢???

来看下面这张图:
%title插图%num

看起来像个柜子一样,没错,这就是服务器的样子。中央机房的每一个机柜中放的就是一个服务器,每台服务器每时每刻都在对外提供各种各样的服务,那么你可能会好奇,这样一个破玩意儿怎么对外提供服务呢,连个显示器也没有,怎么进行人机交互呢?

这里给大家解释一下,一般中央机房的作业条件比较恶劣,温度也很高,运维人员并不适合在机房管理服务器,当需要维护的时候先关的工作人员一般都是在办公室里,通过http协议远程连接中央机房里的服务器,进行维护和管理。所以一般机房里的服务器是不会配置显示器的。

好了,介绍完了服务器和Web服务器之后,我们再来回到Web服务器上,到这里相信大家已经对服务器和Web服务器都已经有了一定的认识,如果还不理解的话你就记住下面一句话:

服务器是一种提供服务的计算机设备,Web服务器是Web应用程序运行的一个容器。

好了,接下来就来给大家介绍一下常见的Web服务器,由于各种应用软件的开发环境太多太复杂,相应的Web容器也比较多,这里主要以Java语言为例,常见的服务器有以下几种:

Tomcat(Apache):当前应用*广的JavaWeb服务器;
JBoss(Redhat红帽):支持JavaEE,应用比较广EJB容器 –> SSH轻量级的框架代替
GlassFish(Orcale):Oracle开发JavaWeb服务器,应用不是很广;
Resin(Caucho):支持JavaEE,应用越来越广;
Weblogic(Orcale):要钱的!支持JavaEE,适合大型项目;
Websphere(IBM):要钱的!支持JavaEE,适合大型项目
emmmm,目前我所接触的也就上面几种,好了,到这里相信大家都已经有了一定的认识吧,那么下一篇博客中将带大家一起来学习tomcat服务器的使用,没有办法,小编太穷了,只能用的免费的。

一些常用的WebService.

天气预报Web服务,数据来源于中国气象局 
Endpoint  
Disco  
WSDL 

IP地址来源搜索 WEB 服务(是目前*完整的IP地址数据) 
Endpoint  
Disco  
WSDL 

随机英文、数字和中文简体字 WEB 服务 
Endpoint  
Disco  
WSDL 

中国邮政编码 <-> 地址信息双向查询/搜索 WEB 服务 
Endpoint  
Disco  
WSDL  

验证码图片 WEB 服务 支持中文、字母、数字 图像和多媒体 
Endpoint  
Disco  
WSDL 

Email 电子邮件地址验证 WEB 服务 
Endpoint  
Disco  
WSDL  

中文简体字 <->繁体字转换 WEB 服务 
Endpoint  
Disco  
WSDL  

中文 <-> 英文双向翻译 WEB 服务 
Endpoint  
Disco  
WSDL  

火车时刻表 WEB 服务 (第六次提速*新列车时刻表) 
Endpoint  
Disco  
WSDL  

中国股票行情数据 WEB 服务(支持深圳和上海股市的基金、债券和股票) 
Endpoint  
Disco  
WSDL 

即时外汇汇率数据 WEB 服务 
Endpoint  
Disco  
WSDL  

腾讯QQ在线状态 WEB 服务 
Endpoint  
Disco  
WSDL  

中国电视节目预告(电视节目表) WEB 服务 
Endpoint  
Disco  
WSDL 

外汇-人民币即时报价 WEB 服务 
Endpoint  
Disco  
WSDL 

中国股票行情分时走势预览缩略图 WEB 服务 
Endpoint  
Disco  
WSDL 

国内飞机航班时刻表 WEB 服务 
Endpoint  
Disco  
WSDL  

中国开放式基金数据 WEB 服务 
Endpoint  
Disco  
WSDL  

股票行情数据 WEB 服务(支持香港、深圳、上海基金、债券和股票;支持多股票同时查询) 
Endpoint  
Disco  
WSDL  

什么是WEB服务器? 常用的WEB服务器有哪些?

一、什么是WEB服务器

Web服务器可以解析HTTP协议。当Web服务器接收到一个HTTP请求,会返回一个HTTP响应,例如送回一个HTML页面。为了处理一个请求Web服务器可以响应一个静态页面或图片,进行页面跳转或者把动态响应的产生委托给一些其它的程序例如CGI脚本,JSP脚本,servlets,ASP脚本,服务器端JavaScript,或者一些其它的服务器端技术。无论它们(译者注:脚本)的目的如何,这些服务器端的程序通常产生一个HTML的响应来让浏览器可以浏览。

二。常用的WEB服务器有哪些?

在UNIX和LINUX平台下使用*广泛的免费HTTP服务器是W3C、NCSA和APACHE服务器,而Windows平台NT/2000/2003使用IIS的WEB服务器。在选择使用WEB服务器应考虑的本身特性因素有:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等,下面介绍几种常用的WEB服务器。

Microsoft IIS
Microsoft的Web服务器产品为Internet Information Server (IIS), IIS 是允许在公共Intranet或Internet上发布信息的Web服务器。IIS是目前*流行的Web服务器产品之一,很多著名的网站都是建立在IIS的平台上。IIS提供了一个图形界面的管理工具,称为 Internet服务管理器,可用于监视配置和控制Internet服务。

IIS是一种Web服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。它提供ISAPI(Intranet Server API)作为扩展Web服务器功能的编程接口;同时,它还提供一个Internet数据库连接器,可以实现对数据库的查询和更新。

IBM WebSphere
WebSphere Application Server 是 一 种功能完善、开放的Web应用程序服务器,是IBM电子商务计划的核心部分,它是基于 Java 的应用环境,用于建立、部署和管理 Internet 和 Intranet Web 应用程序。 这一整套产品进行了扩展,以适应 Web 应用程序服务器的需要,范围从简单到高级直到企业级。

WebSphere 针对以 Web 为中心的开发人员,他们都是在基本 HTTP服务器和 CGI 编程技术上成长起来的。IBM 将提供 WebSphere 产品系列,通过提供综合资源、可重复使用的组件、功能强大并易于使用的工具、以及支持 HTTP 和 IIOP 通信的可伸缩运行时环境,来帮助这些用户从简单的 Web 应用程序转移到电子商务世界

BEA WebLogic
BEA WebLogic Server 是一种多功能、基于标准的web应用服务器,为企业构建自己的应用提供了坚实的基础。各种应用开发、部署所有关键性的任务,无论是集成各种系统和数据库,还是提交服务、跨 Internet 协作,起始点都是 BEA WebLogic Server。由于 它具有全面的功能、对开放标准的遵从性、多层架构、支持基于组件的开发,基于 Internet 的企业都选择它来开发、部署*佳的应用。

BEA WebLogic Server 在使应用服务器成为企业应用架构的基础方面继续处于*地位。BEA WebLogic Server 为构建集成化的企业级应用提供了稳固的基础,它们以 Internet 的容量和速度,在连网的企业之间共享信息、提交服务,实现协作自动化。

APACHE

apache仍然是世界上用的*多的Web服务器,市场占有率达60%左右。它源于NCSAhttpd服务器,当NCSA WWW服务器项目停止后,那些使用NCSA WWW服务器的人们开始交换用于此服务器的补丁,这也是apache名称的由来(pache 补丁)。世界上很多著名的网站都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。

Tomcat
Tomcat是一个开放源代码、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。Tomcat Server是根据servlet和JSP规范进行执行的,因此我们就可以说Tomcat Server也实行了Apache-Jakarta规范且比*大多数商业应用软件服务器要好。
Tomcat是Java Servlet 2.2和JavaServer Pages 1.1技术的标准实现,是基于Apache许可证下开发的自由软件。Tomcat是完全重写的Servlet API 2.2和JSP 1.1兼容的Servlet/JSP容器。Tomcat使用了JServ的一些代码,特别是Apache服务适配器。随着Catalina Servlet引擎的出现,Tomcat第四版号的性能得到提升,使得它成为一个值得考虑的Servlet/JSP容器,因此目前许多WEB服务器都是采用Tomcat。
目前,许多大型Web应用一般将Apache和Tomcat结合使用,Apache负责接收用户的HTTP请求,如果请求是Servlet、Jsp,则把请求转发给Tomcat处理,并将处理结果封装响应给用户。

补充部分:

1.IIS

IIS(Internet信息服务)英文InternetInformationServer的缩写。它是微软公司主推的服务器。IIS的特点具有:安全性,强大,灵活。

2.Tomcat

Tomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。

3.Zeus

Zeus是一个运行于Unix下的非常优秀的Web服务器,据说性能超过Apache,是效率*高的Web服务器之一。

4.Nginx

Nginx不仅是一个小巧且高效的HTTP服务器,也可以做一个高效的负载均衡反向代理,通过它接受用户的请求并分发到多个Mongrel进程可以*大提高Rails应用的并发能力。

5.Apache

Apache是世界使用排名*的Web服务器软件。它几乎可以运行在所有的计算机平台上。由于Apache是开源免费的,因此有很多人参与到新功能的开发设计,不断对其进行完善。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。

6.Lighttpd

Lighttpd是由德国人JanKneschke领导开发的,基于BSD许可的开源WEB服务器软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的webserver环境。具有非常低的内存开销,CPU占用率低,效能好,以及丰富的模块等特点。支持FastCGI,CGI,Auth,输出压缩(outputcompress),URL重写,Alias等重要功能。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速