الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تطوير خادم شارك

بدأه علاء الصالحي في 8 يوليو 2011 · 25 رد · 2,797 مشاهدة · في قسم المشاريع الجماعية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هذا الموضوع لنقاش أي شيء له علاقة بتطوير خادم شارك

لكي يتحمل أكبر ضغط ممكن من الطلبات

كنت بدأت النقاش في هذا الموضوع هنا وفي الردود التي تليه

هل من آراء أو اقتراحات حول الموضوع؟

وأنا أقرأ في الشيفرة وجدت هذا

	public ServerListen() {
    	try {
        	System.out.println("JKelany Chat Listen to ip " + InetAddress.getLocalHost() + ":" + PORT);
        	OutputFrame.appendText("JKelany Chat Listen to ip " + InetAddress.getLocalHost() + ":" + PORT);
        	serverSocket = new ServerSocket(PORT);
        	while (true) {
            	HandleClientRequest handleClient = new HandleClientRequest(serverSocket.accept());
            	handleClient.start();
            	emailsSockets.add(handleClient);
            	informAll();
        	}
    	} catch (IOException ex) {
        	OutputFrame.appendText(ex.getMessage());
    	}

	}

قمت بتغييره إلى الشكل التالي

	public ServerListen() {
    	try {
        	System.out.println("Sharek Listen to ip " + InetAddress.getLocalHost() + ":" + PORT);
        	OutputFrame.appendText("Sharek Listen to ip " + InetAddress.getLocalHost() + ":" + PORT);
        	serverSocket = new ServerSocket(PORT);
    	} catch (IOException ex) {
        	OutputFrame.appendText(ex.getMessage());
    	}

	}

	public void startListen() {
    	while (true) {
        	try {
            	HandleClientRequest handleClient = new HandleClientRequest(serverSocket.accept());
            	handleClient.start();
            	emailsSockets.add(handleClient);
            	informAll();
        	} catch (IOException ex) {
            	OutputFrame.appendText(ex.getMessage());
        	}
    	}
	}

طبعاً واضح هنا أن وضع تكرار داخل عملية الباني غير محبذة بالمرة

وغير معروف سلوك الآلة الإفتراضية تجاه هكذا شيء

نقطة أخرى

في الدالة informAll

	public static void informAll() {
    	try {
        	for (int i = 0; i < emailsSockets.size(); i++) {
            	emailsSockets.get(i).notifyClient();
        	}
    	} catch (Exception e) {
        	OutputFrame.appendText(e.getMessage());
    	}
	}

هذه الشيفرة مسؤولة عن إعلام المستخدمين الموجودين على النظام بأن هناك شخص جديد دخل على الخادم

مبدئياً الفكرة نفسها ليست جدية لأن هذا يسمح للمراقب على الشبكة عند العميل بمعرفة من دخل على النظام حتى ولو لم يكن له علاقة به

التنفيذ أيضاً للفكرة غير جيد

لأن خطأ في الدالة notifyClient لأي عميل يعني أن العملاء الآخرين لن يتم إخبارهم أيضاً

أقترح إعلام الأشخاص الذي يكون الشخص الجديد على النظام صديقاً لهم

عدى عن ذلك لا تعلمهم

ويجب وضع الtry-catch حول الجملة نفسها وليس حول التكرار ككل أي كالتالي

	public static void informAll() {
    	for (int i = 0; i < emailsSockets.size(); i++) {
        	try {
            	emailsSockets.get(i).notifyClient();
        	} catch (Exception e) {
            	OutputFrame.appendText(e.getMessage());
        	}
    	}
	}

وبدلاً من عمل ArrayList في الفئة اقترح HashMap لأنها ستسهل البحث على المستخدمين بأسمائهم

في انتظار سماع آراءكم حول الموضوع والمناقشة

قمت ببعض التعديلات البسيطة

قوموا بسحبها check out من خادم SVN

تحياتي

تم تعديل هذه المشاركة بواسطة علاء الصالحي في 8 يوليو 2011 في 21:06

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#2

في الفئة HandleClientRequest

