分类: 服务器

服务器

diy数据库(八)–客户端和服务器之间的通信协议

一、什么是通信协议

通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。

二、diydb的协议格式

1、协议格式是通信协议中*重要的部分之一,diydb采用的是自定义格式和BSON格式的混合格式

2、协议格式总览

%title插图%num

协议主要分三个大段

(1)协议头:包括消息长度(用于读取一个完整的协议包)和消息类型

(2)协议主体:不同的消息类型对应不同的协议主体,协议主体主要保存的是每种消息类型独有的信息

(3)附加信息:一个或多个bson格式的对象,表示实际操作和返回的数据库中的数据对象

3、协议格式主体

%title插图%num

返回消息:一、返回值,用于表示返回成功或失败;二、返回记录数,用于表示返回的数据对象的个数,即附加消息中bson对象的个                     数。

插入消息:插入记录数,表示要插入的数据对象的个数。

删除消息:因为每次只能删除一个数据,所以这里没有特殊信息。

查询消息:因为每次只能查询一个数据,所以这里没有特殊信息。

注:1)diydb的数据删除和查询时,客户端必须在附加信息中以bson格式传递一个数据对象的_id信息。

2)另外,quit命令只需要协议头就可以了。

4、附加信息

%title插图%num

每个附加记录或插入记录实际上就是一个bson对象,删除条件或查询条件实际上就是{_id:XXX}格式的json对象对应的bson对象(因为diydb实际上没有复杂的条件查询功能,当然可以以后增加)。

注:1)、在直接传递一个结构体对象时,要注意结构体里面的属性的字节对齐。

2)、跨操作系统通信时要注意字节序的问题。

三、源码分析

通讯协议的主要实现(这里主要是数据打包解包)在msg.hpp和msg.cpp两个文件中,比如客户端用msgBuildInsert封装表示插入数据的数据包并存入数据流中,然后服务器端代理线程收到这个数据流后用msgExtractInsert解包这个数据流中的数据。下面是msg.hpp的所有代码。

#ifndef MSG_HPP__
#define MSG_HPP__

#include “bson.h”

#define OP_REPLY 1//返回消息
#define OP_INSERT 2//插入消息
#define OP_DELETE 3//删除消息
#define OP_QUERY 4//查询消息
#define OP_DISCONNECT 6//断开连接消息
#define OP_CONNECT 7//连接消息

#define RETURN_CODE_STATE_OK 1

struct MsgHeader
/*数据包的头*/
{
int messageLen ;//数据包的长
int opCode ;//数据包类型
} ;

struct MsgReply
/*返回数据包*/
{
MsgHeader header ;//数据包的头
int returnCode ;//返回值
int numReturn ;//返回的记录数量
char data[0] ;//标记数具体的开始位置
} ;

struct MsgInsert
/*插入数据包*/
{
MsgHeader header ;
int numInsert ;//插入记录数
char data[0] ;
} ;

struct MsgDelete
/*删除数据包*/
{
MsgHeader header ;
char key[0] ;//删除条件
} ;

struct MsgQuery
/*查询数据包*/
{
MsgHeader header ;
char key[0] ;//查询条件
} ;

/*返回消息的封装*/
int msgBuildReply ( char **ppBuffer, int *pBufferSize,
int returnCode, bson::BSONObj *objReturn ) ;

/*解消息*/
int msgExtractReply ( char *pBuffer, int &returnCode, int &numReturn,
const char **ppObjStart ) ;

/*做一个插入obj的数据包*/
int msgBuildInsert ( char **ppBuffer, int *pBufferSize, bson::BSONObj &obj ) ;

/*做一个插入多个obj的数据包*/
int msgBuildInsert ( char **ppBuffer, int *pBufferSize, vector<bson::BSONObj*> &obj ) ;

/*解插入*/
int msgExtractInsert ( char *pBuffer, int &numInsert, const char **ppObjStart ) ;

/*删除*/
int msgBuildDelete ( char **ppBuffer, int *pBufferSize, bson::BSONObj &key ) ;

/*解删除*/
int msgExtractDelete ( char *pBuffer, bson::BSONObj &key ) ;

/*查询*/
int msgBuildQuery ( char **ppBuffer, int *pBufferSize, bson::BSONObj &key ) ;

/*解查询*/
int msgExtractQuery ( char *pBuffer, bson::BSONObj &key ) ;

