เมื่อเร็วๆ นี้ ฉันกำลังเรียนรู้เกี่ยวกับการใช้รีโมทเพื่อทำความเข้าใจ และฉันพบว่าการใช้รีโมทเป็นสิ่งที่ดีจริงๆ
โดยปกติแล้ว เรามีวิธีใช้รีโมทสามวิธี วิธีหนึ่งคือ
วิธีแรก: การเผยแพร่ออบเจ็กต์สาธารณะ
วัตถุสาธารณะถูกสร้างขึ้นในเครื่อง ประเภทที่สอง: การสร้างวัตถุสาธารณะระยะไกล (SAO)
การสร้างออบเจ็กต์ประเภทที่สามในคำขอของไคลเอ็นต์: การสร้างออบเจ็กต์ส่วนตัวจากระยะไกล (CAO)
วัตถุถูกสร้างขึ้นบน HOST และไคลเอนต์อ้างถึงไดเรกทอรีวัตถุบนเซิร์ฟเวอร์
ฉันไม่มีความเข้าใจที่ดีเกี่ยวกับความแตกต่างที่สำคัญระหว่างทั้งสามประเภทนี้ วิธีการสร้างระยะไกลของทั้งสามวิธีนี้ก็แตกต่างกันเช่นกัน
วิธีแรก
เจ้าภาพ:
ChannelServices.RegisterChannel (TcpChannel ใหม่ (1500));
cTransfer Trans = cTransfer ใหม่();
RemotingServices.Marshal (ทรานส์ "TestService"); ลูกค้า:
cTransfer T = (cTransfer) Activator.GetObject (ประเภทของ (cTransfer)
"tcp://host:1500/TestService");
วิธีที่สอง
เจ้าภาพ:
ChannelServices.RegisterChannel (TcpChannel ใหม่ (1500));
RemotingConfiguration.RegisterWellKnownServiceType (ประเภทของ (cTransfer)
"TestService", WellKnownObjectMode.Singleton); ลูกค้า:
cTransfer T = (cTransfer) Activator.GetObject (ประเภทของ (cTransfer)
"tcp://host:1500/TestService");
วิธีที่สาม
เจ้าภาพ:
ChannelServices.RegisterChannel (TcpChannel ใหม่ (1500));
RemotingConfiguration.RegisterActivatedServiceType (typeof (cTransfer)); ไคลเอนต์:
object[] attr = {URLAttribute ใหม่("tcp://host:1500"});
object[] args = {"อาร์กิวเมนต์ตัวสร้างตัวอย่าง"};
cTransfer T = (cTransfer) Activator.CreateInstance (ประเภทของ (cTransfer), args, attr);
หากเราต้องการอ็อบเจ็กต์เพื่อให้สามารถประมวลผลการโทรระยะไกลได้ อ็อบเจ็กต์นี้จำเป็นต้องสืบทอดจากคลาส MarshalByRefObject
จะถ่ายโอนไฟล์ระหว่างการรีโมตได้อย่างไร? แนวคิดพื้นฐานคือการเปิดไฟล์ไคลเอนต์ในไคลเอนต์ แปลงประเภท Byte[] จากนั้นเรียกอ็อบเจ็กต์โฮสต์
ออบเจ็กต์ที่ถ่ายโอนระหว่างไคลเอนต์และโฮสต์
[สามารถซีเรียลไลซ์ได้]
โครงสร้างสาธารณะ kAction
-
ชื่อไฟล์สตริงสาธารณะ
บริบทไบต์สาธารณะ [];
};เปิดไฟล์และบันทึกไบต์สตรีมลงในบริบท
สตรีม fileStream=File.Open(this.transFileName.Text,FileMode.Open);
fileStream.ตำแหน่ง=0;
ไบต์ [] เนื้อหา = ไบต์ใหม่ [((int) fileStream.Length) + 1];
fileStream.Read(เนื้อหา,0,เนื้อหา.ความยาว);
หลังจากที่โฮสต์อ่าน Kaction แล้ว จะบันทึกลงในโฟลเดอร์ที่ระบุ
MemoryStream meoeryStream=ใหม่ MemoryStream(k_Action.context);
FileStream fileStream=ใหม่ FileStream(@"d:"+k_Action.filename,FileMode.Create);
meoeryStream.WriteTo(fileStream);
fileStream.ปิด();
meoeryStream.ปิด();
พบว่าไม่สามารถกำหนดวัตถุใหม่ในวัตถุได้ เมื่อเตรียมส่งไปยัง HOST จะมีข้อความแจ้งว่า "มีประเภทที่อาจเป็นอันตราย"
[สามารถซีเรียลไลซ์ได้]
โครงสร้างสาธารณะ kAction
-
ชื่อไฟล์สตริงสาธารณะ
บริบทไบต์สาธารณะ [];
สาธารณะ FineInfo fileInfo;//ที่นี่
};
บันทึกความคิดของคุณ เมื่อมีเวลาผมจะจัดเรียงและทำบทความฉบับสมบูรณ์ในครั้งต่อไป
บล็อกของ cnzc