هناك مشكلة في التعامل مع الـ Exception

	public HandleClientRequest(Socket client) {
    	this.client = client;
    	getStreams();
	}

	private void getStreams() {
    	try {
        	outputStream = new ObjectOutputStream(client.getOutputStream());
        	inputStream = new ObjectInputStream(client.getInputStream());
    	} catch (IOException ex) {
        	OutputFrame.appendText(ex.getMessage());
//        	Logger.getLogger(HandleClientRequest.class.getName()).log(Level.SEVERE, null, ex);
    	}
	}

لاحظوا معي أنه تم الإمساك بالخطأ ومعالجته بإضافته إلى الخادم

لكن النقطة أن الفئة SeverListen لم تعرف بهذه المشكلة ولم تقم بمعالجتها لديها

لذا قامت بإضافة ببدأ الخيط مع أنه لا فائدة منه وقامت بعد ذلك بإضافة المعبر socket إلى القائمة الخاصة بالمعابر وهذا خطأ استراتيجي

قمت بتعديل الشيفرة لتصبح على النحو التالي

	public HandleClientRequest(Socket client) throws IOException {
    	this.client = client;
    	getStreams(client);
	}

	private void getStreams(Socket client) throws IOException {
    	outputStream = new ObjectOutputStream(client.getOutputStream());
    	inputStream = new ObjectInputStream(client.getInputStream());
	}

لاحظوا معي أن الخطأ عند حصوله سيتم رفعه إلى الباني

الذي بدوره سيقوم برفعه إلى ServerListen والذي سيقوم بمعالجته بطريقة صحيحة

ولن يقوم بعمل أي عمليات خاطئة أو غير ضرورية وفي النهاية سيضيف الخطأ على المتتبع logger

كالعادة قوموا بسبح النسخة من SVN

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#3

هاشارك معاك واشوف التعديلات بكرا ان شاء الله

لان انا لازم انام دلوقتى عندى انترفيوو علشان التدريب بكرا

ربنا يسترها ههههههههه

دعواتك :)

Software Developer
Mahmoudkelany.com


 

#4

هناك بعض الكائنات لا حاجة لإنشاءها وكل الموضوع أنها كائنات صورية فقط لعمل serialization لها

قمت بتحويلها إلى كائنات متحودة Singleton Objects

وهي BadLoginMessage و EmailNotSigninMessage

قمت برفع النسخة على SVN

يمكنك سبحها من هناك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#5

انت وضعت الداله

startListen

لكى توضح او تحدد متى يبدا عندما تستدعيها

تقصد وضع الكود بين try...catch

اعتقد مفيش مشكله من ذلك

بالنسبه للداله informAll

انا عملتها انه بينبه كل المستخدمين الموجودين على الشبكه ان يقوموا بتحميل بيانات اصدقائهم

قد طبعا يكون مكلف

بالنسبه للخطأ لو حصل طبعا هيتم مسكه بين try...catch

وبعدين يكمل على المستخدم التالى

تقترح HashMap

لكن هتعمل HashMaping بين ايه وايه ؟؟

بالنسبه للـ Exception

الخاص بالـ HandleClientRequest

فعلا عندك حق

لكن اعذرنى انا كنت اعمل لوحدى وكان الشغل عبء عليا بالاضافه لمواد الكلية

لم اتفهم ما قومت بعمله

public static final EmailNotSigninMessage EMAIL_NOT_SIGNIN_MESSAGE = new EmailNotSigninMessage();

لانى لم افهم ما هى الـ Singleton

لان انا اتسالت فيها النهارده ومش عرفتها طبعا هههههه

انا سحبت البرنامج

وجارى عملية التجربه

Software Developer
Mahmoudkelany.com


 

#6

انا بفكر اعمل رساله واحده لكلا من

BadLoginMessage

EmailNotSigninMessage

AddFriendConfirmMessage

LogoutConfiremMessage

MultiEmailLoginMessage

بحيث يكون فيه حقول Static توضح نوع كل واحده

يعنى مثلا

كدا

public class GeneralMessage extends Message {

	public static final String BAD_LOGIN = "BadLogin";
	public static final String EMAIL_NOT_SIGN_IN = "EmailNotSignIn";
	public static final String ADD_FRIEND_CONFIRM = "AddFriendConfirm";
	public static final String LOG_OUT_CONFIRM = "LogOutConfirm";
	public static final String MULTI_EMAIL_LOG_IN = "MultiEmailLogIn";
	private String message;
	private String type;