int msgMultiInsert ( char **ppBuffer, int *pBufferSize, bson::BSONObj &obj ) ;

/*做一个插入多个obj的数据包*/
int msgBuildInsert ( char **ppBuffer, int *pBufferSize, vector<bson::BSONObj*> &obj ) ;

#endif

对上面函数的实现,我们以插入数据包的封装和解包为例来分析

int msgBuildInsert ( char **ppBuffer, int *pBufferSize, BSONObj &obj )
{//只插入一个数据
int rc = DIY_OK ;
int size = sizeof(MsgInsert) + obj.objsize() ;//表示插入数据的数据包的长度
MsgInsert *pInsert = NULL ;
rc = msgCheckBuffer ( ppBuffer, pBufferSize, size ) ;//如果*ppBuffer指向的堆空间不够用,则重新分配一个足够的字节数组空间
if ( rc )
{
PD_LOG ( PDERROR, “Failed to realloc buffer for %d bytes, rc = %d”,
size, rc ) ;
goto error ;
}

pInsert = (MsgInsert*)(*ppBuffer) ;//将字节流划分成包格式
// 构建协议头
pInsert->header.messageLen = size ;
pInsert->header.opCode = OP_INSERT ;
// 构建协议主体
pInsert->numInsert = 1 ;
// 构建附加消息,即填bson对象
memcpy ( &pInsert->data[0], obj.objdata(), obj.objsize() ) ;
done :
return rc ;
error :
goto done ;
}

int msgExtractInsert ( char *pBuffer, int &numInsert, const char **ppObjStart )
{
int rc = DIY_OK ;
MsgInsert *pInsert = (MsgInsert*)pBuffer ;
// 检测数据包的长度是否合法
if ( pInsert->header.messageLen < (int)sizeof(MsgInsert) )
{
PD_LOG ( PDERROR, “Invalid length of insert message” ) ;
rc = DIY_INVALIDARG ;
goto error ;
}
// 检测数据包的类型对不对
if ( pInsert->header.opCode != OP_INSERT )
{
PD_LOG ( PDERROR, “non-insert code is received: %d, expected %d”,
pInsert->header.opCode, OP_INSERT ) ;
rc = DIY_INVALIDARG ;
goto error ;
}
// 解析附加信息,即取出bson对象
numInsert = pInsert->numInsert ;
// object
if ( 0 == numInsert )
{
*ppObjStart = NULL ;
}
else
{
*ppObjStart = &pInsert->data[0] ;
}
done :
return rc ;
error :
goto done ;
}
注:客户端得到的bson对象的由来:用户在客户端输入命令,这个命令如果包含json格式的文本,则通过json库根据表示json格式的文本构建一个json对象,然后通过bson库将这个json对象转换成一个bson对象。

四、总结

1、因为tcp通信是字节流,并没有边界标识,所以应用层在传数据时,必须通过增加数据包长度字段或者增加数据包边界标识来区分一个完整的包。diydb中用的是数据包长度的方式,这也是实际应用中常用的方式。
2、如果在通信时直接传结构体数据,则要注意字节对齐机制,所以要合理安排结构体中属性的长度的排列顺序。

 

浏览器 服务器之间的通信过程

B/S(Browser/Server)结构就是浏览器/服务器结构,它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,*少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。本文将主要讲解浏览器和服务器通信的过程。

浏览器和服务器之间的通讯并不是看上去那么简单,里面还是有着许多的门道的。想要简单理解浏览器和服务器之间的通讯,我们可以打一个简单的比方:

设想我们自己就是浏览器,服务器就是10086语音服务台,我们现在想要和10086服务台取得联系(比如说想骚扰接线员MM),我们该怎么办呢?

当然,大多数人都应该想到,那就是要有部电话。是这样的,这就引出了我们的*个概念:套接字(Socket)。

套接字在百度百科上的解释是:

多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。

这个解释太学术了,我们可以简单把套接字理解成一个电话,我们可以从中发送信息和获取信息。

好了,电话有了,我们该给10086服务台打电话了。等等,我们是不是忘了一点,给10086打电话是不是要保证10086服务台也要有一部电话来等待我们的来电呢?对的,那么就是说服务器端也要有一个套接字,专门接受浏览器的请求。一般当一个服务器启动服务后就会开启一个监听连接的套接字,专门等待浏览器连接,接受浏览器请求。

