ต่อไปนี้เป็นไฟล์คลาสของฉัน
//online.cs (การตรวจจับออนไลน์ของผู้ใช้)
/*แนวคิดการใช้งานโปรแกรม:
ผู้ใช้มีคุณลักษณะดังต่อไปนี้:
ชื่อ: ชื่อผู้ใช้
SessionID: ID ผู้ใช้, เพียงแสดงเพียงผู้ใช้ผ่านมัน
ISWESH: ข้อมูลเพิ่มเติมที่ซึ่งผู้ใช้อยู่ในปัจจุบัน
เมื่อเวลาผ่านไป: เวลาเข้าสู่ระบบของผู้ใช้
Curtime: รีเฟรชเวลาในครั้งนี้
บนไคลเอน
ทางฝั่งเซิร์ฟเวอร์สร้างเธรด Guardian เรียกใช้หนึ่งครั้งทุกครั้งที่คงที่จากนั้นพิจารณาว่าช่วงเวลาในรายการผู้ใช้ปัจจุบันทั้งหมดเกินกว่า
หากเกินเวลาที่ระบุผู้ใช้จะลบออกจากรายการออนไลน์เพื่อให้คุณสามารถตรวจพบได้ว่าผู้ใช้ออนไลน์หรือไม่และหากอยู่คนเดียว
เขียนการประมวลผลแบบออฟไลน์ของผู้ใช้เพื่อแก้ปัญหาคนจำนวนมากที่ถามว่า: การรักษาผู้ใช้หลังจากแขวนสายโดยไม่ตั้งใจ
-
#define_debug
เนมสเปซ Soholife
-
ใช้ระบบ
ใช้ System.data;
ใช้ System.data.sqlclient;
ใช้ System.collections;
การใช้ System.Threading;
ใช้ System.web;
ใช้ System.diagnostics;
// กำหนดโครงสร้าง
ผู้ใช้โครงสร้างสาธารณะ
-
ชื่อสตริงสาธารณะ;
วันหยุดสาธารณะสาธารณะล่าสุด;
DateTime Curtime สาธารณะ;
สตริงสาธารณะ SessionId;
สตริงสาธารณะอยู่ที่นั่น
-
// กำหนดคลาสผู้ใช้ออนไลน์
ผู้ใช้ออนไลน์ชั้นเรียนสาธารณะ
-
ArrayList_Alluser ส่วนตัว
Alluser Arraylist สาธารณะ
-
geturn_alluser;}
ตั้งค่า {_alluser = value;}
-
public onlineUser () // ฟังก์ชั่นสร้าง
-
ถ้า (_allurs == null)
-
_alluser = new ArrayList ();
-
-
// ฟังก์ชั่นคำอธิบาย: เพิ่มผู้ใช้ปัจจุบันลงในรายการออนไลน์
// หากข้อมูลของผู้ใช้ยังคงอยู่ในรายการออนไลน์จะไม่ได้รับอนุญาตให้เข้าสู่ระบบชั่วคราวเพื่อให้ผู้ใช้แจ้งให้ผู้ใช้มีอยู่
Public Booladdusertoonline (ผู้ใช้)
-
// คุณต้องพิจารณาว่าผู้ใช้อยู่ในรายชื่อผู้ใช้แล้ว
ถ้า (_allurs == null)
-
_alluser.add (ผู้ใช้);
กลับมา (จริง);
-
อื่น
-
สำหรับ (int i = 0; i <_alluser.count; i ++)
-
// การตัดสินวัฏจักรว่าผู้ใช้มีอยู่แล้ว
soholife.user tester = (soholife.user) _alluser [i];
if (tempuser.sessionid.equals (user.sessionId) && tempuser.name.equals (user.name)))
-
return (false);
-
-
_alluser.add (ผู้ใช้);
กลับมา (จริง);
-
-
// ฟังก์ชั่นคำอธิบาย: กำหนดว่าผู้ใช้ออนไลน์ส่วนนี้ไม่ได้ใช้ในเวลานั้น
// ค่าส่งคืน: จริงแสดงถึงออนไลน์เท็จไม่ได้อยู่ที่นั่น
PublicBoolean IsauserOnline (ชื่อสตริง)
-
// คุณต้องพิจารณาว่าผู้ใช้อยู่ในรายชื่อผู้ใช้แล้ว
ถ้า (_allurs == null)
-
return (false);
-
อื่น
-
สำหรับ (int i = 0; i <_alluser.count; i ++)
-
// การตัดสินวัฏจักรว่าผู้ใช้มีอยู่แล้ว
soholife.user tester = (soholife.user) _alluser [i];
if (tester.name.equals (ชื่อ))
-
กลับมา (จริง);
-
-
return (false);
-
-
// ฟังก์ชั่นคำอธิบาย: อัปเดตเวลาผู้ใช้ออนไลน์
// ค่าส่งคืน: รายชื่อผู้ใช้ออนไลน์ล่าสุด
Public Boolean CheckUserOnline (ชื่อสตริง)
-
// คุณต้องพิจารณาว่าผู้ใช้อยู่ในรายชื่อผู้ใช้แล้ว
ถ้า (_alluser! = null)
-
สำหรับ (int i = 0; i <_alluser.count; i ++)
-
soholife.usertempuser = (soholife.user) _alluser [i];
// ก่อนอื่นตรวจสอบว่าผู้ใช้ปัจจุบันเป็นตัวคุณเอง
if (tester.name.equals (ชื่อ))
-
// อัปเดตเวลาผู้ใช้ออนไลน์
tempuser.curtime = dateTime.now;
Alluser [i] = tempuser;
กลับมา (จริง);
-
-
-
return (false);
-
-
-
มาเริ่มสร้างคลาสเธรด Guardian:
(หมายเหตุ: ที่นี่เมื่อฉันเริ่มเขียน
หลังจากปัญหามากมายในที่สุดฉันก็ตัดสินใจที่จะยอมแพ้และใช้รูปแบบที่มีอยู่ แต่ฉันเพิ่งเข้าใจชิ้นส่วนเดียวจากความสุข
จะใช้เพื่อเขียนโหมดอื่นอีกครั้ง)
-
CheckOnline ชั้นเรียนสาธารณะ
-
const เป็น delay_times = 5000;
const เป็น delay_seconds = 30;
เธรดส่วนตัว;
ส่วนตัว bool_flag = false; // กำหนดโลโก้ที่ไม่ซ้ำกัน
publiconline ()
-
ถ้า (! _flag)
-
_flag = true;
this.thread = เธรดใหม่ (threadStart ใหม่ (ThreadProc));
thread.name = ผู้ใช้ออนไลน์;
thread.start ();
-
-
อินเทอร์เน็ตเป็นโมฆะ ThreadProc ()
-
ในขณะที่ (จริง)
-
SoHolife.onlineUsUsr Test = New SoHolife.onlineUsUser ();
สำหรับ (int i = 0; i <temp.alluser.count; i ++)
-
ผู้ใช้ tmpuser = (ผู้ใช้) temp.alluser [i];
// ฉันเพิ่มเวลาล่าสุดของผู้ใช้เป็น 80 วินาทีจากนั้นเปรียบเทียบกับเวลาปัจจุบันเวลาขนาดเล็กและปัจจุบัน
// หมายความว่าผู้ใช้ได้ระงับบรรทัดแล้วบันทึกของเขาจะถูกลบ
if (tmpuser.curtime.addseconds (delay_seconds) .compareto (datetime.now) <0)
-
temp.alluser.removeat (i);
-
-
thread.sleep (delay_times);
-
-
-
-
คำสั่งรวบรวมคือ: CSC /T: Library /Out:../bin/online.dll /r: system.dll online.cs