伺服器搭建的函數
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 能不能讓程序既是伺服器端,又是客戶端 意思是在同一個程序里客戶端連接伺服器?可以的,多個線程