接下来我们要开始打电话了。大多数人都应该有给10086服务台打电话的经验吧,接通后并不是马上由接线员MM来接听你的电话的,而是根据语音提示选择你想要的服务。当你选择了语音服务以后,系统才会自动给你安排一个接线员MM来接听你的电话。那么这个过程是不是又生成了一个套接字呢?是的,没错,我们可以把呼叫系统(也就是给你语音提示,让你选择服务的系统)当成专门接受浏览器的请求的那个套接字,当浏览器发送了一个请求后系统自动生成一个专门和你的浏览器通信的套接字,这样我们就可以和接线员MM通话了,浏览器也就可以和服务器通信了。

当然这远远不是B/S结构的全部,我们还需要进一步深化:

首先我们想想,我们要和接线员通话是不是要约定一个大家都能听得懂的语言,否则我说中文他说英语,这样就谁也听不懂谁的话,也不会完成通话,那么这个约定的语言是什么呢?那就是HTTP协议。

还是先来看百度百科上的解释:

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用*为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP*初的目的是为了提供一种发布和接收HTML页面的方法。

我们就可以把它理解成一种浏览器和服务器都遵循的一种语法规范,所有的信息都是通过这种语法规范传输的,这样浏览器和服务器都可以正确的理解。

浏览器和服务器一般并不是直接连接上的,而是需要通过中间的网络设备,就像我们的声音并不是直接传到接线员的耳朵里,而是要通过电话线通过电波传送一样,浏览器和服务器所发送的遵循HTTP协议的信息也要通过网络设备的传递才能被对方所接收。而这就需要一种在网络设备(网线)上传输数据的一种通用的语法规范(协议)。这样的协议使用*多的有2种:TCP协议和UDP协议

TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

UDP—用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

不管使用哪种方法,总之这样网络设备间也有了一套传输的协议,这样一来,浏览器和服务器才能真正的实现通信。

下面让我们来看看我们浏览网页的时候发生了什么吧。

1.首先我们在地址栏上输入我们想要打开的网址,然后我们通常会按下回车。这样一个请求就由浏览器以一种满足http协议的请求报文的形式发往服务器,请求报文中包含了要请求的页面地址,请求的文件类型等一系列信息。

2.在请求报文传递至客户端得网络设备的时候,网络设备把请求报文包装在一个满足TCP协议的数据中,通过网线传向服务器的网络设备。

3.服务器的网络设备接收到数据后,使用特殊的算法将数据解译,重新恢复成浏览器发出满足http协议的请求报文的形式,然后传向服务器软件。

4.服务软件得到请求报文后,根据请求报文所请求的页面地址在服务器的数据库中找到相应的页面,然后生成满足http协议的响应报文发向浏览器。响应报文中包括了响应报文头和被请求页面的代码(响应报文体)。

5.同样的,响应报文通过服务器的网络设备,被包装在一个满足TCP协议的数据,通过网线传向客户端的网络设备。

6.客户端的网络设备将响应报文解析,然后传给浏览器软件,浏览器在将响应报文解析,这样我们就在浏览器上看到了想要看到的网页。

以上只是浏览器与服务器之间通信的*简单的形式,实际使用中,一个网页往往包含着html代码,js代码,css样式表,图片等等多种数据,而这些数据并不是一次性由服务器传给浏览器的,而是存在着一定的顺序。首先服务器收到浏览器的请求后会将html代码发给浏览器,浏览器收到响应后会解析响应报文,发现html代码中包含着js代码和css样式表,而浏览器端并没有这些数据,所以浏览器会再次发送请求,向服务器请求js代码或css样式表数据(注意一次只能请求一种类型的数据),服务器收到请求后,会根据浏览器的请求再次找到数据库中的js文件或css样式表,将其发送到浏览器端。当网页中包含图片的时候也是同理。就这样循环往复,经过多次浏览器的请求和服务器的响应,当浏览器发现自己已经有了所有需要的数据后,会停止发送请求,这样一个完整的网页就呈现在我们眼前了。

以上只是浏览器与服务器之间通信的大致过程,要想详细了解其中门道还请各位参考更详细的文章。

服务器集群中服务器之间如何通信

在用Python做通信时,遇到服务器与服务器之间通信时,遇到如下问题
服务器集群中服务器之间如何通信?

