ปลั๊กอินที่ดีที่สุดสำหรับ HTTP BestHttp

Best Plugin Http Besthttp



เลือกเวอร์ชัน besthttp pro 1.7.8 เพื่อรองรับการประมวลผล IL2CPP 64 บิต

http://download.csdn.NET/detail/kaitiren/9120539



Unity ใช้ในการสื่อสารกับเซิร์ฟเวอร์เพื่อใช้ WWW ดั้งเดิม แต่ WWW มีฟังก์ชันไม่มากและไม่สามารถตอบสนองความต้องการได้มากนัก ดังนั้นเราจึงสามารถห่อหุ้มโปรโตคอล Http เพื่อตอบสนองความต้องการได้มากขึ้น การใช้โปรโตคอล Http ในเกม Unity เป็นเรื่องปกติธรรมดาเนื่องจากใช้งานง่ายใช้งานง่ายมักใช้ในสถานการณ์การลงจอดเช่นการดาวน์โหลดและอัปโหลดทรัพยากรบางอย่าง หากคุณต้องการใช้การควบคุมเพิ่มเติมคุณต้องใช้ Socket และกำหนดโปรโตคอลของคุณเอง



กุญแจสำคัญอีกประการในการใช้ปลั๊กอินนี้คือข้ามแพลตฟอร์มเนื่องจากสามารถใช้งานได้กับ HttpWebRequest ของ C #



คำแนะนำสั้น ๆ เกี่ยวกับ HTTP และ Socket:

การเชื่อมต่อ HTTP: การเชื่อมต่อ http เป็นการเชื่อมต่อแบบสั้นนั่นคือไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์การเชื่อมต่อจะขาดหลังจากเซิร์ฟเวอร์ตอบสนองช้าไม่เหมาะสำหรับการส่งข้อมูลแบบเรียลไทม์ในเกม จำนวนข้อมูล

เนื่องจาก HTTP ปล่อยการเชื่อมต่ออย่างแข็งขันหลังจากแต่ละคำขอการเชื่อมต่อ HTTP จึงเป็น 'การเชื่อมต่อแบบสั้น' เพื่อรักษาสถานะออนไลน์ของโปรแกรมไคลเอ็นต์จำเป็นต้องเริ่มการร้องขอการเชื่อมต่อกับเซิร์ฟเวอร์อย่างต่อเนื่อง วิธีปฏิบัติตามปกติคือคุณไม่จำเป็นต้องรับข้อมูลใด ๆ ในครั้งเดียว ไคลเอนต์ยังคงส่งคำขอ 'เก็บการเชื่อมต่อ' ไปยังเซิร์ฟเวอร์ทุกช่วงเวลาที่กำหนด หลังจากได้รับการร้องขอเซิร์ฟเวอร์ตอบกลับไปยังไคลเอนต์ซึ่งแสดงว่าไคลเอ็นต์เป็นที่รู้จัก ออนไลน์ '. หากเซิร์ฟเวอร์ไม่สามารถรับคำขอของลูกค้าเป็นเวลานานไคลเอนต์จะถือว่าอยู่ในสถานะ“ ออฟไลน์” หากไคลเอนต์ไม่สามารถรับการตอบสนองจากเซิร์ฟเวอร์เป็นเวลานานเครือข่ายจะถือว่าถูกตัดการเชื่อมต่อ



การเชื่อมต่อซ็อกเก็ต: การเชื่อมต่อซ็อกเก็ตเป็นการเชื่อมต่อที่ยาวนาน ตามทฤษฎีแล้วเมื่อเชื่อมต่อไคลเอนต์และเซิร์ฟเวอร์แล้วพวกเขาจะไม่ถูกตัดการเชื่อมต่ออย่างแข็งขันอย่างไรก็ตามเนื่องจากปัจจัยแวดล้อมต่างๆการเชื่อมต่ออาจถูกตัดการเชื่อมต่อตัวอย่างเช่นเซิร์ฟเวอร์หรือไคลเอนต์ โฮสต์หยุดทำงานเครือข่ายล่มหรือไม่มีการส่งข้อมูลระหว่างทั้งสองเป็นเวลานาน ไฟร์วอลล์เครือข่ายอาจตัดการเชื่อมต่อเพื่อปล่อยทรัพยากรเครือข่าย ดังนั้นเมื่อไม่มีการส่งข้อมูลในการเชื่อมต่อซ็อกเก็ตจึงจำเป็นต้องส่งข้อความ heartbeat เพื่อรักษาการเชื่อมต่อ ~~ รูปแบบข้อความ heartbeat เฉพาะถูกกำหนดโดยผู้พัฒนาเอง

