服务器搭建的函数
A. nodejs搭建web服务器就是这么简单!
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。(nodejs官网上的介绍),正如官网上介绍的那样,nodejs确实很牛!怎么个牛法?看看下面的代码就知道了。
//引入http模块
var http = require("http");
//设置主机名
var hostName = 飗.0.0.1'
//设置端口
var port = 8080;
//创建服务
var server = http.createServer(function(req,res){
res.setHeader('Content-Type','text/plain');
res.end("hello nodejs");
});
server.listen(port,hostName,function(){
console.log(`服务器运行在http://${hostName}:${port}`);
});
短短几行代码就把一个简单的web服务器搭建完成了,为了验证效果,我们在浏览器请求,结果如下
运行成功!
到此为止,一个web服务器就建立成功了! 没错就是这么简单,然后我们就可以写个html界面愉快的玩耍了,哈哈哈!果断的写了一个html页面来请求一下我们的web服务器。
代码简单,点击p获取数据并将服务器返回的数据展示。好了,我们运行一下demo.html文件,我擦来!居然出现了……
很明显,通过jquery请求不到数据,这是因为跨域请求的原因。我们的web服务器并不支持跨域请求,所以报错了。解决方式:在服务器的响应头文件里加上如下代码:
再次重启服务器,运行demo.html,显示结果很是令人欣喜!
通常请求服务器都会拼接参数的,最常用的就是get请求,post请求。很明显,我们现在的代码还不能支持。express框架很好的封装了nodejs的http模块,使我们用起来非常的简单。
引入express :$ cnpm install express –save
使用方式变化不大,通过express()方法开启服务,然后在通过get方法来设置匹配参数的路由,通过在回调函数的req中可以获取请求参数和地址。post请求也是类似,不过有不同的是,post请求在获取参数的时候要引入body-parser 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
运行结果:
完整的get以及post请求就是以上了。下一篇文章会结果fs文件模块介绍http是如何返回文件的,敬请期待!!
学习从来不是一个人的事情,要有个相互监督的伙伴,想要学习或交流前端问题的小伙伴可以私信“学习”小明加群获取2019web前端最新入门资料,一起学习,一起成长!
B. 如何用nodejs搭建web服务器
主要解决两个问题,1是静态资源的处理,2是动态资源的路由。
静态资源在node.js里的意思是不变的,如图片、前端js、css、html页面等。
动态资源我们一般指aspx页面,ashx页面,asp页面,jsp页面,php页面等,而node.js里其实没动态资源这一说,它对请求的处理都是由回调方法完成的,在我实现的httserver里,借鉴了ashx的写法,把处理请求的js文件看作动态资源。
首先实现一个处理静态资源的函数,其实就是对本地文件的读取操作,这个方法已满足了上面说的静态资源的处理。
C. python怎么建立socket服务端
socket服务器再细分可分为多种了,tcp,udp,websocket,都是调用socket模块,但是具体实现起来有一点细微的差别
先给出一个tcp和udp通过socket协议实现的聊天室的例子
python聊天室(python2.7版本):
都是分别运行server.py和client.py,就可以进行通讯了。
TCP版本:
socket-tcp-server.py(服务端):
#-*-encoding:utf-8-*-
#socket.getaddrinfo(host,port,family=0,socktype=0,proto=0,flags=0)
#根据给定的参数host/port,相应的转换成一个包含用于创建socket对象的五元组,
#参数host为域名,以字符串形式给出代表一个IPV4/IPV6地址或者None.
#参数port如果字符串形式就代表一个服务名,比如“http”"ftp""email"等,或者为数字,或者为None
#参数family为地主族,可以为AF_INET,AF_INET6,AF_UNIX.
#参数socktype可以为SOCK_STREAM(TCP)或者SOCK_DGRAM(UDP)
#参数proto通常为0可以直接忽略
#参数flags为AI_*的组合,比如AI_NUMERICHOST,它会影响函数的返回值
#附注:给参数host,port传递None时建立在C基础,通过传递NULL。
#该函数返回一个五元组(family,socktype,proto,canonname,sockaddr),同时第五个参数sockaddr也是一个二元组(address,port)
#更多的方法及链接请访问
#Echoserverprogram
fromsocketimport*
importsys
importthreading
fromtimeimportctime
fromtimeimportlocaltime
importtraceback
importtime
importsubprocess
reload(sys)
sys.setdefaultencoding("utf8")
HOST='127.0.0.1'
PORT=8555#设置侦听端口
BUFSIZ=1024
classTcpServer():
def__init__(self):
self.ADDR=(HOST,PORT)
try:
self.sock=socket(AF_INET,SOCK_STREAM)
print'%disopen'%PORT
self.sock.bind(self.ADDR)
self.sock.listen(5)
#设置退出条件
self.STOP_CHAT=False
#所有监听的客户端
self.clients={}
self.thrs={}
self.stops=[]
exceptException,e:
print"%disdown"%PORT
returnFalse
defIsOpen(ip,port):
s=socket(AF_INET,SOCK_STREAM)
try:
s.connect((ip,int(port)))
#s.shutdown(2)
#利用shutdown()函数使socket双向数据传输变为单向数据传输。shutdown()需要一个单独的参数,
#该参数表示s了如何关闭socket。具体为:0表示禁止将来读;1表示禁止将来写;2表示禁止将来读和写。
print'%disopen'%port
returnTrue
except:
print'%disdown'%port
returnFalse
deflisten_client(self):
whilenotself.STOP_CHAT:
print(u'等待接入,侦听端口:%d'%(PORT))
self.tcpClientSock,self.addr=self.sock.accept()
print(u'接受连接,客户端地址:',self.addr)
address=self.addr
#将建立的clientsocket链接放到列表self.clients中
self.clients[address]=self.tcpClientSock
#分别将每个建立的链接放入进程中,接收且分发消息
self.thrs[address]=threading.Thread(target=self.readmsg,args=[address])
self.thrs[address].start()
time.sleep(0.5)defreadmsg(self,address):
#如果地址不存在,则返回False
ifaddressnotinself.clients:
returnFalse
#得到发送消息的clientsocket
client=self.clients[address]
whileTrue:
try:
#获取到消息内容data
data=client.recv(BUFSIZ)
except:
print(e)
self.close_client(address)
break
ifnotdata:
break
#python3使用bytes,所以要进行编码
#s='%s发送给我的信息是:[%s]%s'%(addr[0],ctime(),data.decode('utf8'))
#对日期进行一下格式化
ISOTIMEFORMAT='%Y-%m-%d%X'
stime=time.strftime(ISOTIMEFORMAT,localtime())
s=u'%s发送给我的信息是:%s'%(str(address),data.decode('utf8'))
#将获得的消息分发给链接中的clientsocket
forkinself.clients:
self.clients[k].send(s.encode('utf8'))
self.clients[k].sendall('sendall:'+s.encode('utf8'))
printstr(k)
print([stime],':',data.decode('utf8'))
#如果输入quit(忽略大小写),则程序退出
STOP_CHAT=(data.decode('utf8').upper()=="QUIT")
ifSTOP_CHAT:
print"quit"
self.close_client(address)
print"alreadyquit"
break
defclose_client(self,address):
try:
client=self.clients.pop(address)
self.stops.append(address)
client.close()
forkinself.clients:
self.clients[k].send(str(address)+u"已经离开了")
except:
pass
print(str(address)+u'已经退出')
if__name__=='__main__':
tserver=TcpServer()
tserver.listen_client()
——————————华丽的分割线——————————
socket-tcp-client.py(客户端):
#-*-encoding:utf-8-*-
fromsocketimport*
importsys
importthreading
importtime
reload(sys)
sys.setdefaultencoding("utf8")
#测试,连接本机
HOST='127.0.0.1'
#设置侦听端口
PORT=8555
BUFSIZ=1024
classTcpClient:
ADDR=(HOST,PORT)
def__init__(self):
self.HOST=HOST
self.PORT=PORT
self.BUFSIZ=BUFSIZ
#创建socket连接
self.client=socket(AF_INET,SOCK_STREAM)
self.client.connect(self.ADDR)
#起一个线程,监听接收的信息
self.trecv=threading.Thread(target=self.recvmsg)
self.trecv.start()
defsendmsg(self):
#循环发送聊天消息,如果socket连接存在则一直循环,发送quit时关闭链接
whileself.client.connect_ex(self.ADDR):
data=raw_input('>:')
ifnotdata:
break
self.client.send(data.encode('utf8'))
print(u'发送信息到%s:%s'%(self.HOST,data))
ifdata.upper()=="QUIT":
self.client.close()
printu"已关闭"
break
defrecvmsg(self):
#接收消息,如果链接一直存在,则持续监听接收消息
try:
whileself.client.connect_ex(self.ADDR):
data=self.client.recv(self.BUFSIZ)
print(u'从%s收到信息:%s'%(self.HOST,data.decode('utf8')))
exceptException,e:
printstr(e)
if__name__=='__main__':
client=TcpClient()
client.sendmsg()
UDP版本:
socket-udp-server.py
#-*-coding:utf8-*-
importsys
importtime
importtraceback
importthreading
reload(sys)
sys.setdefaultencoding('utf-8')
importsocket
importtraceback
HOST="127.0.0.1"
PORT=9555
CHECK_PERIOD=20
CHECK_TIMEOUT=15
classUdpServer(object):
def__init__(self):
self.clients=[]
self.beats={}
self.ADDR=(HOST,PORT)
try:
self.sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
self.sock.bind(self.ADDR)#绑定同一个域名下的所有机器
self.beattrs=threading.Thread(target=self.checkheartbeat)
self.beattrs.start()
exceptException,e:
traceback.print_exc()
returnFalse
deflisten_client(self):
whileTrue:
time.sleep(0.5)
print"hohohohohoo"
try:
recvData,address=self.sock.recvfrom(2048)
ifnotrecvData:
self.close_client(address)
break
ifaddressinself.clients:
senddata=u"%s发送给我的信息是:%s"%(str(address),recvData.decode('utf8'))
ifrecvData.upper()=="QUIT":
self.close_client(address)
ifrecvData=="HEARTBEAT":
self.heartbeat(address)
continue
else:
self.clients.append(address)
senddata=u"%s发送给我的信息是:%s"%(str(address),u'进入了聊天室')
forcinself.clients:
try:
self.sock.sendto(senddata,c)
exceptException,e:
printstr(e)
self.close_client(c)
exceptException,e:
#traceback.print_exc()
printstr(e)
pass
defheartbeat(self,address):
self.beats[address]=time.time()
defcheckheartbeat(self):
whileTrue:
print"checkheartbeat"
printself.beats
try:
forcinself.clients:
printtime.time()
printself.beats[c]
ifself.beats[c]+CHECK_TIMEOUT<time.time():
printu"%s心跳超时,连接已经断开"%str(c)
self.close_client(c)
else:
printu"checkp%s,没有断开"%str(c)
exceptException,e:
traceback.print_exc()
printstr(e)
pass
time.sleep(CHECK_PERIOD)
defclose_client(self,address):
try:
ifaddressinself.clients:
self.clients.remove(address)
ifself.beats.has_key(address):
delself.beats[address]
printself.clients
forcinself.clients:
self.sock.sendto(u'%s已经离开了'%str(address),c)
print(str(address)+u'已经退出')
exceptException,e:
printstr(e)
raise
if__name__=="__main__":
udpServer=UdpServer()
udpServer.listen_client()
——————————华丽的分割线——————————
socket-udp-client.py:
#-*-coding:utf8-*-
importsys
importthreading
importtime
reload(sys)
sys.setdefaultencoding('utf-8')
importsocket
HOST="127.0.0.1"
PORT=9555
#BEAT_PORT=43278
BEAT_PERIOD=5
classUdpClient(object):
def__init__(self):
self.clientsock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
self.HOST=HOST
self.ADDR=(HOST,PORT)
self.clientsock.sendto(u'请求建立链接',self.ADDR)
self.recvtrs=threading.Thread(target=self.recvmsg)
self.recvtrs.start()
self.hearttrs=threading.Thread(target=self.heartbeat)
self.hearttrs.start()
defsendmsg(self):
whileTrue:
data=raw_input(">:")
ifnotdata:
break
self.clientsock.sendto(data.encode('utf-8'),self.ADDR)
ifdata.upper()=='QUIT':
self.clientsock.close()
break
defheartbeat(self):
whileTrue:
self.clientsock.sendto('HEARTBEAT',self.ADDR)
time.sleep(BEAT_PERIOD)
defrecvmsg(self):
whileTrue:
recvData,addr=self.clientsock.recvfrom(1024)
ifnotrecvData:
break
print(u'从%s收到信息:%s'%(self.HOST,recvData.decode('utf8')))if__name__=="__main__":
udpClient=UdpClient()
udpClient.sendmsg()
D. 自己如何搭建服务器
1、打开控制面板,选择并进入“程序”,双击“打开或关闭Windows服务”,在弹出的窗口中选择“Internet信息服务”下面所有地选项,点击确定后,开始更新服务。
2、更新完成后,打开浏览器,输入“localhost/”回车,如果此时出现IIS7欢迎界面,说明Web服务器已经搭建成功。
3、当web服务器搭建成功后,我们下一步所要做的就是把我们开发的网站安装到Web服务器的目录中。一般情况下,当Web服务器安装完成后,会创建路径“%系统根目录%inetpub/wwwroot”蚂宽,将我们开发的网站COPY到该路径下。即可实现本地访问该网站。
4、设置防火墙,让局域网当其它计算机也能访问本地网站资源。具体方法:打开控制面板,选择“系统和安全”,点击“允许程序通过Windows防火墙”,在弹出的对话框中勾选“万维网服务HTTP”右侧的两个复选框,最后点击确定退出。
5、在局域网中其它计算机上,打开浏览器,输入 “Web服务器的IP地址/”按回车键,就可以访问服务器上凳敏的资源”。经过以上步骤的设置,局域网中的其它用户就可以通过浏览器访问你所共享的web资源闷粗亮了!
(4)服务器搭建的函数扩展阅读:
入门级服务器所连的终端比较有限(通常为20台左右),况且在稳定性、可扩展性以及容错冗余性能较差,仅适用于没有大型数据库数据交换、日常工作网络流量不大,无需长期不间断开机的小型企业。
不过要说明的一点就是目前有的比较大型的服务器开发、生产厂商在后面我们要讲的企业级服务器中也划分出几个档次,其中最低档的一个企业级服务器档次就是称之为"入门级企业级服务器",这里所讲的入门级并不是与我们上面所讲的"入门级"具有相同的含义,不过这种划分的还是比较少。
还有一点就是,这种服务器一般采用Intel的专用服务器CPU芯片,是基于Intel架构(俗称"IA结构")的,当然这并不是一种硬性的标准规定,而是由于服务器的应用层次需要和价位的限制。
E. 网站服务器的搭建方法是怎样的
1.本地搭建测试服务器-IIS如果读者现在正在设计网站,为了测试,要在自己的电脑上通过IP访问本地站点才能达到最佳的测试效果。因此会涉及安装IIS的相关内容。但是,Windows7系统默认是没有安装IIS管理工具的,需要调用IIS的安装程序进行安装。
(1)首先确认本地计算机是否安装IIS打开控制面板找到管理工具,如图4所示。确认管理工具列表里蔽备面没有IIS,然后进入IIS安装的步骤,如图5所示。1)首先,单击开始→控制面板。
2)在控制面板里找到并单击:程序和功能,如果你找不到的话,可以更改一个查看方式,如图6所示。3)打开后,会看到很多程序,这些都是系统安装的第三方程序,而要添加系统自带的功能程序,所以在左上角找到并单击:打开或关闭Windows功能,如图7所示。
4)系统会检索一会,很快就显示出来了,勾选就是系统已经打开的功能了,找到Internet信息服务,并在其前面的复选框打钩,这个钩是灰色的,是因为默认情况下Internet信息服务里面的功能并没有全部选择上的意思,当然,可以单击其前面的+号细看里面的各个子功能缓困,如图8所示。5)单击“确定”按钮后,系统就会配置并添加该功能,如图9所示。6)完成之后是没有提示的,返回程序和功能界面。
下面来看看是否添加了该功能,如图10所示。
执行:开始→管理工具,找到Internet信息服务(IIS)管理器,就证明已经添加了该功能了。
配置IIS:
1)安装好了后,当然还要做些设置的,为了以后更方便使用,主要修改三个地方:
①网站名称。
②物理路径。
③端口。2)首先,我们打开IIS,如图11所示。边框的+号点开。找到:DefaultWebSite,单击右键。执行管理网站→高级设置,如图12所示。3)在高级设置里,网站名称和IP端口都是灰色的,无法更改。我们先来修改网站的物理路径吧,如图13所示。
4)选择好要设置的路径后,再确定,会返回上一层,如图14所示。5)现在再来修改网站名称,在DefaultWebSite处单击右键,选择:重命名。输入要用的名字,如图15所示。6)网站名称也可以是中文的。
7)最后,来修改IP地址和端口,先说明两点:
①网站的默认端口是:80,如果不是有特别要求的话,可以选择默认即可。
②IP地址,如果服务器是通过防火墙(或者路由器)直接发布到外网给客户访问的话,也是不用在这里设置IP地址都可以的。但我们现在是在内网测试,同事之间访问(即没有做商品映射)的,所以这里应该要设置一下IP地址。操作,在网站名称那单击右键,选择:编辑绑定,如图17所示。8)然后选中并编辑(图18)。
9)编辑的内容不多,单击“全部未分配”右边的下拉三角形。并选择本地计算机的IP地址,在本例中为:192.168.0.178,如图19所示。3.申请网站公网空间服务器给网站申请完地址和名称后,就需要为网站在网络上申请出相应的空间。网站是建立在网络服务器上的一组电脑文件,它需要占据一定的硬盘空间,这就是一个网站所需的网站空间。一般来说,一个企业网站的基本网页文件和网页图片大概需要100Mb空间,加上产品照片和各种介绍性页面,一般在500Mb以下。另外,企业需要存放反馈信息和备用文件的空间。所以企业网站总共需要500Mb~1000Mb的网站空间(即虚拟主机空间)。
想建立一个网站,就要选择适合自身条件的网站空间。目前主流的有4种网站空间选择形式。
1)购买个人服务器:服务器空间大小可根据需要增减服务器硬盘空间,然后选择好ISP商,将服务器接入Internet,将网页内容上传到服务器中,这样就可以访问网站了。服务器管理一般有两种办法,即服务器托管和专线接入维护。
2)租用专用服务器:就是建立一个专用的服务器,该服务器只为用户使用,用户有完全的管理权和控制权。中小企业用户适合于这种vps服务器,但个人用户一般不适合这种服务,因为其费用很高。
3)使用虚拟主机:这种技术的目的是让多个用户共用一个服务器,但是对宏哪毁于每一个用户而言,感觉不到其他用户的存在。在此情况下该服务器要为每一个用户建立一个域名、一个IP地址、一定大小的硬盘空间、各自独立的服务。这一技术参考了操作系统中虚拟内存的思想,使得有限的资源可以满足较多的需求,且使需求各自独立,互不影响。由于这种方式中多个用户共同使用一个服务器,所以价格是租用专用服务器的十几分之一,而且可以让用户有很大的管理权和控制权。可以建立邮件系统的(数量上有限制)个人FTP、WWW站点、提供CGI支持等。
4)免费网站空间:这种服务是免费的。用户加入该ISP后,该ISP商会为用户提供相应的免费服务,不过权限会受到很大限制,很多操作都不能够使用。
用户可以根据需要来选择正确的方式。如果想架构WWW网站,那么只要加入一个ISP就可以得到一个WWW网站。如果想尝试做网管,则可以考虑申请虚拟主机服务,而且现在租用虚拟主机的费用并不高。如果想建立很专业的商业网站,建议最好租用服务器或购买自己的服务器。
下面以阿里云为例讲解怎么购买网络主机空间。
在地址栏输入:/hosting/打开后如图20所示,选择相应的服务。
选择好后可以看到服务器具体参数。
确认购买此款主机,单击立即购买。进入网络付款的状态。网络付款方式可以选择支付宝和各家银行的网银等方式进行网站。
网站空间成功拿到以后,如何把文件传上去。让网页文件正确的显示在远程主机上。这个一般使用FTP上传方式实现。
4.使用FTP工具上传网页购买了虚拟主机后,可以从主机商那边获得主机空间的FTP地址、用户名和密码。通过FTP地址和密码,就可以开始上传网站了。FTP上传工具可使用FlashFXP工具。下载解压后并打开后,出现界面如图24所示:选择菜单上的“站点”->“站点管理器”,如图25所示:单击“新建站点”按钮,在新出的窗口输入网站名称,如输入“我的网站”,单击“确定”按钮,如图26所示。建立新站点后,下一步需要做的是输入“IP地址”“用户名称”“密码”,其他设置不需要填写,如图27所示,然后单击“连接”按钮。IP地址、用户名称、密码正确的话,就可以连接到网站空间了:
传送完毕后可以再浏览器上进行页面刷新,即可看到打开的页面或者进行内容更新的页面。
F. 如何在客户端上建立一个Socket与服务器端连接,包括连接的函数
【zhuokai】:Socket.RemoteAddress Socket.RemoteHost服务器端可以给连接上的客户端发送测试数据,一定时间内回收到客户端反应的可认为在线.【zhuokai】:请参考: http://www.programfan.com/article/showarticle.asp?id=2289【ylsl917】:我用的API,不是用的控件,我贴出代码来,麻烦大家给我修改一下吧procere TForm1.OnWork1Accept(var message: TMessage);Var Client_Addr: TSockAddr; ClientLen: Integer; s:string;begin FillChar(Client_Addr,Sizeof(Client_Addr),0); ClientLen := Sizeof(Client_Addr); Conn_Socket := Accept(Server_Socket,@Client_Addr,@ClientLen);{ 能不能在这里判断出建立的这个 Comm_Socket 是哪台机器建立的,其IP是多少?} //读取/关闭 事件 WSAAsyncSelect(Conn_Socket, Form1.Handle, WM_WORK1_READ, FD_READ or FD_CLOSE);end;【ylsl917】:解决了,只要 Client_Addr.sin_addr.S_addr 转换成字符串IP就行了 function IPIntToStr(I:Integer):String; var sinaddr:in_addr; begin sinaddr.S_addr:=i; result:=String(inet_ntoa(sinaddr)); end;【ylsl917】:还有谁上来说说怎么做到长连接!!!【wj19781215】:自己定义活动包探测客户端是否在线,不要用windows的全局活动包检测,至于长连接就是tcp哦。【ylsl917】:谢谢楼上的 还有一个问题啊 我用API实现socket 能不能让程序既是服务器端,又是客户端 【zhuokai】: 我用API实现socket 能不能让程序既是服务器端,又是客户端 意思是在同一个程序里客户端连接服务器?可以的,多个线程【wj19781215】:用getsockname和getpeername【abcdefgdeng】:在socketserver的onAccept事件中用Socket.RemoteAddress读取【ylsl917】: 我用API实现socket 能不能让程序既是服务器端,又是客户端 意思是在同一个程序里客户端连接服务器?可以的,多个线程