网上看到好多人是通过以下方式去做的:

在做服务器集群时,集群中的服务器需要通信,比如Client1(简称C1)连接到Server1(简称S1),Client2连接到Server2,Client1需要向Client2发消息,S1并不知道C2已连接到S2。

A方案:采用组播(或广播),S1在接收到C1消息后,发送广播包查询C2位于哪个Server上,这时S2向S1回复,S1再将消息发送到S2,S2转发给C2,但是udp是不可靠的,虽然Server都位于同一局域网内,如果消息丢了,那C2就接收不到C1的消息了。

B方案:增加一个路由服务器,所有Server都连接到路由服务器(tcp长连接),S1将消息转发给路由服务器,路由服务器再广播给所有Server,由各个Server自行判断,但这样程序复杂度就上升了,每个Server都会处理本来不属于自己处理的消息,而且路由服务器会成为瓶颈,消息数量大规模增加的话。

这不就是个消息队列嘛,简单的可以用zeromq做,稍微复杂一点可以用rabbitmq/activemq/qpid等等各种成熟方案。

rabbitmq
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。

ActiveMQ
1、ActiveMQ是消息队列技术,为解决高并发问题而生!

2、ActiveMQ生产者消费者模型(生产者和消费者可以跨平台、跨系统)

有中间平台

3、ActiveMQ支持两种消息传输方式

1)Queue,队列模式,生产者生产了一个消息,只能由一个消费者进行消费

2)Topic,发布/订阅模式,生产者生产了一个消息,可以由多个消费者进行消费

Qpid
AMQP是一种用于业务消息的开放网络协议。他定义了一种允许双方进行可靠业务消息传递的二进制线级协议。该协议的目标是成为所有消息中间件之间进行互操作的标准协议。

消息队列是一种进程间通信线程或同一进程的不同线程间的通信方式。

Qpid则是由Apache开发的一种消息队列,实现了AMQP协议,并且支持多种语言与多种平台。

zeromq
这是个类似于Socket的一系列接口,他跟Socket的区别是:普通的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而ZMQ屏蔽了这些细节,让你的网络编程更为简单。ZMQ用于node与node间的通信,node可以是主机或者是进程。

引用官方的说法: “ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”。现在还未看到它们的成功。但是,它无疑是*具前景的、并且是人们更加需要的“传统”BSD套接字之上的一 层封装。ZMQ让编写高性能网络应用程序*为简单和有趣。”

这不就是个消息队列嘛,简单的可以用zeromq做,稍微复杂一点可以用rabbitmq/activemq/qpid等等各种成熟方案

我看了下zeromq资料,它是用的tcp,通过一个路由服务器来转发(发布-订阅,请求-应答等等)。我的问题这种转发服务器会是一个瓶颈额,比如设计目标并发量10万,即每秒10万条消息,要求所有消息1秒内处理完,他能即时处理?

消息队列很成熟了,你要想性能好,就加机器来解决。

看消息大小,0mq官网有测试数据,8字节的消息每秒可以吞吐280万条(10G网络)或者400万条(infiniband),100字节的消息每秒都在100万条以上,每秒10万并不是一个特别巨大的量。想要性能可以堆机器,分布式消息队列很成熟了。

吞吐能力是接收和发送的总和?还是单单是接收?其实我想知道它的分发能力,比如说有10个服务器向它订阅了消息,那1秒它能同时分发给这10台服务器的消息量有多大?

官网有很具体的报告可以参考,建议自己搭环境实际测试,在普通PC和千兆网卡的环境里,是不可能有官方测出来的那个成绩的

我的程序中用的就是“广播”,主动或被动发送状态。

请问你是如何解决udp广播中丢消息的问题呢?

建立应答与重发机制

在分布式调度系统中,如果要实现调度服务器与多台计算节点服务器之间通信,采用socket来实现是一种实现方式,当然我们也可以通过数据存储任务,子节点来完成任务,但是往往使用数据作为任务存储都需要定制开发,要维护数据库中任务记录状态等等。开发的东西还是有点多,而且还不够灵活。因此,我个人是比较偏向于使用socket来实现任务的调度工作。原因:使用socket实现调度比较灵活,而且扩展性都比较好。

实现思路:调度服务器要实现调度工作,它必须与所有计算节点之间建立连接。而且他需要知道每台计算节点的任务状况,因此服务器节点必须存储与所有计算节点的socket连接对象。

