搭建text伺服器
1. 魔獸世界伺服器架設(主要是幾個熟識的朋友一起玩,並不打算對外開放)
魔獸私服伺服器架設完全資料①
一.伺服器安裝
1.首先下載伺服器端wowWDDG_Identity
2.安裝,一直按照說明,下一步就可以,注意硬碟空間不要小於3.5G
3.裝完以後他會提醒你選擇wow目錄,選擇你安裝的客戶端目錄即可。或者運行/maps/BatCreator.exe也可以
4.然後運行,開始解壓地圖,注意第一個選擇Y,第二個選擇N
5.在安裝伺服器端的目錄下建立accounts目錄,運行Account Creator.exe建立帳號.
6.運行IP-Configuration.exe定義自己的ip和一些伺服器屬性,包括回血,回魔速度,伺服器類型,自動保存等.界面上的英文很好懂,真的不懂就查查金山詞霸好了,呵呵!
7.最後運行伺服器即可。
二.伺服器常用設置
很多伺服器新人出生錢的問題(那個出來可以賣10銀幣變10金幣的改法):
修改scripts/items.scp
找到[item 40000]
class=12
level=1
material=-1
model=3331
name=10 Silver Certificate 修改為10 GOLD Certificate
quality=1
buyprice=1000 修改為100000
sellprice=1000 修改為100000
stackable=100
1.魔獸私服伺服器架設完全資料經驗值獲得倍率修改
修改文件:/scripts/emu.conf, /scripts/startup.tcl
修改步驟:
(1) emu.conf中修改save_text_ppoints=yes
(2) startup.tcl中set xp [expr { 20+((($victim_level/4)+5)*$victim_level)*倍率 }],倍率是一個你想獲得經驗值得倍率,應該是數字
2.怪物掉寶率修改
修改文件:/scripts/creatures.scp
(1) creatures.scp 文件里的loot=xxx xxx
前面一個數是物品代碼,後面一個就是爆率
比如loot=3300 22.620001 就是代碼為3300的物品 爆率是22.620001
其中3300是代表/scripts/items.scp中的物品代碼
3.地圖上增加新NPC的方法
(1) 需要用GM帳號進入游戲到需要增加新NPC的地點
(2) addspawn 99999 在GM站立的地方安放一個NPC的刷新點。
(3) .setspawndist 2 4 該刷新點刷新的怪物自主移動范圍為2-4 yards
(4) .setspawntime 60 300 該刷新點刷新怪物的時間間隔為 60-300秒。
(5) 出現小人(既刷新點).等幾秒鍾 出現新NPC
(6) 清除刷新點,游戲里選定你要刪除的小人,輸入.del即可
4.如何備份帳號信息
(1) 備份accounts文件夾下的所有帳戶文件
(2) 備份saves文件夾下的players.save
5.騎乘指南
(1) 用GM帳號進入游戲
(2) .add xxx 其中xxx為坐騎代碼(附C)
(3) .learn xxx 其中xxx為技能代碼(附C)
6.魔獸私服如何學習穿皮甲,鏈甲,板甲
(1) 用GM帳號進入游戲
(2) 選中需要學習穿裝技能的人物
(3) 然後輸入 .learnsk xxx 其中xxx代表需要學習的技能代碼
也可以修改用戶的存檔.這個在下面的文件分析中會提到的.
(4) 布甲技能代碼 415 皮甲技能代碼 414 鏈甲技能代碼 413 板甲技能代碼 293
7.如何瞬移去指定地點
(1) 用GM帳號進入游戲
(2) .gotrigger XXX 這里XXX是個數字,代表地區代碼(附D)
8.如何增加各種物品到背包中
(1) 用GM帳號進入游戲
(2) .add xxx 這里xxx是一些數字, 代表各種物品代碼(附B)
7.如何迅速升級
(1) 用GM帳號進入游戲
(2) 要先點選需要升級的人物
(3) .setxp xxx 這里xxx是一些數字, 代表需要增加的經驗值
(4) 或者 .setlevel xx 這里xxx是一些數字, 代表你想要的級數
8.如何刷錢
(1) 用GM帳號進入游戲
(2) .add 944 1000 是N個杖~賣到商店2000+金
9.如何修改各物品價格
修改文件:/scripts/items.scp
(1) 在items.scp文件中修改物品的sellprice=即可
提示:你可以用UltraEdit軟體打開,因為可以用正則表達式進行查找
10.如何修改個技能學習的價格
修改文件:/scripts/spellcost.scp
(1)在spellcost.scp文件中修改price即可
提示:你可以用UltraEdit軟體打開,因為可以用正則表達式進行替換
11.如何修改人物的屬性
修改文件:/saves/players.save
(1) 查找需要修改的人物名稱 NAME=人物名稱
(2) 修改你需要修改的數據即可(那些英文很簡單的)
注意: 修改時需要先關閉伺服器端,修改好以後再啟動伺服器即可
三.伺服器端文件分析
/accounts/ 放置所有帳號
/logs/ 放置伺服器的運行記錄
/saves/ 放置伺服器端的人物保存,地圖保存等記錄
/scripts/ 放置一些伺服器的腳本文件
/maps/ 放置了伺服器端的地圖
/saves/players.save 這個文件中主要是保存游戲中各個人物的信息
文件中的部分內容解釋
[OBJECT]
GUID=0720C89
LEVEL=42 //人物等級
XYZ=-3623.293701 -2347.990967 91.682785 4.186294 //人物所在的地圖坐標
MAXHEALTH=1494 //生命值
MAXPOWERS=2212 1000 0 500 0 //最大能量
SIZE=1.300000 //人物形狀大小
XP=28238 //經驗值多少
MONEY=7087 //所擁有的錢多少,以銅幣為單位
NAME=Bloodtears //人物名稱,這個可以作為修改指定人物的索引
RACE=6 //在/scripts/defines.scp文件中對種族的宏定義,這里的6表示種族牛頭人(tauren)
CLASS=11 //在/scripts/defines.scp文件中對職業的宏定義,這里的11表示職業德魯伊(druid)
BINDPOINT=1 215 -2917.580078 -257.980011 52.996799 //游戲中你綁定的地點,也就是你死後靈魂出現的地點
SPELL=6478 0 //你掌握的魔法
...
SKILL=415 1 1 //你掌握的技能,包括能夠穿裝備的技能! 這里的415代表能夠穿布甲.
//你可以添加SKILL=413 1 1使該人物能夠穿鏈甲,而414(布甲),293(板甲),412(盾牌). 其他類推即可.
...
QUEST=5723 0 0 0 0 0 //你的任務代碼
/scripts/areatriggers.scp 這個文件中主要是地區的代碼
文件中的內容典型的為:
[areatrigger 1740] //地區代碼為1740
pos=1 -7874.180176 -1806.300049 -271.459015 //地圖中的坐標
name=The Marshlands - Un'goro Crater //地區名稱
/scripts/classes.scp 這個文件中主要是定義各個種族和職業的原始屬性
如果你要修改一個種族或一個職業的初始屬性,以及人物出生時攜帶者的物品,你可以修改這個文件即可.
本文件中都有詳細的英文注釋,只要懂英語的應該可以看懂的,我在這里不再羅嗦了.
這里只舉兩個簡單的例子,拋磚引玉...
目標1:使戰士出生時就可以穿板甲
步驟:
(1) 找到[class #CLASS_WARRIOR]條目,該條目下面的數據代表戰士出生時的初始屬性
(2) 找到//Armor Proficiencies條目,該條目下面的數據代表戰士出生時掌握的裝備技能.
(3) 你可以找到skill=415 1 1 // Cloth
skill=414 1 1 // Leather 代表戰士出生時就可以穿布甲和皮甲
(4) 添加 skill=413 1 1 //鏈甲
skill=293 1 1 //板甲
skill=412 1 1 //盾牌 來使戰士出生時就可以使用鏈甲,板甲,盾牌
目標2:使人族的戰士出生時攜帶一匹馬
步驟:
(1) 找到[startitems #RACE_HUMAN #CLASS_WARRIOR]條目,該條目下的數據代表人族戰士出生時攜帶的物品,初始魔法和技能
(2) 其中item=26 25 代表在人物的第26個位置放置代碼為25的物品,代碼為25的物品你可以在items.scp中查到
(3) 添加item=28 13334 //代碼13334代表Green Skeletal Warhorse
/scripts/creatures.scp 這個文件中定義地圖上所有NPC的屬性
如果你要添加修改NPC,你可以修改這個文件即可.包括你可以添加一個賣藍色裝備的NPC,也可以修改某NPC的裝備爆率以及傷害值等一系列屬性.
文件中的典型內容為:
[creature 6] //NPC的代碼,如你可以在.addspawn 6 來添加該NPC到指定地點
name=Kobold Vermin //NPC的名字
attack=1986 2185 //NPC的攻擊傷害值
bounding_radius=0.561000 //綁定范圍,也就是說該NPC在0.561yards范圍內將攻擊玩家
combat_reach=7.56 //戰斗范圍,也就是在該NPC攻擊玩家的時候,只有當玩家逃出7.56yards范圍外才會停止攻擊
maxhealth=57 //血多少
maxmana=45 //魔法值多少
speed=0.93 //速度
loot=2770 0.01 //對代碼為2770的物品爆率為0.01(1%)
舉例
目標1:使上面的NPC能夠爆Elemental Mage Staff(元素之杖,法師的極品杖),爆率為0.05(5%)
步驟:
(1) 找到[creature 6]條目
(2) 添加loot=944 0.05 即可 //代碼944代表items.scp文件中的定義的元素之杖
目標2:在游戲地圖上添加賣靈魂之石的NPC
步驟:
(1) 在該文件的最後添加以下代碼:
[creature 3456789]
name=Soul Shard Seller
attack=1613 1774
bounding_radius=1.000000
combat_reach=8.00
damage=32 42
flags1=08400046
guild=Soul Shard Seller
level=30 30
maxhealth=757
maxmana=605
model=9261
speed=1.35
type=7
npcflags=4
faction=35
family=7 //以上是對該NPC的一般屬性的定義
sell=6265 //這個是主要的,代碼6265代表靈魂之石,在items.scp中定義
(2) 魔獸私服伺服器用GM帳號進入游戲,到達需要添加NPC的地點
(3) 輸入 .addspawn 3456789 即可
/scripts/defines.scp 這個文件中主要是一些宏定義,只要在需要的時候去查就可以了.
舉例:
(1) 在/save/players.save文件中有race=4的條目
(2) 在/scripts/defines.scp文件中找到// races ---------條目
(3) #define RACE_NIGHT_ELF 4 就是說race=4 是夜精靈族
/scripts/emu.conf 這個文件主要是伺服器的一些基本配置,包括回血,回魔速度,自動保存時間設置.
你可以直接修改這個文件修改伺服器的一些基本配置,也可以用wowWDDG_Identity自帶的的IP-Configuration.exe來修改伺服器的基本配置.
舉例:
目標:修改伺服器的可以支持1000同時在線
步驟:
(1) 找到max_players=xxx條目
(2) 修改max_players=1000即可
/scripts/items.scp 這個文件主要是對伺服器物品的定義
文件中的典型內容(部分):
[item 25] //物品的代碼
buyprice=35 //從NPC中購買的價格
class=2 // 頭飾, 這個可以中defines.scp文件中的//itemtypes---條目下查到
rability=20 //耐久度
inventorytype=21 //存貨量
level=2 //等級
name=Worn Shortsword //物品名稱
sellprice=7 //物品價格
subclass=7 // 這個可以在defines.scp文件中的//subclasses---條目下查到
/scripts/quests.scp 這個文件主要是對各個任務的描述,回報
如果你想漢化游戲中的人物的話,你可以翻譯這個文件即可.
/scripts/spellcost.scp 這個文件是對每一個技能學習的價格定義
文件中的典型內容:
[spell 8402] //技能代碼
name=Fireball Rank 7 //魔法名稱為Fireball,7級
reqspell=8401 //需要的技能點8401
price=100 //學習該技能的價格為100銅幣
附A 魔獸世界,GM命令大全
.addgo : 在你的坐標添加游戲對象
.add : 添加項目到你的背包中.
.addnpc : 添加NPC到游戲.
.del : 刪除目標NPC
.setlevel : 設置個人或NPC的等級
.setmodel : 給NPC或個人設置模型數量.
.learn : 學習魔法的數目
.save : 保存文件.
.rehash : 改寫目標.
.flag1 : 設置有毛病的標記.
.ppon : 打開pp系統.
.ppoff :關閉pp系統.
.turn : 轉動NPC面朝你.
.come : NPC來到你的位置.
.go : 去世界坐標.
.gotrigger: 進入世界范圍的位置,參數: trigger_number
.kill : 殺死選擇的NPC或個人.
.killallnpc : 殺死所有的NPC的形象.
.resurrect : 復活選擇的個人.
.setsize : 設置NPC的大小.
.setspeed : 設置NPC或個人的速度
.setflags : 設置NPC或O.G的面具. 參數: 〈ftype〉 〈flags〉
.addspawn : 添加大量的點到你的位置. 參數 : [〈npc entry〉] [〈npocs number〉]
.setnpcspawn : 添加條目和數目作成大量NPC到大量的點
.setnpcgo : 設置條目由於大量游戲目標到大量點
.setspawndist : 設置小和大距離到大量
.setspawntime : 設置小和大的時間到大量.
.setxp : 設置經驗到個人.
.paralyse : 不動和動到個人或NPC.
.setaura : 設置預兆數目
.exploration : 打開你地圖的位置.
.dismount : 卸下你.
.listsp :列出你的魔法.
.listsk :列出你的技能.
.delsp : 忘記魔法
.delsk : 忘記技能.
.info : 附近NPC的信息.
.online : 顯示在線玩家數目
.goname : 移動到輸入名字的個人或NPC.
.goguid : 移動到行會.
.targetgo : 嘗試移動到最近的玩家(定位最近的object)
.targetlink : 嘗試到連接目標OF選擇目標
.move :傳送目標.
.retcl : 重裝TCL
.rescp : 重裝 SCP.
.clearqflags : 清楚尋找標記
.bytes : for debug
.pingmm : 製造點在你的地圖
.adddyn : 測試到競技
魔獸私服伺服器架設完全資料你會了嘛
2. 如何輕松的搭建影音伺服器
你好~
在許多網吧或者區域網用戶來說,一般都有自己的影片和音樂庫,以供來在上網之餘觀看。而觀看的方式大多都是將影片和音樂文件放在一台或是幾台電腦里,用戶要觀看影片或聽音樂時,直接調用文件進行觀看。
這種方式不僅耗系統資源,而且還占網速,只有幾個人在觀看還好,要是觀看的人多了,那存放影片的電腦可就慘了。其實我們可以模仿在線電影網站一樣(即內嵌式播放),做一個自己的伺服器。
方案優點:能減輕電腦的負荷,便於用戶方便地瀏覽影片庫里的電影。
要實現在線電影網站,先行得架設流媒體伺服器,為方便啟見,筆者以Win2000Server自帶的Windows Media Service舉便說明,對其架設過程作一個簡單的介紹。
Windows Media 服務的安裝
步驟1 打開「控制面板」,雙擊「添加/刪除程序」,打開「添加/刪除程序」對話框,再在出現在對話框中單擊「添加/ 刪除Windows 組件」。
步驟2 在「Windows 組件」對話框中,將「組件」列表中的「WindowsMedia 服務」選中,單擊「下一步」。然後稍等幾秒鍾,點擊「完成」按鈕,重新啟動計算機,完成WindowsMedia 服務的安裝。
創建點播單播發布點
步驟1 依次單擊「開始」→「程序」→「管理工具」→「W i n d o w sMidea」,打開「WindowsMedia 管理器」,單擊界面左側配置伺服器功能列表中的「單播發布點」,轉到「單播發布點」界面。
步驟2 單擊界面上的「點播」按鈕可創建一個點播單播點。創建好了點播單播點後,伺服器的架設就基本完成了。
步驟3 伺服器的配置完成,打開IE 瀏覽器,在瀏覽器地址欄中輸入m m s : / /server/you-file.asx 來播放伺服器上的流媒體文件了。
注意:Server 是伺服器地址,you-file.asx 指.asx 文件路徑。
OK,簡單的流媒體伺服器架設成功!但不足之處是播放影片是在獨立的窗口中進行的。下面我們再來完善一下伺服器的功能,就是將播放器嵌入到網頁里,這樣用戶使用起來也就更方便些。
在網頁里嵌入多媒體播放器
大家都知道,在線音樂網站和在線電影網站都是通過內嵌播放器的方式來播放音樂和電影的,前提是你必須安裝播放流媒體的軟體,就能在網頁里進行播放。那它是如何實現的呢?其實很簡單,只要你稍為了解一些HTML 方式的知識就能夠做出來了。
在頁面加入流媒體的方法很簡單,只需要在網頁中做一個超級鏈接,將鏈接指向Web Server的.asx文件,這個.asx文件是我們剛才在創建單播發布點時生成的一個指針文件,它是一個純文本文件,在創建了點播單以後,就會自動創建。我們先來看一下它的文件內容:
< asx version = '3.0'>
< title> piaoying< /title>
< entry>
< ref href = 'mms://
JJXIAOYAN/piaoying.wma'/>
< /entry>
< /asx>
提示:文件中的第一行是版本信息,< entry> < /entry> 表示有多個流要播放,也就是播放列表,可以有多個。
如果我們在網頁中,加入這個文件的超鏈接,網頁就會自動調用合適的播放器來播放文件中鏈接到的流媒體文件。當然,用這種方式是要另外打開一個窗口才能播放的。要在在Web頁中嵌入播放器,首先我們要建立一個網頁文件,在此只要用到HTML中的< Object> < /Object> 可以了,其代碼如下,在網頁中的界面。
< html>
< head>
< meta http-equiv='Content-Type'
content='text/html charset=gb2312'>
< title> 網頁內嵌多媒體播放器< /title>
< /head>
< body>
< object id='MediaPlayer1' width=600
height=225
classid='CLSID:22D6F312-B0F6-11D0-94AB-
0080C74C7E95'
codebase='http://activex.microsoft.com/
activex/controls/mplayer/en/nsmp2inf.
cab#Version=5,1,52,701'
standby='Loading Microsoft? Windows? Media
Player components...'
t y p e = ' a p p l i c a t i o n / x - o l e o b j e c t '
align='middle'>
< param name='FileName' value='d:
ASFRootluyi.asx '>
< param name='ShowStatusBar' value='True'>
< p a r a m n a m e = ' D e f a u l t F r a m e '
value='mainFrame'>
< embed type='application/x-mplayer2'
pluginspage = 'http://www.microsoft.com/
Windows/MediaPlayer/'
src=' d:ASFRootluyi.asx ' align='middle'
autostart=1showcontrols=0>
< /embed>
< /object>
< /body>
< /html>
提示:其中」Width」和「Height」表示播放器窗口的大小 'FileName' 參數表示M e d i a P l a y e r 要播放的文件活或流。'ShowControls'表示在播放時是否顯示控制條。
另外我們也可以用到F r o n t P a g e 或Dreamweaver 網頁製作軟體,通過添加流媒體對象的方式來完成以上的操作。其MediaPlayer的參數很多,提供的功能也很多,由於篇幅所限,筆者在此就不再一一詳述。讀者如果需要了解更多的功能及流媒體操作的詳細內容可以參考Media Player SDK 中的相關部分。
對於網頁內嵌播放器,小生也只是作了一些簡單的介紹,如果要做一個功能齊全的影音伺服器,還要涉及到網頁製作方面的一些知識,此文也只是起到拋磚引玉的作用,希望對網吧的管理員們能起到一些幫助。
希望可以幫助到你~望採納哦~謝謝~
3. 如何搭建簡單的nodejs伺服器
//請求模塊
varlibHttp=require("http");//HTTP協議模塊
varurl=require("url")
//Web伺服器主函數,解析請求,返回Web內容
varfunWebSvr=function(req,res){
varresult="Hellonodejs";
res.writeHead(200,{"Content-Type":"text/html"});
res.write(result);
res.end();
}
//創建一個http伺服器
varwebSvr=libHttp.createServer(funWebSvr);
//開始偵聽8888埠
webSvr.listen(8888);
4. centOS-7怎麼搭建web伺服器
用Tomcat或者apache都可以
5. 怎麼在本地電腦上搭建個手機網站的伺服器呢
1,請先在你電腦上安裝IIS,這個是組建普通Web網站的前提。
2,如果你是直接撥號上網,別人就可以通過你的外網IP直接訪問你這個IIS網站了。
3,如果你是通過路由器上網,請在路由器裡面設置DMZ主機,指向你的這台機器。別人通過路由器獲取的外網IP來訪問你的網站。
4,但是速度都會非常慢。
5,你電腦關機(路由器關機)重新啟動後,獲取新的外網IP,別人必須使用新的外網IP訪問,解決辦法是,使用花生殼動態域名解析。
6. 整個網站是怎樣搭建的伺服器,以及後台前台怎樣搭配
1.創建一個站點文件夾 首先你要創建一個獨立於你的主站點的新的站點文件夾(若站點是建立在同一個伺服器上面的話),這樣你下面要做的改動才不會影響別的站點。
2.在IIS 平台創建一個新的MIME類型 先選擇WAP站點的屬性,再加入MIME類型,然後選擇HTTP Headers標簽。
在MIME Map部分,點擊File Type並且輸入以下信息:
Associated ExtensionMIME Type
wmltext/vnd.wap.wml
wmlcapplication/vnd.wap.wmlc
wbmpimage/vnd.wap.wbmp
wmlscapplication/vnd.wap.wmlscriptc
wmlstext/vnd.wap.wmlscript
wscapplication/vnd.wap/wmlscriptc
完成以後,你就可以把你的網站內容加到站點文件夾裡面了。 1.創建一個站點文件夾 首先你要創建一個獨立於你的主站點的新的站點文件夾(若站點是建立在同一個伺服器上面的話),這樣你下面要做的改動才不會影響別的站點。
2.在IIS 平台創建一個新的MIME類型 先選擇WAP站點的屬性,再加入MIME類型,然後選擇HTTP Headers標簽。
在MIME Map部分,點擊File Type並且輸入以下信息:
Associated ExtensionMIME Type
wmltext/vnd.wap.wml
wmlcapplication/vnd.wap.wmlc
wbmpimage/vnd.wap.wbmp
wmlscapplication/vnd.wap.wmlscriptc
wmlstext/vnd.wap.wmlscript
wscapplication/vnd.wap/wmlscriptc
------謝謝您的提問,只您生活愉快!
7. 如何用 python 搭建一個郵件伺服器
有人說表示只學Python沒有用,必須學會一個框架(比如Django和web.py)才能找到工作。
其實掌握一個類似於框架的高級工具是有用的,但是基礎的東西可以讓你永遠不被淘汰,不要被工具限制了自己的發展。
今天不使用框架,也不使用Python標准庫中的高級包,只使用標准庫中的socket介面寫一個Python伺服器。
框架與底層
在當今Python伺服器框架 (framework, 比如Django, Twisted, web.py等等) 橫行的時代,從底層的socket開始寫伺服器似乎是一個出力不討好的笨方法。
框架的意義在於掩蓋底層的細節,提供一套對於開發人員更加友好的API,並處理諸如MVC的布局問題。
框架允許我們快速的構建一個成型而且成熟的Python伺服器。然而,框架本身也是依賴於底層(比如socket)。對於底層socket的了解,不僅可以幫助我們更好的使用框架,更可以讓我們明白框架是如何設計的。
更進一步,如果擁有良好的底層socket編程知識和其他系統編程知識,你完全可以設計並開發一款自己的框架。
如果你可以從底層socket開始,實現一個完整的Python伺服器,支持用戶層的協議,並處理好諸如MVC(Model-View-Control)、多線程(threading)等問題,並整理出一套清晰的函數或者類,作為介面(API)呈現給用戶,你就相當於設計了一個框架。
socket介面是實際上是操作系統提供的系統調用。
socket的使用並不局限於Python語言,你可以用C或者Java來寫出同樣的socket伺服器,而所有語言使用socket的方式都類似(Apache就是使用C實現的伺服器)。
但是你不能跨語言的使用框架。
框架的好處在於幫你處理了一些細節,從而實現快速開發,但同時受到Python本身性能的限制。
我們已經看到,許多成功的網站都是利用動態語言(比如Python, Ruby或者php,比如twitter和facebook)快速開發,在網站成功之後,將代碼轉換成諸如C和JAVA這樣一些效率比較高的語言,從而讓伺服器能更有效率的面對每天億萬次的請求。
在這種情況下,底層的重要性,就遠遠超過了框架。
TCP/IP和socket簡介
回到我們的任務。
我們需要對網路傳輸,特別是TCP/IP協議和socket有一定的了解。
socket是進程間通信的一種方法,它是基於網路傳輸協議的上層介面。
socket有許多種類型,比如基於TCP協議或者UDP協議(兩種網路傳輸協議),其中又以TCP socket最為常用。
TCP socket與雙向管道(plex PIPE)有些類似,一個進程向socket的一端寫入或讀取文本流,而另一個進程可以從socket的另一端讀取或寫入,比較特別是,這兩個建立socket通信的進程可以分別屬於兩台不同的計算機。
TCP協議,就是規定了一些通信的守則,以便在網路環境下能夠有效實現上述進程間通信過程。
雙向管道(plex PIPE)存活於同一台電腦中,所以不必區分兩個進程的所在計算機的地址,而socket必須包含有地址信息,以便實現網路通信。
一個socket包含四個地址信息: 兩台計算機的IP地址和兩個進程所使用的埠(port)。IP地址用於定位計算機,而port用於定位進程 (一台計算機上可以有多個進程分別使用不同的埠)。
TCP socket
在互聯網上,讓某台計算機作為伺服器。
伺服器開放自己的埠,被動等待其他計算機連接。
當其他計算機作為客戶,主動使用socket連接到伺服器的時候,伺服器就開始為客戶提供服務。
在Python中,我們使用標准庫中的socket包來進行底層的socket編程。
首先是伺服器端,我們使用bind()方法來賦予socket以固定的地址和埠,並使用listen()方法來被動的監聽該埠。
當有客戶嘗試用connect()方法連接的時候,伺服器使用accept()接受連接,從而建立一個連接的socket:
socket.socket()創建一個socket對象,並說明socket使用的是IPv4(AF_INET,IP version 4)和TCP協議(SOCK_STREAM)。
然後用另一台電腦作為客戶,我們主動使用connect()方法來搜索伺服器端的IP地址(在Linux中,你可以用$ifconfig來查詢自己的IP地址)和埠,以便客戶可以找到伺服器,並建立連接:
在上面的例子中,我們對socket的兩端都可以調用recv()方法來接收信息,調用sendall()方法來發送信息。
這樣,我們就可以在分處於兩台計算機的兩個進程間進行通信了。
當通信結束的時候,我們使用close()方法來關閉socket連接。
(如果沒有兩台計算機做實驗,也可以將客戶端IP想要connect的IP改為"127.0.0.1",這是個特殊的IP地址,用來連接當地主機。)
基於TCP socket的HTTP伺服器
上面的例子中,我們已經可以使用TCP socket來為兩台遠程計算機建立連接。
然而,socket傳輸自由度太高,從而帶來很多安全和兼容的問題。
我們往往利用一些應用層的協議(比如HTTP協議)來規定socket使用規則,以及所傳輸信息的格式。
HTTP協議利用請求-回應(request-response)的方式來使用TCP socket。
客戶端向伺服器發一段文本作為request,伺服器端在接收到request之後,向客戶端發送一段文本作為response。
在完成了這樣一次request-response交易之後,TCP socket被廢棄。
下次的request將建立新的socket。
request和response本質上說是兩個文本,只是HTTP協議對這兩個文本都有一定的格式要求。
Request <——> Response
現在,我們寫出一個HTTP伺服器端:
HTTP伺服器程序的解釋
如我們上面所看到的,伺服器會根據request向客戶傳輸的兩條信息text_content和pic_content中的一條,作為response文本。
整個response分為起始行(start line), 頭信息(head)和主體(body)三部分。起始行就是第一行:
它實際上又由空格分為三個片段,HTTP/1.x表示所使用的HTTP版本,200表示狀態(status code),200是HTTP協議規定的,表示伺服器正常接收並處理請求,OK是供人來閱讀的status code。
頭信息跟隨起始行,它和主體之間有一個空行。
這里的text_content或者pic_content都只有一行的頭信息,text_content用來表示主體信息的類型為html文本:
而pic_content的頭信息(Content-Type: image/jpg)說明主體的類型為jpg圖片(image/jpg)。
主體信息為html或者jpg文件的內容。
(注意,對於jpg文件,我們使用"rb"模式打開,是為了與windows兼容。因為在windows下,jpg被認為是二進制(binary)文件,在UNIX系統下,則不需要區分文本文件和二進制文件。)
我們並沒有寫客戶端程序,後面我們會用瀏覽器作為客戶端。
request由客戶端程序發給伺服器。
盡管request也可以像response那樣分為三部分,request的格式與response的格式並不相同。
request由客戶發送給伺服器,比如下面是一個request:
起始行可以分為三部分,第一部分為請求方法(request method),第二部分是URL,第三部分為HTTP版本。
request method可以有GET, PUT, POST, DELETE, HEAD。最常用的為GET和POST。
GET是請求伺服器發送資源給客戶,POST是請求伺服器接收客戶送來的數據。
當我們打開一個網頁時,我們通常是使用GET方法;當我們填寫表格並提交時,我們通常使用POST方法。
第二部分為URL,它通常指向一個資源(伺服器上的資源或者其它地方的資源)。像現在這樣,就是指向當前伺服器的當前目錄的test.jpg。
按照HTTP協議的規定,伺服器需要根據請求執行一定的操作。
正如我們在伺服器程序中看到的,我們的Python程序先檢查了request的方法,隨後根據URL的不同,來生成不同的response(text_content或者pic_content)。
隨後,這個response被發送回給客戶端。
使用瀏覽器實驗
為了配合上面的伺服器程序,我已經在放置Python程序的文件夾里,保存了一個test.jpg圖片文件。
我們在終端運行上面的Python程序,作為伺服器端,再打開一個瀏覽器作為客戶端。
(如果有時間,你也完全可以用Python寫一個客戶端。原理與上面的TCP socket的客戶端程序相類似。)
在瀏覽器的地址欄輸入:
(當然,你也可以用令一台電腦,並輸入伺服器的IP地址)
OK,我已經有了一個用Python實現的,並從socket寫起的伺服器了。
從終端,我們可以看到,瀏覽器實際上發出了兩個請求。
第一個請求為 (關鍵信息在起始行,這一個請求的主體為空):
我們的Python程序根據這個請求,發送給伺服器text_content的內容。
瀏覽器接收到text_content之後,發現正文的html文本中有<IMG src="text.jpg" />,知道需要獲得text.jpg文件來補充為圖片,立即發出了第二個請求:
我們的Python程序分析過起始行之後,發現/test.jpg符合if條件,所以將pic_content發送給客戶。
最後,瀏覽器根據html語言的語法,將html文本和圖畫以適當的方式顯示出來。
探索的方向
1) 在我們上面的伺服器程序中,我們用while循環來讓伺服器一直工作下去。
實際上,我們還可以根據多線程的知識,將while循環中的內容改為多進程或者多線程工作。
2) 我們的伺服器程序還不完善,我們還可以讓我們的Python程序調用Python的其他功能,以實現更復雜的功能。比如說製作一個時間伺服器,讓伺服器向客戶返回日期和時間。你還可以使用Python自帶的資料庫,來實現一個完整的LAMP伺服器。
3) socket包是比較底層的包。Python標准庫中還有高層的包,比如SocketServer,SimpleHTTPServer,CGIHTTPServer,cgi。這些都包都是在幫助我們更容易的使用socket。如果你已經了解了socket,那麼這些包就很容易明白了。利用這些高層的包,你可以寫一個相當成熟的伺服器。
4) 在經歷了所有的辛苦和麻煩之後,你可能發現,框架是那麼的方便,所以決定去使用框架。或者,你已經有了參與到框架開發的熱情。
8. 如何用nodejs搭建web伺服器
使用Node.js搭建Web伺服器是學習Node.js比較全面的入門教程,因為實現Web伺服器需要用到幾個比較重要的模塊:http模塊、文件系統、url解析模塊、路徑解析模塊、以及301重定向技術等,下面我們就一起來學習如何搭建一個簡單的Web伺服器。
作為一個Web伺服器應具備以下幾個功能:
1、能顯示以.html/.htm結尾的Web頁面
2、能直接打開以.js/.css/.json/.text結尾的文件內容
3、顯示圖片資源
4、自動下載以.apk/.docx/.zip結尾的文件
5、形如http://xxx.com/a/b/ , 則查找b目錄下是否有index.html,如果有就顯示,如果沒有就列出該目錄下的所有文件及文件夾,並可以進一步訪問。
6、形如http://xxx.com/a/b, 則作301重定向到http://xxx.com/a/b/ , 這樣可以解決內部資源引用錯位的問題。
引入需要用到的幾個模塊:
//http協議模塊varhttp = require('http');//url解析模塊varurl = require('url');//文件系統模塊varfs = require("fs");//路徑解析模塊varpath = require("path");
創建服務並在指定的埠監聽:
//創建一個服務varhttpServer = http.createServer(this.processRequest.bind(this));//在指定的埠監聽服務httpServer.listen(port,function(){console.log("[HttpServer][Start]","runing at http://"+ip+":"+port+"/");console.timeEnd("[HttpServer][Start]");});
在創建服務的時候需要傳遞一個匿名函數processRequest 對請求進行處理,processRequest接收2個參數,分別是request和response, request對象中包含了請求的所有內容,response是用來設置響應頭以及對客戶端做出響應操作。
processRequest:function(request,response){varhasExt =true;varrequestUrl = request.url;varpathName = url.parse(requestUrl).pathname;//對請求的路徑進行解碼,防止中文亂碼pathName = decodeURI(pathName);//如果路徑中沒有擴展名if(path.extname(pathName) ===''){//如果不是以/結尾的,加/並作301重定向if(pathName.charAt(pathName.length-1) !="/"){pathName +="/";varredirect ="http://"+request.headers.host + pathName;response.writeHead(301, {location:redirect});response.end();return;}//添加默認的訪問頁面,但這個頁面不一定存在,後面會處理pathName +="index.html";hasExt =false;//標記默認頁面是程序自動添加的}//獲取資源文件的相對路徑varfilePath = path.join("http/webroot",pathName);//獲取對應文件的文檔類型varcontentType =this.getContentType(filePath);//如果文件名存在fs.exists(filePath,function(exists){if(exists){response.writeHead(200, {"content-type":contentType});varstream = fs.createReadStream(filePath,{flags:"r",encoding:null});stream.on("error", function() {response.writeHead(500,{"content-type":"text/html"});response.end("<h1>500 Server Error</h1>");});//返迴文件內容stream.pipe(response);}else{//文件名不存在的情況if(hasExt){//如果這個文件不是程序自動添加的,直接返回404response.writeHead(404, {"content-type":"text/html"});response.end("<h1>404 Not Found</h1>");}else{//如果文件是程序自動添加的且不存在,則表示用戶希望訪問的是該目錄下的文件列表varhtml ="<head><meta charset='utf-8'></head>";try{//用戶訪問目錄varfiledir = filePath.substring(0,filePath.lastIndexOf('\'));//獲取用戶訪問路徑下的文件列表varfiles = fs.readdirSync(filedir);//將訪問路徑下的所以文件一一列舉出來,並添加超鏈接,以便用戶進一步訪問for(variinfiles){varfilename = files[i];html +="<div><a href='"+filename+"'>"+filename+"</a></div>";}}catch(e){html +="<h1>您訪問的目錄不存在</h1>"}response.writeHead(200, {"content-type":"text/html"});response.end(html);}}});}
請求處理函數中有幾個重點需要說一下:
對於路徑中有中文的,瀏覽器會自動進行編碼(英文不變,中文會變),因此在接收到地址後,需要對地址進行解碼,否則最後得到的路徑和真實路徑不相符,
當訪問路徑不是以具體的文件結尾,並且不是以/結尾,則需要通過重定向加上/,表示當前目錄,否則當前路徑下的靜態資源會找不到
如果訪問路徑是目錄,則列出該目錄下所有文件及文件夾,並可以點擊訪問,為了讓中文目錄能正常顯示,則還要在header中設置charset=utf-8
核心代碼就這么多,大概140行左右,完整的代碼已上傳到github:https://github.com/git-onepixel/Node,
如果要運行demo,打開cmd切換到根目錄,運行node start 即可。
9. 搭建web伺服器遇到困難求助
1,不要綁定IP
2,不要啟用目錄瀏覽。
3,只要埠映射沒問題,理論上就沒問題了,或是會報出相應的錯誤。
4,你給下EVERYONE的修改許可權。
10. 如何在mac上快速搭建web伺服器
如果你是蘋果電腦,Mac OS X系統已經自帶了Apache伺服器,並且自帶php編譯器
打開終端,輸入 sudo apachectl start sudo表示用root許可權運行
輸入密碼,輸入時無提示,輸入完後回車確認
打開瀏覽器,在瀏覽器中輸入本機ip地址 進入系統偏好設置-網路 可查看本機ip
此時暫不開啟php編譯器,在文本中編寫一個靜態網頁
<html>
<title>我的第一個頁面</title>
<body>
<h2>ios開發教程</h2>
<ol>
<li>第一課oc實現類的定義</li>
<li>第二課oc實現對象的定義</li>
</ol>
開啟阿帕奇伺服器之後,電腦就是一個web伺服器,將.html的文本保存在桌面上,並利用復制粘貼的功能將其保存在磁碟目錄下,即根目錄下。資源庫-WebServer-Documents,改過程中會提示你出入管理員密碼,可利用顯示中的
顯示文件路徑。
此時打開瀏覽器輸入你的ip地址即可查看到該頁面。
只要將文件放到該路徑下,所有的主機都可以看到你的網頁。
要想用網頁實現一個用戶登錄的功能,就需要一個動態的網頁,必須開啟php模塊。
開啟php模塊要先進apache的配置文件。
新建一個文本,創建一個php文件
<?php
$a=3;
$b=4;
echo $a+$b;
?>
將其保存到桌面上,並用復制粘貼的功能將其保存到磁碟目錄下的 資源庫-WebServer-Documents下
開啟php編譯器,打開終端
輸入 cd /
cd etc
cd apache2/
之後就進入apache2的目錄下,可輸入ls查看目錄。
輸入 sudo vi httpd.conf 回車
在apache的配置信息中,可以看到一個#loadModole php5_mole的模塊,我們需要將其前面的#刪除,將游標移動到#位置,按一下鍵盤上的「i」,可以看到#已經消失,然後按esc鍵,輸入「:x「表示保存,按回車確認。":q"表示不保存退出。
執行 sudo apachectl stop
在重新啟動 sudo apachectl start 回車確認
再次訪問你的ip地址進入.php文件會發現輸出結果時7,查看源碼時也是7。
新建一個頁面作為登錄界面 login.html
<html>
<title>留言系統用戶登錄</title>
<body>
<h1>留言系統用戶登錄</h1>
<form action="logincheck.php" method="GET">
用戶名:<input type="text" value=""></input><br>
密碼:<input name="ps" type="password" value=""></input><br>
<input type="submit" value="登錄"/>
</form>
</body>
</html>
保存到桌面。雙擊打開之後把編碼改成utf8,可以看到登錄界面。
新建一個 logincheck.php文件
<?php
$username=$_GET["us"];
$password=$_GET["ps"];
if($username=="wangyi"&&$password=="123")
{
echo "login ok";
}
else
{
echo "login error please click <a href='login.html'>here</a> retry"
}