	public GeneralMessage(String message, String type) {
    	this.message = message;
    	this.type = type;
	}

	/**
 	* @return the message
 	*/
	public String getMessage() {
    	return message;
	}

	/**
 	* @param message the message to set
 	*/
	public void setMessage(String message) {
    	this.message = message;
	}

	/**
 	* @return the type
 	*/
	public String getType() {
    	return type;
	}
}

اعتقد دا هيوفر علينا رسايل كتير لان كدا الرسايل كدا هتكون كتير اوووى

هاعدله وهارفعه ان شاء الله

Software Developer
Mahmoudkelany.com


 

#7

عندك مشكله

انك قومت بتغييير اسم الـ package فى السيرفى الى com.sharek

لكن المشكله ان الSerialization لابد وان تكون اسم الClass فى نفس اسم الpackage فى كلا من العميل والخادم

انا قومت بتغيير اسم الـ packages الخاصه بالعميل وظبطت موضوع الرسايل

انا عملت commit ليهم على المخزن

يمكنكم سحبهم من المخزن الان وان شاء الله يعمل بكل قوة :)

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 9 يوليو 2011 في 23:19

1

Software Developer
Mahmoudkelany.com


 

#8

قومت بتطوير الاستعلام على الصوره الخاصه بالمستخدم للحصول على الصور الخاصه به وبالاصدقاء

كانت لدى مشكله لدي الـ Blob على انه غير Serializable فبالتالى قومت بعمل الكلاس RetrievePhoto

المشكلة بتاعتها ان العميل ممكن يعرف ايه الللى بيحصل او ايه اسم قاعده البيانات وكلمه السر لان لازم استخدم الفئة DbService

فبالتالى قومت بتعديلها والزاله الكلاس RetrievePhoto والاعتماد على اضافه الداله

public static ImageIcon getImageIcon(Blob photo) throws SQLException {
    	ImageIcon icon = null;
    	if (photo == null) {
        	return null;
    	} else {
        	byte[] image = photo.getBytes(1, (int) photo.length());
        	if (image == null) {
            	return null;
        	} else {
            	icon = new ImageIcon(image);
        	}
    	}
    	return icon;
	}

بداخل الفئة EmailService

لكى تقوم باعادة الصوره على انها عباره عن ImageIcon التى تعدم الـ Serialization

واضافه الـ

private ImageIcon icon;
/**
 	* @return the icon
 	*/
	public ImageIcon getIcon() {
    	return icon;
	}

	/**
 	* @param icon the icon to set
 	*/
	public void setIcon(ImageIcon icon) {
    	this.icon = icon;
	}

فى كلا من Email ,FriendsEmails

فى كلا العميل والخادم

والحمدلله تعمل الان بكل كفاءة

بالتالى كدا حافظت على السريه الخاصه بقاعده البيانات

تم عمل commite للمشاريع

يمكنك الان سحبهم من المخزن

وشكرا

1

Software Developer
Mahmoudkelany.com


 

#9
Mahmoud Kelany كتب:

انت وضعت الداله

startListen

لكى توضح او تحدد متى يبدا عندما تستدعيها

تقصد وضع الكود بين try...catch

اعتقد مفيش مشكله من ذلك

أنا وضعت الدالة لإزالة التكرار من الباني الخاص بـ ServerListen والسبب في ذلك

هو أن الباني مكان لإنشاء الكائن وأعتقد أن له معاملة خاصة في الآلة الافتراضية VM

لذا أردت أن أجعله واضحاً ولا يحتوي على تكرار يبقيه فترة طويلة

Mahmoud Kelany كتب:

بالنسبه للداله informAll

انا عملتها انه بينبه كل المستخدمين الموجودين على الشبكه ان يقوموا بتحميل بيانات اصدقائهم

قد طبعا يكون مكلف

النقطة هنا هل يقوم الجميع بتحميل كافة أصدقائهم لماذا لا تخبر أصدقاء الشخص الجديد بتواجده وينتهي الأمر