在客户端唯一需要知道的就是它归属的调度服务器的通信IP和端口,因此client是发送连接的主动方,由调度服务器监听是否有client请求建立连接,当建立连接成功后,把该连接信息存储到一个结合中以便监控client的存货状态及通信使用。

扩展:

由于server端是存储了所有server与client的连接对象,因此我们是可以基于此demo的基础上实现聊天系统:

* 每当一个与用户发言时,是由server接收到的某个用户的发言信息的,此时服务器端可以通过循环发送该用户发送的信息给每个已经连接连接的用户(排除发送者)。

个人总结
可以见解负载均衡nginx的设计思想,进程间通信,队列,中间服务器,缓存等思想

浏览器与服务器交互的过程

浏览器与服务器交互的过程

4.1、浏览器与服务器交互图

当我们打开浏览器,在浏览器的地址栏中输入URL地址”http://www.gacl.cn:8080/JavaWebDemo1/1.jsp”去访问服务器上的1.jsp这个web资源的过程中,浏览器和服务器都做了神马操作呢,我们是怎么在浏览器里面看到1.jsp这个web资源里面的内容的呢?

浏览器和服务器做了以下几个操作:

1、浏览器根据主机名”www.gacl.cn”去操作系统的Hosts文件中查找主机名对应的IP地址。

2、浏览器如果在操作系统的Hosts文件中没有找到对应的IP地址,就去互联网上的DNS服务器上查找”www.gacl.cn”这台主机对应的IP地址。

3、浏览器查找到”www.gacl.cn”这台主机对应的IP地址后,就使用IP地址连接到Web服务器。

4、浏览器连接到web服务器后,就使用http协议向服务器发送请求,发送请求的过程中,浏览器会向Web服务器以Stream(流)的形式传输数据,告诉Web服务器要访问服务器里面的哪个Web应用下的Web资源,如下图所示:

%title插图%num

这就是浏览器向Web服务器发请求时向服务器传输的数据,解释一下”GET /JavaWebDemo1/1.jsp HTTP/1.1“这里面的内容,

GET:告诉Web服务器,浏览器是以GET的方式向服务器发请求。

/JavaWebDemo1/1.jsp:告诉Web服务器,浏览器要访问JavaWebDemo1应用里面的1.jsp这个Web资源。

    HTTP/1.1:告诉Web服务器,浏览器是以HTTP协议请求的,使用的是1.1的版本。

5、浏览器做完上面4步工作后,就开始等待,等待Web服务器把自己想要访问的1.jsp这个Web资源传输给它。

6、服务器接收到浏览器传输的数据后,开始解析接收到的数据,服务器解析”GET /JavaWebDemo1/1.jsp HTTP/1.1“里面的内容时知道客户端浏览器要访问的是JavaWebDemo1应用里面的1.jsp这个Web资源,然后服务器就去读取1.jsp这个Web资源里面的内容,将读到的内容再以Stream(流)的形式传输给浏览器,如下图所示:

%title插图%num

这个就是Web服务器传输给浏览器的数据。

7、浏览器拿到服务器传输给它的数据之后,就可以把数据展现给用户看了,如下图所示:

%title插图%num

看到的这个”JavaWebDemo1″就是浏览器解析服务器发送回来的数据后的效果

服务器发送回来的数据:

 1 HTTP/1.1 200 OK
 2 Server: Apache-Coyote/1.1
 3 Content-Type: text/html;charset=ISO-8859-1
 4 Content-Length: 102
 5 Date: Mon, 19 May 2014 14:25:14 GMT
 6 
 7 <html>
 8     <head>
 9         <title>JavaWebDemo1</title>
10     </head>
11     <body>
12         JavaWebDemo1
13 
14     </body>
15 </html>

这就是浏览器和服务器的交互过程。

利用idrac安装操作系统(dell r730)

题外话:每日七点,QQ群大家分享技术相关文章,睡什么睡起来嗨!

QQ群号:630300475

正文:(1)准备好iso镜像

            (2)进入idrac,进入虚拟终端

    (3)点击虚拟终端上部的虚拟介质

%title插图%num

   (4)单击  连接介质 —-> 映射cd/DVD

%title插图%num

(5)选择你的镜像的位置

%title插图%num

