實習日記(第二週)
任務
- 模擬玩家登入過程,測試大量玩家併發請求,一次登入過程,至少包含login、get_game_info、get_user_profile、update、join_chat、join_tournament等請求,且必須返回正確資料;
- 需要模擬多玩家同時登入過程,所以需要多執行緒、多程序和協程的技術三選一使用;
期望
- 測試出某些介面效能是否存在問題;
- 可嘗試攻擊伺服器,發現潛在的安全隱患;
遊戲過程command事件
1. 登入
update_profile
update
join_chat
execute
get_many_user_profile
execute
2. 加入戰鬥:
join_arena
get_tournament_info
get_tournament_info
finish_mission
update
execute
get_clan_info
3. 1V1戰鬥
join_tournament
get_user_profile
get_tournament_info
update
update
get_tournament_info
execute
get_clan_info
get_tournament_info
4. 掃蕩
sweep_arena
get_tounament_info
update
collect_contract
get_clan_info
update
collect_contract
get_tournament_info
updat
get_clan_info
collect_contract
get_tournament_info
update
collect_contract
update
collect_contract
get_clan_info
update
collect_contract
get_tournament_info
get_clan_info
update
collect_contract
collect_contract
get_tournament_info
update
collect_contract
get_clan_info
update
collect_contract
…(事件過多)
5. 恭喜你解鎖新兵種
update
execute
execute
execute
execute
(一直未點選時不時update)
headers:
update_profile:
請求頭
Host:192.168.1.124:10002
User-Agent:Mozilla/5.0
Accept:
Accept-Language
Accept-Encoding:gzip,deflate
Connection:keep-alive
響應頭:
Content-Length:356
Content-Type:text/plain
遊戲事件注意點
- finish_misson事件沒法模擬
- 遊戲戰鬥結束後才能模擬戰鬥,否則報錯
1. join_tournament兵種不夠的話進行派遣,事件報錯
相關知識
1.XML和JOSN的區別
定義介紹
(1).XML定義
擴充套件標記語言 (Extensible Markup Language, XML) ,用於標記電子檔案使其具有結構性的標記語言,可以用來標記資料、定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言。 XML使用DTD(document type definition)文件型別定義來組織資料;格式統一,跨平臺和語言,早已成為業界公認的標準。
XML是標準通用標記語言 (SGML) 的子集,非常適合 Web 傳輸。XML 提供統一的方法來描述和交換獨立於應用程式或供應商的結構化資料。
(2).JSON定義
JSON(JavaScript Object Notation)一種輕量級的資料交換格式,具有良好的可讀和便於快速編寫的特性。可在不同平臺之間進行資料交換。JSON採用相容性很高的、完全獨立於語言文字格式,同時也具備類似於C語言的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)體系的行為。這些特性使JSON成為理想的資料交換語言。
JSON基於JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一個子集。XML和JSON優缺點
(1).XML的優缺點
<1>.XML的優點
A.格式統一,符合標準;
B.容易與其他系統進行遠端互動,資料共享比較方便。
<2>.XML的缺點
A.XML檔案龐大,檔案格式複雜,傳輸佔頻寬;
B.伺服器端和客戶端都需要花費大量程式碼來解析XML,導致伺服器端和客戶端程式碼變得異常複雜且不易維護;
C.客戶端不同瀏覽器之間解析XML的方式不一致,需要重複編寫很多程式碼;
D.伺服器端和客戶端解析XML花費較多的資源和時間。
(2).JSON的優缺點
<1>.JSON的優點:
A.資料格式比較簡單,易於讀寫,格式都是壓縮的,佔用頻寬小;
B.易於解析,客戶端JavaScript可以簡單的通過eval()進行JSON資料的讀取;
C.支援多種語言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等伺服器端語言,便於伺服器端的解析;
D.在PHP世界,已經有PHP-JSON和JSON-PHP出現了,偏於PHP序列化後的程式直接呼叫,PHP伺服器端的物件、陣列等能直接生成JSON格式,便於客戶端的訪問提取;
E.因為JSON格式能直接為伺服器端程式碼使用,大大簡化了伺服器端和客戶端的程式碼開發量,且完成任務不變,並且易於維護。
<2>.JSON的缺點
A.沒有XML格式這麼推廣的深入人心和喜用廣泛,沒有XML那麼通用性;
B.JSON格式目前在Web Service中推廣還屬於初級階段。
2.requests使用
import requests
url = "http://192.168.1.124:10002/command/login"
payload = "<login uid=\"fb:72.hello\" auth_key=\"eb74cbda703bfaf410148cf18c42d343\">\r\n\t<flags>0</flags>\r\n</login>"
response = requests.request("POST", url, data=payload,)
print(response.text)
3.pool程序池的使用
#!/usr/bin/env python
# coding=utf-8
from multiprocessing import Pool
from time import sleep
def f(x):
for i in range(10):
print '%s --- %s ' % (i, x)
sleep(1)
def main():
pool = Pool(processes=3) # set the processes max number 3
for i in range(11, 20):
result = pool.apply_async(f, (i,))
pool.close()
pool.join()
if result.successful():
print 'successful'
if __name__ == "__main__":
main()
4.XML檔案的解析(提取裡面的session、sid等資訊)
def getsession(self,body1):
root = ET.fromstring(body1)
for node in root.iter():
if (node.attrib.get('session') != None):
body1 = node.attrib.get('session')
return body1
測試結果
伺服器效能:
- 請求總數越多,最慢一條的處理時間變長
- 在只有login事件請求時平均處理一條的時間是最快的
- 在1萬個總請求數下,伺服器能夠完全執行請求
- 在兩臺電腦上進行測試時,有一臺電腦的請求速度變慢,甚至停止在等待
- 伺服器處理事件的平均響應時間為0.005~0.006s
- 伺服器平均每秒事務數為175次