Mahmoud Kelany كتب:

بالنسبه للخطأ لو حصل طبعا هيتم مسكه بين try...catch

وبعدين يكمل على المستخدم التالى

في الشيفرة قبل التعديل أي خطأ سيحصل سيتوقف الخادم عن إبلاغ المستخدمين بوجود شخص جديد

بمجرد حصول أي خطأ لدى أي مستخدم يتم إعلامه

على العكس مع التعديل

الذي يقوم بتسجيل ملاحظة عن الشخص الذي لديه مشكلة ويكمل عمله على باقي المستخدمين

Mahmoud Kelany كتب:

تقترح HashMap

لكن هتعمل HashMaping بين ايه وايه ؟؟

بين المنفذ Socket الخاص بالعميل واسم العميل

Mahmoud Kelany كتب:

بالنسبه للـ Exception

الخاص بالـ HandleClientRequest

فعلا عندك حق

لكن اعذرنى انا كنت اعمل لوحدى وكان الشغل عبء عليا بالاضافه لمواد الكلية

لماذا أعذرك يا محمود؟

نحن نعتمد على شيفرتك ويجب علينا شكرك وليس ملامتك

لا تأخذ الأمر على محمل شخصي وصدقني لو قرأت شيفرة كتبتها أنا لنقدتها لأن الإنسان لا ينفتئ يخطئ

Mahmoud Kelany كتب:

لم اتفهم ما قومت بعمله

public static final EmailNotSigninMessage EMAIL_NOT_SIGNIN_MESSAGE = new EmailNotSigninMessage();

لانى لم افهم ما هى الـ Singleton

لان انا اتسالت فيها النهارده ومش عرفتها طبعا هههههه

Singleton هو نمط مشهور للتقليل من الكائنات المنتجة سواءاً في حالة عدم الحاجة لكائن جديد مثل حالتنا هنا

أو المصادر القليلة المتاحة

اطلع على هذه المقالة النمط الأول:نمط الورقة الوحيدة Singleton

سأطلع على باقي ردودك اليوم إن شاء الله

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#10
Mahmoud Kelany كتب:

عندك مشكله

انك قومت بتغييير اسم الـ package فى السيرفى الى com.sharek

لكن المشكله ان الSerialization لابد وان تكون اسم الClass فى نفس اسم الpackage فى كلا من العميل والخادم

انا قومت بتغيير اسم الـ packages الخاصه بالعميل وظبطت موضوع الرسايل

انا عملت commit ليهم على المخزن

يمكنكم سحبهم من المخزن الان وان شاء الله يعمل بكل قوة :)

اه يا معلم ماشية معاك حلاوة

أنا لم أنتبه على العميل بالمرة

لا زلت في طور تشريح الخادم

Mahmoud Kelany كتب:

قومت بتطوير الاستعلام على الصوره الخاصه بالمستخدم للحصول على الصور الخاصه به وبالاصدقاء

كانت لدى مشكله لدي الـ Blob على انه غير Serializable فبالتالى قومت بعمل الكلاس RetrievePhoto

المشكلة بتاعتها ان العميل ممكن يعرف ايه الللى بيحصل او ايه اسم قاعده البيانات وكلمه السر لان لازم استخدم الفئة DbService

فبالتالى قومت بتعديلها والزاله الكلاس RetrievePhoto والاعتماد على اضافه الداله

public static ImageIcon getImageIcon(Blob photo) throws SQLException {
    	ImageIcon icon = null;
    	if (photo == null) {
        	return null;
    	} else {
        	byte[] image = photo.getBytes(1, (int) photo.length());
        	if (image == null) {
            	return null;
        	} else {
            	icon = new ImageIcon(image);
        	}
    	}
    	return icon;
	}

بداخل الفئة EmailService

لكى تقوم باعادة الصوره على انها عباره عن ImageIcon التى تعدم الـ Serialization

واضافه الـ

private ImageIcon icon;
/**
 	* @return the icon
 	*/
	public ImageIcon getIcon() {
    	return icon;
	}

	/**
 	* @param icon the icon to set
 	*/
	public void setIcon(ImageIcon icon) {
    	this.icon = icon;
	}

فى كلا من Email ,FriendsEmails

