السلام عليكم ورحمة الله
عملت موقع بلغة jsp + servlet
الموقع يخدم قروب من الطلاب ..
اذا كان لديكم اي معلومة عن طريقة برمجة online users list
(كما هي الحال في msn messenger)
كذلك تحاكي فكرة (المتواجدون الان) في المنتديات .. أفيدونا .. وشكرا
السلام عليكم ورحمة الله
عملت موقع بلغة jsp + servlet
الموقع يخدم قروب من الطلاب ..
اذا كان لديكم اي معلومة عن طريقة برمجة online users list
(كما هي الحال في msn messenger)
كذلك تحاكي فكرة (المتواجدون الان) في المنتديات .. أفيدونا .. وشكرا
اخوي بس ممكن اتوضح الفكرة اشوي
يعطيك العافية
حسب ما فهمت عليك كيف اللي بيدخل بيعمل اون لاين لكل اللي ضايفينو
انا ما عندي خبرة قوية بالماسنجر بس بتوقع انو الطريقة المناسبة هي انو لما بيدخل واحد بيعمل request فيها جميع اللي ضايفهم للسيرفلت داخل map و السيرفلت بالتالي بيقوم بعمل request لكل واحد من اللي ضايفهم ليخبرهم بانه دخل المستخدم ذو الاسم الفلاني
mofeedchaar@hotmail.com
على حسب ما فهمت انك تريد المتواجدون الان كالتالي في المنتديات والتي في massenger
ولكن لدي ملاحظة حول الامرين ... ان الطريقة في جلب المتواجدون في المنتدى تختلف عن طريق المتواجدون الان في المسانجر
الاولى لا تسعتمل قواعد البيانات والثانية تستعمل قواعد البيانات
الطريقة الاولى وهي ان تقوم بوضع session بكل تاكيد عند عملية الدخول ... وعند دخول الطالب تبدا باضافة اسمه في متغير على سبيل المثال onlineStudent
وهذا المتغير من نوع Enumeration ... ومن خلال هذا تستطيع ان تجلب جميع القيم الموجودة في المتغير onlineStudent وهم المتواجدون الان
هذا بالنسبة اذا كنت تريد المتواجدون الان كالتي في المنتديات
وبالنسبة للطريقة الثاني فيجب استخدم قواعد البيانات ... وفي كل مرة يدخل فيها اي طالب تضيفة الى قاعدة البيانات
طبعا سوف يكون الاتصال بقاعدة البيانات مفتوح دائما ولا يغلق ... بسبب ان كلفة الاتصال عالية جدا
طبعا الطريقه هذه اذا كنت تريد مثل massenger ... وعن طريق الاستعلام تجلب جميع الموجودين في قواعد البيانات وهم بالاصل المتواجدون الان
أشكركم على تفاعلكم ..
فكرتي هي عرض اسماء الطلاب المتواجدون الان (online) في الموقع (طبعا الموقع يتصل بقاعدة بيانات فيها معلومات الطلاب وعند تسجيل الدخول يقوم بعمل سيشن للاسم ) .. ومن قرائتي لردودكم تبين لي أنها تشبه أكثر فكرة( المتواجدون الان) في المنتديات ..
طيب انا عند سؤال كيف بدو يتسجل خروج المستخدم و يعرف الطرف الاخر انو المستخدم خرج (طبعا الخروج عن طريق اغلاق النافذة او البرنامج و ليس تسجيل الخروج)
انا حسب ما اعتقد انو نكتب كود الخروج داخل ميثود الديستروي فاريد التاكد من ان جوابي هو الصحيح او لا
mofeedchaar@hotmail.com
الأخ الفاضل jsp :
هل السيشن المستخدم هو session tracking ??
لانه على حسب فهمي ان السيشن يعين باسم الطالب من الـ client side
هل هناك متغير قلوبال في السيرفر يحمل جميع قيم السيشن لاسماء الطلاب الـ on line بحيث استطيع استدعائه وطباعته ؟
بمعنى اخر أأمل منك توضيح طريقة استخدام الـ Enumeration أكثر .. أين يتم تعريف هذا المتغير وكيف أقوم بتعبئته ؟؟
أيضا سؤال الأخ mofeed chaar أثار اهتمامي ..
بالنسبة لهذا الامر ... فلم اقم بعمل صفحة تقوم بجلب جميع المتواجدون الان ...
ولكن هذا ممكن جدا مع Enumeration object ... ففكرة هذا Object تقوم على جلب جميع القيم الممكنه للمتغير الواحد
فالطالب عندما يقوم بتسجيل الدخول سوف تقوم باضافة اسمه الى هذا المتغير ... واذا قام طالب اخر بتسجيل الدخول سوف تقوم باضافه اسمه الى هذا المتغير ايضا
وبعد هذا الاسم سوف تقوم بارسال المتغير تلقائيا الى Enumeration object والذي من خلاله سوف تقوم بجلب جميع القيم الموجودة في المتغير من هذا النوع وهي اسماء الطلاب
في الحقيقة هذا Object يستخدم في الاصل لغير ذلك وهو في جلب القيم المتعددة للمتغير الواحد ...
لكن تستطيع التحايل عليه وبدل ان ترسل له اسم حقل او غير ذلك تقوم بارسال session او متغير توجد فيه اكثر من قيمة
ومن بعدها تجلب ماهو موجود فيه
انظر الى هذا الكود قد يساعدك في فهم ما اتحدث عنه
ShowParametersPostForm.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>A Sample FORM using POST</TITLE> </HEAD> <BODY BGCOLOR="#FDF5E6"> <H1 ALIGN="CENTER">A Sample FORM using POST</H1> <FORM ACTION="/servlet/coreservlets.ShowParameters" METHOD="POST"> Item Number: <INPUT TYPE="TEXT" NAME="itemNum"><BR> Quantity: <INPUT TYPE="TEXT" NAME="quantity"><BR> Price Each: <INPUT TYPE="TEXT" NAME="price" VALUE="$"><BR> <HR> First Name: <INPUT TYPE="TEXT" NAME="firstName"><BR> Last Name: <INPUT TYPE="TEXT" NAME="lastName"><BR> Middle Initial: <INPUT TYPE="TEXT" NAME="initial"><BR> Shipping Address: <TEXTAREA NAME="address" ROWS=3 COLS=40></TEXTAREA><BR> Credit Card:<BR> <INPUT TYPE="RADIO" NAME="cardType" VALUE="Visa">Visa<BR> <INPUT TYPE="RADIO" NAME="cardType" VALUE="Master Card">Master Card<BR> <INPUT TYPE="RADIO" NAME="cardType" VALUE="Amex">American Express<BR> <INPUT TYPE="RADIO" NAME="cardType" VALUE="Discover">Discover<BR> <INPUT TYPE="RADIO" NAME="cardType" VALUE="Java SmartCard">Java SmartCard<BR> Credit Card Number: <INPUT TYPE="PASSWORD" NAME="cardNum"><BR> Repeat Credit Card Number: <INPUT TYPE="PASSWORD" NAME="cardNum"><BR><BR> <CENTER> <INPUT TYPE="SUBMIT" VALUE="Submit Order"> </CENTER> </FORM> </BODY> </HTML>
وهذا هو كلاس جافا وهو عبارة عن Servlet ... ولكن تستطيع ان تجعله Jsp
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class ShowParameters extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading All Request Parameters";
out.println(ServletUtilities.headWithTitle(title) +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=CENTER>" + title + "</H1>\n" +
"<TABLE BORDER=1 ALIGN=CENTER>\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
"<TH>Parameter Name<TH>Parameter Value(s)");
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.print("<TR><TD>" + paramName + "\n<TD>");
String[] paramValues =
request.getParameterValues(paramName);
if (paramValues.length == 1) {
String paramValue = paramValues[0];
if (paramValue.length() == 0)
out.println("<I>No Value</I>");
else
out.println(paramValue);
} else {
out.println("<UL>");
for(int i=0; i<paramValues.length; i++) {
out.println("<LI>" + paramValues);
}
out.println("</UL>");
}
}
out.println("</TABLE>\n</BODY></HTML>");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}وفي الحقيقة لقد وجدت خاصية جميلة جدا في Session ... ولكن لا ادري هل تجلب لي جميع المتغيرات او الاسماء ... فلم اجربها وهي : session.getAttributeNames();
طبعا session يكون من قبل العميل ولا يكون من من قبل الخادم ... اما عن طريقة الاخ mofeed chaar لا اعرفها ولم اجربها يوماً ...
تم تعديل هذه المشاركة بواسطة Jsp في 7 أبريل 2008 في 01:37
لم اقرأ ما يجري لانني تعبان جدا.. و لكن يجب استخدام قاعدة بيانات و هناك مؤقت عند كل ضغطة يتجدد مثلا الى 2 د قيقية و يبدا العد التنازلي
فاذا قام بضغطة جديدة سوف يعود الى 2 د اما اذا مرت الـ 2 د و لم يفعل شئ فربما هنا يكون اغلق النافذة او انقطع الاتصال .. الخ و يعلن تسجيل خروجه و يلغى السيشن الخاص به و تلغى خاصية online التي تتبع سجله في قاعدة البيانات..
لا اعرف اذا اكنت اكرر حلول موجودة في هذه الصفحة و اذا كنت كذلك فاعذورني و اذا لم اكن فربما هي فكرة للنقاش
Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why
أخي رامي العيساوي .. ياليت لو توضح فكرتك أكثر ..
أقدر تعبك , لكنني لم أفهم ما طرحته ..
رامي العيساوي كتب:فاذا قام بضغطة جديدة سوف يعود الى 2 د اما اذا مرت الـ 2 د و لم يفعل شئ فربما هنا يكون اغلق النافذة او انقطع الاتصال .. الخ و يعلن تسجيل خروجه و يلغى السيشن الخاص به و تلغى خاصية online التي تتبع سجله في قاعدة البيانات..
شفاك الله اخي رامي ... واعانك الله على هذا التعب وجعله في موازين حسناتك سواء بتكفير الذنوب او بالثواب عند الصبر
وكما قلت يمكن ان يكون استخدام قواعد البيانات حلاً في ذلك ... ويمكن ان يكون نوع Session في حاله اخرى هو مصفوفة ... ويمكن غير ذلك ... حل الحلول ممكنه
ولكن من خلال ما قلت وهو السابق لدي سؤال بسيط حوله ... انت تقول اذا لم يفعل شيء لمدة دقيقتين فسوف يعلن تسجيلة ويلغي Session
ولكن اذا قام الطالب بفتح نافذتين لنفس الموقع ... الاولى لا يعمل عليها ... والثانية يعمل عليها ... فالاولى وعلى حسب ما قلت اذا مرت دقيقتين سوف يلغي Session ويعلن تسجيلة
وبهذا سوف يعلن تسجيلة حتى في النافذة الثانية وان كان يعمل عليها ...
وهنا سوف يقع الطالب مجبورا في استخدام نافذة واحدة للموقع لكي لا يلغي Session ولكي لا يخرجة من الموقع اذا قام بفتح نافذة ثانية ولم يعمل عليها
وما ذكرت في السابق هو عبارة ان اجتهاد شخصي في عملية التتبع ...
ولقد وجدت انه يوجد خاصية في الجافا سكربت تستشعر العميل اذا قام بالخروج من الموقع وذلك باقفال النافذة دون ان يسجل تسجيل الخروج وهي : window.close
ولكن الى الان لا اجدها جيدة ... بسبب الامر الذي قلته في السابق وهو فيما لو قام العميل او الطالب بفتح نافذتين واغلق واحدة وابقى على الثانية تعمل
هنا سوف يلغي Session ويخرجة حتى وان كان يعمل على نافذة اخرى
تم تعديل هذه المشاركة بواسطة Jsp في 8 أبريل 2008 في 12:47
انا لي راي اخر لانو لو كان المستخدم عمبيكتب رد طويل داخل المنتدى او فتح الماسنجر عمبينتظر شخص معين راح يواجه مشاكل باستخدام هذه الطريقة
انا برايي انو كل دقيقتين بدلا من انو يراقب حدث من المستخدم يبعت request للمستخدم و بصفحة المستخدم هناك listner لل request بس تحسس بrequest فورا بيرد ب request و السيرفر اذا اجاه request من المستخدم بعد ما ارسل ال request فهاد يعني انو المستخدم موجود و اذا ما اجاه request فهاد يعني انو المستخدم غير موجود فبيقوم السيرفليت بتسجيل خروجه
mofeedchaar@hotmail.com
اخي مفيد مدة دقيقتين هي مدة مجازية انا لا اقصد فعلا دقيقتين :) ؟؟؟ فقط للمثال و اكيد يمكن تغييرها !!
اقتباسيبعت request للمستخدم و بصفحة المستخدم هناك listner لل request بس تحسس بrequest فورا بيرد ب request و السيرفر اذا اجاه request من المستخدم بعد ما ارسل ال request فهاد يعني انو المستخدم موجود و اذا ما اجاه request فهاد يعني انو المستخدم غير موجود فبيقوم السيرفليت بتسجيل خروجه
حبيبي مفيد هل الكلام غير واقعي ومستحيل يصير في التعامل من خلال http انت بدك تلعب و تغير كل البروتوكول!!
لانه معروف جدا جدا بانه العميل بتصل يسحب البيانات و ينقطع الاتصال فورا بعدها و 1- لا يمكن للسيرفر ان يعيد الاتصال بالعميل و 2- ما هذا الـ listner الموجود في صفحة html ؟؟؟؟
و فرضا فرضا كلامك ممكن يتطبق 3- هل هذه طريقة عملية ان يتم تبادل الطلبات كل دقيقتين !!! ما تتكلم عنه يصلح في حالة انشاء اتصال socket نظامي على منفذ معين و يبقى الاتصال مفتوح و يتم ما تريد و لكن بـ html هذا مستحيل للاسف . يمكن ان يحدث في حالة ajax حيث يتم الاتصال بالخلفية و لكن من طرف العميل يرسل طلب و يستقبل اجابة و ليس العكس كما قلت بان يقوم السيرفر بالاتصال و الاجابة من العميل !
و اذا كنت لا تصدقني فارجو منك ان تبرمج ما تقوله و تعلمني كيف يتم ذلك و اذا ما بتقدر فخليك عم تتفرج على فلم خيانة مشروعة :) و اذا خلصت منه فبدي اعدي عليك آخذه
و عزيزي jsp انا بالحقيقة عندما نفذت ما تريد على احد البرامج و كان برنامج JSP و كان يوجد خاصية عند المدير في لوحة التحكم ان يعرف المتواجدون الآن و ماذا يفعلون و بوقتها لم اعتمد على السيشن بل كما اذكر كنت اعتمد على الآي بي و بذلك لا اتعلق لا بنافذة ولا باي شئ و بالنسبة للجافا سكريبت فهي طبعا حل غير عملي ابدا ابدا فربما ينقطع الاتصال فجأة و لن تحدث تعليمة close ابدا
على كلا اذا اردت استطيع ان ابحث هنا و هنا على كود البرنامج الذي برمجته سابقا و اجلب لك الطرق المتعلقة بها و لكن اذا كانت مشكلتك فقط بالفكرة فاعتقد بانها وصلتك :)
Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why
أخي رامي العيساوي .. ياليت لو تبحث لنا عن الكود الذي عملته .. مازلت احتاجها ,, شكرا
وجدته :D
هذا كودا لمؤقت
package ws.ramy;
import java.sql.*;
import java.util.*;
public class Timew extends TimerTask {
private Statement s;
String currentScode;
ResultSet rs;
Timer mrmr;
//==================================================================
public Timew(String currentScode) {
try{s=Atsql.c3.createStatement(); }catch (Exception e){e.printStackTrace();}
this.currentScode=currentScode;
mrmr=new Timer();
mrmr.schedule(this,1000,10000);
}
public void run() {
try{
rs = s.executeQuery("SELECT time,burned FROM smanager WHERE scode='"+currentScode+"'");
rs.next();
int dbtime=rs.getInt("time");
String burned=rs.getString("burned");
if (dbtime>0&burned.equals("no"))
{dbtime--;
s.executeUpdate("UPDATE smanager SET time="+dbtime+" WHERE scode='"+currentScode+"'");
}
else {
s.executeUpdate("UPDATE smanager SET burned='yes' WHERE scode='"+currentScode+"'");
mrmr.cancel();
}
}catch (Exception e){e.printStackTrace();}
}
}انظر كيف يغير الحالة الى محروق اي انه احترق و النظام يولد رموز سرية تدعى scode و هي تلحق بالمستخدم عند كل دخول و لبين ما يخلص و يطلع بظل مرافقه و هذا من اجل اسباب امنية و من اجل تتبع ما عمله في هذا الدخول فقط
و هذا كلاس توليد الرموز السرية
package ws.ramy;
// Ramy Al-isawi e-mail: ramy@ramy.ws
public class RandomCode
{
private long newnum=0;
private String withnum;
private long withlong=0;
private String finnum;
private int clnum;
//==========================My Counter================================
public RandomCode(int gclnum)
{
switch(gclnum){
case 3: withnum="999";break;
case 4: withnum="9999";break;
case 5: withnum="99999";break;
case 6: withnum="999999";break;
case 7: withnum="9999999";break;
case 8: withnum="99999999";break;
case 9: withnum="999999999";break;
case 10: withnum="9999999999";break;
case 11: withnum="99999999999";break;
case 12: withnum="999999999999";break;
case 13: withnum="9999999999999";break;
case 14: withnum="99999999999999";break;
case 15: withnum="999999999999999";break;
case 16: withnum="9999999999999999";break;
}
withlong=Long.parseLong(withnum);
clnum=gclnum;
}
public long nextLong()
{
newnum=Math.round(Math.random()*withlong);
finnum=newnum+"";
while(finnum.length()<clnum)finnum=finnum+"0";
return Long.parseLong(finnum);
}
public String nextString()
{
newnum=Math.round(Math.random()*withlong);
finnum=newnum+"";
while(finnum.length()<clnum)finnum=finnum+"0";
return finnum;
}
}و هذا ما يجري عند دخول المستخدم فعلا
public String getScode(String id, String ip)
{ String scode="";
try{
scode= ran.nextString();
s.executeUpdate("INSERT INTO smanager (scode,id,time,logtime,ip ) " +
"VALUES ('"+ scode +"','"+id+"','"+10+"','"+date+"','"+ip+"')");
new Timew(scode);
}catch (Exception e){e.printStackTrace();}
return scode;
}لاحظ
new Timew(scode);
و هكذا يخصص مؤقت زمني يتابع حالة هذا الرمز السري و لاحظ كيف انه عطاه وقت مبداي بقيمة 10 دقائق على ما يبدو
المشكلة انني كاتبه من كذا سنة و ناسي شلون كنت بفكر بوقتها :P
و هذا لاني لا اكتب توثيق ابدا و هذا اكبر غلط طبعا
Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why
هههههههههههه شكرا رامي على ردك بس بال AJAX بتقدر تعمل هاد الشي صح بيجوز انو هي الطريقة مو عملية كتير بس ممكن الواحد يعملها لانو بال AJAX بتقدر تساوي listner
تم تعديل هذه المشاركة بواسطة mofeed chaar في 11 أبريل 2008 في 19:25
mofeedchaar@hotmail.com
كنت رح اتحداك و اقلك عملها بس خلص بعرفك ضعيف و مالك قد حكيك :) و عم قلك بدي الفلم يا خاين :)
Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why
من خلال تتبعي للكود .. طرات علي بعض الأسئلة :
1-
public String getScode(String id, String ip
من اين احصل على قيم الـ ip و id التي ارسلت للفنكشن ؟؟
2-
"VALUES ('"+ scode +"','"+id+"','"+10+"','"+date+"','"+ip+"')");
ماهي قيمة الـ date المرسلة ؟؟
3- return scode;
مافائدة ارجاع قيمة scode ??
4- مافهمته هو ان قاعدة البيانات تحتوي على جدول smanager
والاعمدة في هذا الجدول هي :
burned من نوع string
scode من نوع string
id من نوع string
time من نوع int
logtime لم اعرف النوع !! وهل ممكن الاستغناء عن هذا العمود ؟؟
تم تعديل هذه المشاركة بواسطة بسوووم في 12 أبريل 2008 في 11:09
الـ id
هو رقم العضوية او ماشابه في حالتك
الـ ip
ابحث قليلا و ستجد الطريقة ( يجب ان تتعذب قليلا في تحصيل المعلومة حتى لا تنساها مطلقاً)
قيمة date هي تاريخ او ما شابه احذفه اذا لم تجد له ضرورة عندك
و الفائدة من ارجاع القيمة هي امر يخص برنامجي هناك من يحتاجه لكي يتعامل فيه فانا حاليا لم اعد افهم ما تريد الفكرة و اظنها و صلت و الطريقة ووصلت هل تريد مناقشة كل سطر من الواضح انه لا يتعلق بالفكرة!! مالذي يؤثر عندك اذا كان يعيد او لا يعيد الفكرة في توليد الاكواد و المؤقت وصلتك طبعا هناك اشياء لا تخص الفكرة لذلك تجاهلها رجاء ..
يمكن الاستغناء عن اي شئ يمكنك الاستغناء عنه!!
انت لديك كل ما تحتاجه لعمل ما تريد اذا عندك اسئلة تخص الفكرة و في صمميمها فلا مانع و لكن اذا عندك اسئلة اخرى مثل كيف نعرف الـ IP ابحث اولا و اذا لم تجد افتح موضوع جديد
فقط اريد ان اوصل لك فكرة اننا هنا نساعد لدرجة كبيرة ولكن لا نقدم لك الحل على طبق من ذهب ..
و اعتذر عن اي قساوة في كلامي و لكن هكذا تجري هنا الامور و هذا لمصلحتك اولا
Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why
اخي رامي العيساوي .. أشكر لك تعاونك وسرعة استجابتك ..
نادر من يمتلك هذه الصفات .. وخصوصا في المنتديات ..
واعتذر عن كثرة أسئلتي .. والتي قد تخرج عن مناقشة الفكرة ..
شكراً لكل من تفاعل معنا ..
ولا يهمك ...
بس اريد طلب منك فبعد ان تقوم ببرمجة ما تريد ان تضع الكود هنا لكي يصبح مرجع للجميع في المستقبل و هكذا تساهم في اثراء القسم فانا لا اريد شكر لي و فرحتي الوحيدة هي في ازدهار القسم و شمله لمواضيع عديدة..
ارجو ان تلبي رغبتي و ساكون انا لك من الشاكرين
Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why
جرب
session.getLastAccessedTime()
شكرا ..