%title插图%num

(6)选择虚拟终端上面的 下次引导 —->  虚拟cd/Dvd

(7)重启机器,后面就和安装虚拟机一样了

戴尔 iDRAC 命令行工具及常用命令

标签:iDRAC 远程命令工具   戴尔iDRAC远程命令工具   OM LRAU   iDRAC创建用户   iDRAC的IP修改

1、RHEL 系统环境iDRAC 命令工具包:

Dell EMC OpenManage Linux Remote Access Utilities :http://www.dell.com/support/home/cn/zh/cndhs1/drivers/driversdetails?driverId=49T1M
下载后,需解决net-snmp-utils包的依赖关系在执行此目录下的rpm包安装/root/linux/rac/RHEL7/x86_64,然后软链接
物理机环境的安装和虚拟机环境安装区别:
物理机环境:安装在物理机环境后,可直接 # racadm command查看和修改iDRAC配置
虚拟机环境:安装在虚拟机环境后,需 -r IP #racadm -r 192.168.1.1 -u User -p ‘Password‘ command 查看和修改iDRAC配置
2、iDRAC 命令手册:

http://topics-cdn.dell.com/pdf/idrac7-8-lifecycle-controller-v2.50.50.50_reference-guide_en-us.pdf
3、iDRAC 常用命令

创建、删除、赋权用户的操作
# racadm config -g cfgUserAdmin -o cfgUserAdminUserName -i 10 User01 创建索引10的用户User01
# racadm config -g cfgUserAdmin -o cfgUserAdminPassword -i 10 ‘Password‘ 给创建的用户设置密码
# racadm set iDRAC.Users.10.Password ‘NewPassword‘ 更改用户密码
# racadm config -g cfgUserAdmin -i 10 -o cfgUserAdminEnable 1 启用用户<1表示启用,0表示禁用>
# racadm config -g cfgUserAdmin -o cfgUserAdminUserName -i 10 删除用户
# racadm config -g cfgUserAdmin -o cfgUserAdminPrivilege -i 10 4 赋予User01用户超级管理员权限
物理机重启、关机等操作
# racadm serveraction powerup 开启服务器
# racadm serveraction powerdown 关闭服务器
# racadm serveraction powercycle 关机后再开启服务器
# racadm serveraction powerstatus 查看服务器状态
iDRAC 重启操作
# racadm racreset soft 软重启iDRAC
# racadm racreset hard 硬重启iDRAC
# racadm racreset soft -f 强制软重启iDRAC
# racadm racreset hard -f 强制硬重启iDRAC
# racadm set iDRAC.IPv4.Address x.x.x.x 修改IP地址
# racadm set iDRAC.IPv4.Netmask x.x.x.x 修改子网掩码
# racadm set iDRAC.IPv4.Gateway x.x.x.x 修改默认网关<无需重启idrac,配置即生效>

web项目如何部署到服务器?

写好上位机程序后,如何部署到服务器?
(这里我用的是tomcat服务器)
首先说明一点:为了程序测试是否连接到下位机,我编写了一个命名为gprs的java文件,这个可以用下位机连接是否成功。程序见附录,下面说具体的部署的步骤:

把web项目导出为war文件。步骤:选中web文件的项目->右键->Export->Myeclipse->WAR file如下图:
%title插图%num

选择导出的位置,这里我为方便查找,选择为桌面。

%title插图%num

把gprs.java文件导出为 Runnable JAR 文件。

步骤:选中java项目中的gprs.jar文件->右键->Export->java->Runnable JAR file,然后选择next

%title插图%num

Launch configuation 选择的是你的主清单属性(就是你要运行的main方法所在的类,如果找不到就把main方法跑一边),Export destinaction 把导出的文件存放到哪里(不是像下载东西直接选个地址就完了,还要指定文件名和后缀  例如  c:\test.jar)Library handling 的三个选项(建议选第二个)

finish(去你指定的地方就可以找到文件了不用担心你依赖的jar会一起导出了)

Library handling 的三个选项:

Extract required libraries into generated jar:提取需要的库(以解压的形式)放到生成的 jar文件中,生成的jar文件较小 Package required libraries into generated jar:将所有需要的Jar包放到生成的 jar 文件中,生成的jar文件较大 Copy required libraries into a sub-folder next to the generated jar:将需要的jar包拷贝到一个子文件夹中
%title插图%num