فى كلا العميل والخادم

والحمدلله تعمل الان بكل كفاءة

بالتالى كدا حافظت على السريه الخاصه بقاعده البيانات

تم عمل commite للمشاريع

يمكنك الان سحبهم من المخزن

وشكرا

حلو يا محمود

بس الي مش حلو أنه لا يصح أن يكون للعميل تعامل مباشر مع قاعدة البيانات

هل هناك سبب يدعو إلى ذلك

تحياتي

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#11
علاء الصالحي كتب:

اه يا معلم ماشية معاك حلاوة

أنا لم أنتبه على العميل بالمرة

لا زلت في طور تشريح الخادم

حلو يا محمود

بس الي مش حلو أنه لا يصح أن يكون للعميل تعامل مباشر مع قاعدة البيانات

هل هناك سبب يدعو إلى ذلك

تحياتي

تحياتي

ماشى يا ريس بس لازم اى تغيير يحصل فى الخادم يكون ليه تاثير على العميل واى تعديل لازم يكون مقابل ليه تعديل هناك

ربنا معاك ياريس فى التطوير

ما هو انا دلوقتى حليت المشكله دى

المشكله ان انا لم كنت بعمل موضوع الصور و كانت قاعده البيانات موجوده عند الـ Server

فانا عاوز احصل على الصور فكنت طبعا بسترجعها على انها Blob و هى عباره عن Interface

ولازم الموضوع يكون Serializtion فكنت عاوز اتعامل معاه بأقصى سرعه لكى اقوم بالانتهاء من المشروع

فلجأت ان اقوم بالاستعلام على الصور من لدى العميل

لكن فكرت بالامس وجدت ان الـ ImageIcon بالشكل التالى

ImageIcon Implemented Serializable

فبالتالى المشكله اتحلت

احصل على الصوره من قاعده البيانات عباره عن Blob وبعد ذلك اقوم بتحويلها لـ ImageIcon

وارسلها مع البيانات

وبالتالى حافظت على قاعده البيانات والعميل لا يحق له الاطلاع على قاعده البيانات او اى شىء

Software Developer
Mahmoudkelany.com


 

#12

السلام عليكم

محمود حاولت تشغيل البرنامج لفحص شيء معين

لكني حصلت على الخطأ التالي

java.lang.NullPointerException
	at com.sharek.gui.LoginFrame.loadSittings(LoginFrame.java:74)
	at com.sharek.gui.LoginFrame.<init>(LoginFrame.java:69)
	at com.sharek.main.Main$1.run(Main.java:26)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

ما هو هذا الملف JKelanyChat.xml؟

أعتقد أن المشكلة تدور حول هذه الفئة XMLBean

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#13

هذا الملف يقوم بعملية حفظ اسم المستخدم وكلمة المرور

الذى ظهر لك نتيجه تغيير الـ packages لازم على الاقل يتم الغاءه مره واحده

وبعد ذلك تقوم بتفعيل استدعاءه

بالفعل هذا الخطأ تعاملت معاه لكن اطبع رساله الخطا

وهتلاقى البرنامج شغال معاك عادى بعد ما بيظهر الخطأ

ان اردت التعامل معاه

فقط قوم بعدم تفعيل الدالة loadSittings فى الـ LoginFrame

وبعد ان تقوم بانهاء البرنامج لاول مره قم بتفعيلها مره اخرى

اذا قومت باعاده تشغيل البرنامج ستجدة يعمل دون اى استثناءات

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 12 يوليو 2011 في 00:41

Software Developer
Mahmoudkelany.com


 

#14

السلام عليكم

قمت بتغيير بعض أسماء الفئات مثل ServerListen إلى Server و HandelClientRequest إلى Client

كنت أعمل على تحويل الـ ArrayList إلى HashMap

واعتمد على emaild كمفتاح و الفئة Client ككائن

لدي سؤال هنا لماذا في الرسالة ChatMessage استخدمت البريد ولم تستخدم ال emailid؟

هل يمنني استبدال البريد برقم البريد؟

إذا كان لا يمكنني هل هناك مانع من إضافة رقم البريد إلى الرسالة؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#15
علاء الصالحي كتب:

السلام عليكم

قمت بتغيير بعض أسماء الفئات مثل ServerListen إلى Server و HandelClientRequest إلى Client

كنت أعمل على تحويل الـ ArrayList إلى HashMap

واعتمد على emaild كمفتاح و الفئة Client ككائن

لدي سؤال هنا لماذا في الرسالة ChatMessage استخدمت البريد ولم تستخدم ال emailid؟

هل يمنني استبدال البريد برقم البريد؟

إذا كان لا يمكنني هل هناك مانع من إضافة رقم البريد إلى الرسالة؟

تحياتي

وعليكم السلام ورحمه الله وبركاته

تمام مفيش مشكله فى تغير الاسماء

انا عدلت لك موضوع الـ emailId بدلا من email

عدلت ذلك فى العميل والخادم

يمكنك سحبهم الان من المخزن

Software Developer
Mahmoudkelany.com


 

#16

السلام عليكم

قمت بتعديل النسخة بتبديل الـ ArrayList إلى HashMap

وإجراء التعديلات عليها

بإمكانك سحب التعديلات من المخزن بالطبع لو كان هناك من يهتم

وأنا أشك في ذلك laugh.gif

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#17
علاء الصالحي كتب:

السلام عليكم

قمت بتعديل النسخة بتبديل الـ ArrayList إلى HashMap

وإجراء التعديلات عليها

بإمكانك سحب التعديلات من المخزن بالطبع لو كان هناك من يهتم

وأنا أشك في ذلك laugh.gif

تحياتي

وعليكم السلام ورحمه الله وبركاته

كفايه ان انا معاك هههههههه

هاسحبها اهووو واشوف التعديلات

Software Developer
Mahmoudkelany.com


 

#18

هناك مثل يقول اسمع جعجعة ولا أرى طحناً

أرسل إليكم رسالة فيرد عليه ثلاثة من أصل ستة يعتذرون بانشغالاتهم ويقولون بأنهم سيكونون معنا في أقرب وقت -وكأني خالي أشغال-

وعلى الأرض لا أرى إلاك وأراك تجيب على كلامي حول مشروعك ولا تضيف

لكني ما تعلمت أن أيأس لذا أنا هنا أحاول

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#19
علاء الصالحي كتب:

هناك مثل يقول اسمع جعجعة ولا أرى طحناً

أرسل إليكم رسالة فيرد عليه ثلاثة من أصل ستة يعتذرون بانشغالاتهم ويقولون بأنهم سيكونون معنا في أقرب وقت -وكأني خالي أشغال-

وعلى الأرض لا أرى إلاك وأراك تجيب على كلامي حول مشروعك ولا تضيف

لكني ما تعلمت أن أيأس لذا أنا هنا أحاول

تحياتي

امممم

معلش حصل خير

انا هاظبط النسخه فى شويه حاجات كدا وهارفعها تانى ان شاء الله

هالغى موضوع الـ ArrayList اللى فوق اللى بتسجل الـ Clients

وهاستخدم الـ hashmap الخاصه بيك

بالفعل عدلتها لكن هاقوم بمسح سريع على العميل والخادم

Software Developer
Mahmoudkelany.com


 

#20

في انتظارك حتى تنتهي من مسحك

حتى أعاود التعديل على الخادم

بالمناسبة ألا تلاحظ معي أنه لا يتم قتل أي خيط في الخادم

بمعنى أن العميل يبقى موجود حتى بعد عمله لـ signout

هل هناك شيء لم ألاحظه؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#21

يمكنك الان العمل على الخادم والعميل

بالنسبه للخيوط يتم قتل الخيط بعد عملية الـ Signout

يبدا الخادم بأربعه خيوط

خيط للـ main program

وخيط للعملية الاستماع لطلبات العميل

وخيط لشاشه المراقبة Log file

وخيط للـ tray icon

وكل عميل يدخل ينشأ له خيط جديد

وفى نهايه كل عميل يتم انهاء الخيط بطريقه تلقائيه بسبب انهاء عملية الـ while

 while ((messageFromClient = (Message) inputStream.readObject()) != null) {
                	messageToClient = processProtocolInput(messageFromClient);
                	outputStream.writeObject(messageToClient);
                	outputStream.flush();
            	}