สำหรับความแตกต่างระหว่างการเชื่อมต่อซ็อกเก็ตและการเชื่อมต่อ HTTP โปรดดูที่

http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321826.html

http://www.xuanyusong.com/archives/1948

BestHttp เป็นการใช้งาน Http / 1.1 ตาม RFC 2616 ที่รองรับแพลตฟอร์มมือถือและโฮสต์เกือบทั้งหมดที่ Unity รองรับ ดูรายละเอียดในเอกสารอย่างเป็นทางการ

คำแนะนำต่อไปนี้ส่วนใหญ่มาจากเอกสารอย่างเป็นทางการและจะมีข้อมูลเพิ่มเติมบางส่วน

เป้าหมายของ BestHttp คือการเป็นปลั๊กอิน Unity ที่ใช้งานง่ายและมีประสิทธิภาพซึ่งใช้ประโยชน์จากศักยภาพของ Http / 1.1

การติดตั้ง:

จำเป็นต้องย้ายไดเร็กทอรี Plugins ในไดเร็กทอรี BestHttp ไปยังไดเร็กทอรี Assets ในความเป็นจริงสคริปต์ BestHTTPInstaller.cs จะดำเนินการให้เสร็จสิ้นโดยอัตโนมัติหลังจากการนำเข้าเสร็จสิ้น ที่นี่เราใช้คุณสมบัติ [InitializeOnLoad] ซึ่งเราจะพูดถึงในภายหลัง

สิ่งหนึ่งที่ควรทราบก็คือหาก Unity ต่ำกว่าเวอร์ชัน 3.5 คุณต้องลบไดเร็กทอรี WP8 ในไดเร็กทอรี Plugins

เริ่มต้นด้วยคำแนะนำพื้นฐานบางประการ:

ขั้นแรกให้เพิ่มคำประกาศการใช้ BestHttp

รับคำขอ

วิธีที่ง่ายที่สุดในการร้องขอไปยังเซิร์ฟเวอร์คือการสร้างอ็อบเจ็กต์ HttpRequest ที่จัดเตรียม url และฟังก์ชันเรียกกลับไปยังตัวสร้าง หลังจากสร้างวัตถุ HttpRequest ใหม่เราจะต้องเรียกใช้ฟังก์ชัน Send () เพื่อส่งคำขอเท่านั้น

ลองดูตัวอย่าง:

1 HTTPRequest request = new HTTPRequest(new Uri(“https://google.com”), onRequestFinished) 2 request.Send() 3 void OnRequestFinished(HTTPRequest request, HTTPResponse response) 4 { 5 Debug.Log(“Request Finished! Text received: ” + response.DataAsText) 6 }

ฟังก์ชันเรียกกลับได้รับสองพารามิเตอร์ตัวหนึ่งคืออ็อบเจ็กต์ HTTPRequest ดั้งเดิมและอีกตัวคืออ็อบเจ็กต์ HTTPResponse ที่โฮสต์การตอบสนองของเซิร์ฟเวอร์ หากมีสิ่งผิดปกติออบเจ็กต์ HTTPResponse จะว่างเปล่าพร้อมคุณสมบัติ Exception เพื่อแสดงข้อผิดพลาดที่อาจเกิดขึ้น คำขอจะได้รับการจัดการแยกกันในเธรดที่แตกต่างกันและฟังก์ชันการเรียกกลับถูกเรียกใช้ในเธรดหลักของ Unity ดังนั้นเราจึงไม่ต้องทำการซิงโครไนซ์เธรดใด ๆ

เราไม่ต้องการตัวแปรชั่วคราวในตัวอย่างนี้

new HTTPRequest(new Uri(“https://google.com”), (request, response) =>Debug.Log(“Finished!”)).Send()

คำขอโพสต์

ตัวอย่างข้างต้นเป็นคำขอรับแบบธรรมดา หากเราไม่ระบุวิธีการคำขอทั้งหมดจะเป็นค่าเริ่มต้นเพื่อรับคำขอ ตัวสร้างมีพารามิเตอร์ที่ระบุวิธีการร้องขอ:

1 HTTPRequest request = new HTTPRequest(new Uri(“yourserver.com/posturi”), 2 HTTPMethods.Post, 3 OnRequestFinished) 4 request.AddField(“FieldName”, “Field Value”) 5 request.Send()

หากคุณต้องการโพสต์ข้อมูลใด ๆ และไม่ต้องการตั้งค่าโดเมนคุณสามารถใช้คุณสมบัติ RawData

1 HTTPRequest request = new HTTPRequest(new Uri(“yourserver.com/posturi”),HTTPMethods.Post,OnRequestFinished) 4 request.RawData = Encoding.UTF8.GetBytes('Field Value') 5 request.Send()

นอกเหนือจากวิธี GET และ POST แล้วยังสามารถใช้วิธีอื่นในลักษณะเดียวกันได้

วิธีรับข้อมูลที่ดาวน์โหลด

โดยปกติเราจะได้รับข้อมูลบางส่วนจากเซิร์ฟเวอร์ผ่านการร้องขอ ข้อมูลไบต์ดั้งเดิมสามารถรับได้จากคุณสมบัติข้อมูลของอ็อบเจ็กต์ HTTPResponse ลองดูตัวอย่างการดาวน์โหลดภาพ:

1 new HTTPRequest(new Uri(“http://yourserver.com/path/to/image.png”), (request, response) => 2 { 3 var tex = new Texture2D(0, 0) 4 tex.LoadImage(response.Data) 5 guiTexture.texture = tex 6 }).Send()

แน่นอนว่ามีแนวทางที่กะทัดรัดกว่านี้:

new HTTPRequest(new Uri(“http://yourserver.com/path/to/image.png”), (request, response) => guiTexture.texture = response.DataAsTexture2D).Send()

นอกจาก DataAsTexture2D แล้วยังมีคุณสมบัติ DataAsText เพื่อแยกวิเคราะห์การตอบสนองเป็นสตริง UTF8

หมายเหตุ: ตัวอย่างทั้งหมดในบทความนี้ไม่ได้รับการตรวจสอบข้อผิดพลาด โปรดเพิ่มค่าว่างด้วยตัวคุณเองในสภาพแวดล้อมการใช้งานจริง

คุณยังสามารถใช้ StartCoroutine เพื่อสร้าง HTTPRequest

1 HTTPRequest request = new HTTPRequest(new Uri(“http://server.com”)) 2 request.Send() 3 yield return StartCoroutine(request) 4 Debug.Log(“Request finished! Downloaded Data:” + request.Response.DataAsText)

Debug.Log จะถูกเรียกหลังจากการร้องขอเสร็จสมบูรณ์เท่านั้น

หัวข้อระดับสูง:

การใช้งานที่มีลำดับสูงของ BestHttp จะกล่าวถึงด้านล่าง

เราสามารถเปิดหรือปิดคุณสมบัติบางอย่างได้อย่างง่ายดายผ่านตัวสร้าง HTTPRequest นี่คือพารามิเตอร์:

● methodType: ตัดสินใจว่าจะส่งอะไรไปยังเซิร์ฟเวอร์ methodType เริ่มต้น
คือ HTTPMethods รับ
● isKeepAlive: บอกเซิร์ฟเวอร์ว่าเราต้องการให้การเชื่อมต่อ tcp ยังคงเปิดอยู่เพื่อให้คำขอ Htttp ที่ติดต่อกันไม่ต้องเปิดการเชื่อมต่ออีกครั้ง หากเราเปิดไว้โดยค่าเริ่มต้นจะช่วยประหยัดเวลาได้มาก หากเราแน่ใจว่าคำขอจะไม่เกิดขึ้นบ่อยนักก็สามารถตั้งค่าเป็นเท็จได้ ค่าเริ่มต้นเป็นจริง

ข้อมูลบางอย่างเกี่ยวกับ KeepAlive:

http://www.cnblogs.com/huangfox/archive/2012/03/31/2426341.html

http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html

ดังนั้นอย่าคาดหวังว่าสิ่งนี้จะแทนที่การเชื่อมต่อที่ยาวนานของซ็อกเก็ต
● disableCache: บอกให้ระบบ BestHttp ใช้หรือไม่ใช้กลไกการแคชทั้งหมด หากค่านี้เป็นจริงระบบจะไม่ค้นหาการตอบกลับที่จัดเก็บไว้ในแคช
และการตอบกลับจะไม่ถูกแคช ค่าเริ่มต้นเป็นเท็จ
ระบบตรวจสอบ

BestHTTP รองรับการพิสูจน์ตัวตนพื้นฐานและแยกย่อยผ่านแอตทริบิวต์การตรวจสอบสิทธิ์ HTTPRequest:

1 using BestHTTP.Authentication 2 var request = new HTTPRequest(new Uri('https://httpbin.org/digest-auth/auth-int/usr/paswd'), (req, resp) 3 => 4 { 5 if (resp.StatusCode != 401) 6 Debug.Log('Authenticated') 7 else 8 Debug.Log('NOT Authenticated') 9 Debug.Log(resp.DataAsText) 10 }) 11 request.Credentials = new Credentials('usr', 'paswd') 12 request.Send()

สำหรับการตรวจสอบคุณสามารถอ้างถึง:

http://blog.csdn.net/dyllove98/article/details/9255719

สตรีมสื่อ

ฟังก์ชันเรียกกลับที่เรามีให้สำหรับตัวสร้าง HTTPRequest จะถูกเรียกโดยค่าเริ่มต้นเพียงครั้งเดียวหลังจากที่เซิร์ฟเวอร์ตอบสนองต่อกระบวนการดาวน์โหลดเสร็จสมบูรณ์ หากคุณใช้แนวทางนี้เราจะใช้หน่วยความจำบนอุปกรณ์มือถืออย่างรวดเร็วและแอปพลิเคชันจะหยุดทำงาน เพื่อหลีกเลี่ยง BestHTTP ได้รับการออกแบบมาเพื่อจัดการปัญหาดังกล่าวได้อย่างง่ายดายเพียงตั้งค่าสถานะเป็นจริงจากนั้นฟังก์ชันเรียกกลับของเราจะถูกเรียกใช้หลังจากดาวน์โหลดข้อมูลที่กำหนดไว้ล่วงหน้าแต่ละรายการแล้ว นอกจากนี้หากเราไม่ปิดแคชการตอบกลับที่ดาวน์โหลดจะถูกแคชเพื่อให้เราได้รับการตอบสนองทั้งหมดจากแคชภายในเครื่องและไม่จำเป็นต้องสัมผัสเซิร์ฟเวอร์ของเราโดยไม่มีรหัสของเรา (PS: เซิร์ฟเวอร์ต้องส่งส่วนหัวที่ถูกต้อง: ส่วนหัว ('หมดอายุ'
หัวข้อ:)

1 var request = new HTTPRequest(new Uri('http://yourserver.com/bigfile'), (req, resp) => 2 { 3 List fragments = resp.GetStreamedFragments() 4 // Write out the downloaded data to a file: 5 using (FileStream fs = new FileStream('pathToSave', FileMode.Append)) 6 foreach(byte[] data in fragments) 7 fs.Write(data, 0, data.Length) 8 if (resp.IsStreamingFinished) 9 Debug.Log(“Download finished!”) 10 }) 11 request.UseStreaming = true 12 request.StreamFragmentSize = 1 * 1024 * 1024 // 1 megabyte 13 request.DisableCache = true // already saving to a file, so turn off caching 14 request.Send()

นี่คือคำอธิบายสั้น ๆ เกี่ยวกับสิ่งที่เราทำข้างต้น
1. เราเปลี่ยนแฟล็กบิต - UseStreaming เป็น true เพื่อให้สามารถเรียกใช้ฟังก์ชันเรียกกลับซ้ำ ๆ

2.StreamFragmentSize ระบุจำนวนข้อมูลสูงสุดที่เราต้องการแคชก่อนเรียกใช้ฟังก์ชันเรียกกลับ

3. ฟังก์ชันเรียกกลับของเราจะถูกเรียกทุกครั้งที่ดาวน์โหลดบล็อกข้อมูลขนาด StreamFragmentSize และจะถูกเรียกอีกครั้งหลังจากที่ IsStreamingFinished ถูกตั้งค่าเป็นจริง

4. ในการรับข้อมูลที่ดาวน์โหลดมาคุณต้องเรียกใช้ฟังก์ชัน GetStreamedFragments () เราควรบันทึกผลลัพธ์ในตัวแปรชั่วคราวเนื่องจากแคชภายในจะถูกล้างหลังจากการโทรสิ้นสุดลงดังนั้นการเรียกที่ตามมาจะคืนค่าว่าง

5. เราปิดแคชในตัวอย่างนี้เนื่องจากเราได้บันทึกไฟล์ที่ดาวน์โหลดมาและเราไม่ต้องการใช้พื้นที่มากเกินไป

แคช

แคชยังขึ้นอยู่กับ HTTP / 1.1 RFC ใช้ข้อมูลส่วนหัวในการจัดเก็บและตรวจสอบการตอบกลับ กลไกการแคชทำงานอยู่เบื้องหลังเราเพียงแค่ต้องตัดสินใจว่าจะเปิดใช้งานหรือไม่ หากการตอบกลับที่แคชมีส่วนหัว 'หมดอายุ' พร้อมเวลาในอนาคต BestHTTP จะใช้การตอบกลับที่แคชและจะไม่รับรองความถูกต้องกับเซิร์ฟเวอร์ ซึ่งหมายความว่าเราไม่จำเป็นต้องเริ่มต้นการเชื่อมต่อ tcp ใด ๆ สิ่งนี้ช่วยให้เราประหยัดเวลาแบนด์วิดท์และใช้งานออฟไลน์ได้

แม้ว่าแคชจะเป็นแบบอัตโนมัติ แต่เรายังสามารถควบคุมบางส่วนได้หรือเราสามารถรับข้อมูลบางอย่างได้โดยใช้ฟังก์ชันสาธารณะบางอย่างของคลาส HTTPCacheService:

● BeginClear (): ล้างแคชทั้งหมดในเธรดอื่น
● BeginMaintainence (): ด้วยฟังก์ชั่นนี้เราสามารถลบรายการที่แคชตามเวลาที่เข้าถึงล่าสุดได้ จะลบรายการแคชที่มีเวลาเข้าถึงล่าสุดก่อนเวลาที่กำหนด นอกจากนี้เรายังสามารถใช้ฟังก์ชั่นนี้เพื่อรักษาขนาดแคช:
// ลบแคชที่ไม่ได้เข้าถึงในช่วงสองสัปดาห์ที่ผ่านมาจากนั้นลบรายการเพื่อให้ขนาดแคชต่ำกว่า 50M โดยเริ่มจากเร็วที่สุด
HTTPCacheServiceBeginMaintainence (HTTPCacheMaintananceParams ใหม่ (TimeSpan.FromDays (14),
50 * 1024 * 1024))
● GetCacheSize (): ส่งคืนขนาดแคชการแสดงไบต์

● GetCacheEntryCount (): ส่งคืนจำนวนรายการที่จัดเก็บในแคช ขนาดรายการแคชเฉลี่ยสามารถคำนวณได้เป็น float avgSize = GetCacheSize () / (float) GetCacheEntryCount ()