发送到服务器

以上两个文件导成功后,登录自己的云服务器,并把上面的war文件通过远程桌面或者第三方软件(qq、微信、网盘等),从本地主机发送到服务器上,并把war文件放在tomcat中webapps目录下,并解压;把jar文件,放在c盘->Administeration目录下即可。

调试,运行。

首先,打开cmd,然后:输入:java -jar xxxx.jar (xxx代表的是导出的jar文件名称)。保证没有报错即可。

然后,通过网络调试助手,建立TCP的client。然后输入服务器的静态IP地址和端口号(在java文件中设置好的端口号)。检测是否是否能服务器连接成功。

*后,连接成功后,打开服务器的tomcat,在服务器的浏览器端输入:

http://47.93.7.53:8080/demo_bridge0807
http://服务器的静态IP:8080/war文件的名称

以上步骤就完成了环境搭建。

欢迎大家批评指教!

多用户同时登陆远程服务器设置方法

首先,要服务器开启远程桌面连接:

计算机—属性—远程设置—勾选“允许运行任意版本远程桌面的计算机连接(较不安全)”

%title插图%num

接下来,修改远程桌面的连接数,具体修改方法如下:

控制面板→类别选择”小图标”→管理工具→远程桌面服务→远程桌面会话主机设置→把”限制每个用户只能进行一个会话”勾选去掉,操作图如下:

%title插图%num

然后双击连接中的RDP-Tcp→网络适配器→*大连接数修改为2此时的同时远程桌面连接的数量即设置为2。

如果只需要2个用户同时登陆,上面的设置已经可以了。

%title插图%num

接下来是调整超过2个连接数的的设置方法:需要安装终端服务器(未测试)

*步.在开始->运行命令栏中输入 gpedit.msc

在组策略中依次打开“计算机配置→策略→管理模板→Windows 组件→远程桌面服务→远程桌面会话主机→连接”中,选择“限制连接数量”进行配置。

第二步.在角色里增加远程桌面服务。

右击我的电脑,选择管理,在服务器管理→角色中添加远程桌面角色,一直下一步,然后重启服务器。

设置服务器上用户允许远程访问及修改密码

使用navicat访问服务器上刚安装的mysql时,是不允许访问的,需要在服务器上设置用户允许远程访问(修改mysql.user相关用户的host字段值)

%title插图%num

mysql5.7的密码修改方式有不同,需要注意

%title插图%num

原因在于密码字段由“password” 改为了 “authentication_string”

ubuntu创建新用户并设置samba服务

1.新建自己的用户并查看
sudo useradd -m -s /bin/bash 用户名
sudo passwd 用户名
ls /home -t

或者:

#1创建一个新的普通用户:(-m:表示用户,-s表示shell环境)
sudo useradd -m guest -s /bin/bash
#2.新普通用户设置密码,请按系统提示输入两次密码:
sudo passwd guest
#3.可为普通用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题
sudo adduser guest sudo
#4.用户从root用户切换到普通用户,命令如下:
su guest

2.给新用户添加sudo权限
sudo vim /etc/sudoers
#找到:root ALL=(ALL:ALL)ALL
#添加: 用户名 ALL=(ALL:ALL)ALL

3.删除用户:
执行userdel命令:sudo userdel 用户名
删除用户目录命令:sudo rm -rf 用户名
删除用户权限相关配置:删除或者注释掉/etc/sudoers中关于要删除用户的配置,否则无法再次创建同名用户。
4.samba共享的设置 可以让windows访问linux系统的共享文件
安装:sudo apt-get install samba
修改配置文件:sudo vim /etc/samba/smb.conf
[test] #自定义共享名称
comment = This is share software #共享描述
path = /home/testfile #共享目录路径
available = yes
browseable = yes #设置共享是否可浏览,如果no就表示隐藏,需要通过IP+共享名称进行访问
public = no #设置共享是否允许guest账户访问
writeable = yes  #设置共享是否具有可写权限
guest = no #功能同public 一样
force user = test
force group = test
create mask = 0777 #创建的文件目录为 777
directory mask = 0777 #创建的文件目录为 777

5.添加访问共享用户并设置共享密码:sudo smbpasswd -a 用户名
6.重启samba服务:sudo service smbd restart
7.完成以上可通过\\ip访问你服务器文件

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