الموجوده داخل الخيط الذى تم انشاءه لكل عميل

اضفت زرار للـ OutputFrame لمعرفه عدد الخيوط

كل مره تضغط عليها يعطيك عدد الخيوط

حاول ان تستخدمه فبدايه عمل الخادم ومره بعد تشغيل اكثر من عميل ومره اخرى بعد اغلاقهم

Software Developer
Mahmoudkelany.com


 

#22

لا تفترض أن العميل على الخادم الخاص بنا سيكون فقط برنامج العميل الخاص بنا

في المستقبل قد نجعل آخرين يقوموا ببناء عملاء خاص بهم

كما أنك فعلياً كخادم لا تعلم إن كان العميل فعلاً هو عميلنا أم أن هناك من عمل عميل مزور يتصل معاك ويحاكي العميل الأصلي

لذا لا تعتمد على إغلاق العميل للمنفذ الذي بينه وبين الخادم

بالمناسبة ما الذي سيحصل لو قام أحدهم بتسجيل الدخول الخاطئ

وأبقى البرنامج مفتوحاً

هل سيبقى الاتصال بين الخادم والعميل مفتوحاً

الزر الجديد واستخدام الدالة Thread.activeCount لفتة جميلة جداً

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#23
علاء الصالحي كتب:

لا تفترض أن العميل على الخادم الخاص بنا سيكون فقط برنامج العميل الخاص بنا

في المستقبل قد نجعل آخرين يقوموا ببناء عملاء خاص بهم

كما أنك فعلياً كخادم لا تعلم إن كان العميل فعلاً هو عميلنا أم أن هناك من عمل عميل مزور يتصل معاك ويحاكي العميل الأصلي

لذا لا تعتمد على إغلاق العميل للمنفذ الذي بينه وبين الخادم

بالمناسبة ما الذي سيحصل لو قام أحدهم بتسجيل الدخول الخاطئ

وأبقى البرنامج مفتوحاً

هل سيبقى الاتصال بين الخادم والعميل مفتوحاً

الزر الجديد واستخدام الدالة Thread.activeCount لفتة جميلة جداً

تحياتي

انا مش فاهم بصراحه تقصد ايه من اول فقره

بالنسبه لموضوع الاتصال الخطأ من وجهه نظرى الذى فعلتها سيتم اغلاقه

فقط سيبقى الخيط الخاص بالMain Program والخاص بالـ GUI انما خيط الاتصال لا يتم ينتهى بمجرد انه حدث خطأ فالدخول

اكيد ما انا عملت الزر بحيث فى اى وقت اطلب عدد الخيوط

هاعمل مجموعه من المحاولات وانظر الى عدد الخيوط فى كلا من العميل والخادم وسأوافيك بالتقرير

تم التعديل على كلا من الخادم والعميل بناء على اقتراح الاخ وجدى فى الموضوع الخاص بالمشاركة معانا

والحمدلله تمت التعديلات بكل نجاح لكن يحتاج الى التجربه لكى يتم التجربه لمعرفه ان كان هناك اخطاء ام لا

يمكنك سحب النسخه الان من المخزن ( العميل والخادم )

Software Developer
Mahmoudkelany.com


 

#24

المشكله دلوقتى فالخادم

ان لو تم الاتصال وكانت بيانات العميل خطأ

يتم البقاء على الخيط

لكن انا عدلتها والحمدلله

دلوقتى تم التحكم فى الخيوط

يمكنك سحب نسخه الخادم من المخزن

Software Developer
Mahmoudkelany.com


 

#25

أصعب شيء في البرامج المفتوحة يا محمود أن الجميع يعلمون أسلوب عملك

لذا الجميع يستطيعون تعديل البروتكول الخاص بك

حتى يؤدي إلى هلاك الخادم الخاص بك

لكن لو كان الخادم محكم (ولا أقول كامل لأن الكامل لله)

فأنت تقي نفسك ضد هؤلاء الناس

فإن عدلوا على شيفرة العميل وحاولوا طلب الخادم بطريقة خاطئة سيتجاهلهم الخادم

ويؤدي عمله بدون أي مشاكل

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…