搭建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"
}