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

هل ممكن السيرفر يشغل دالة في الكود الخاص ب الكلينت

بدأه progdo32 في 15 يونيو 2011 · 2 رد · 1,060 مشاهدة · في برمجة الشبكات والتطبيقات الموزعة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

مش عندي اي خبر في مجال الشبكات لدرجة اني مش عارف اعمل بحث :blush:

اريد معرفة الموضيع التي ابحث فيها

سوف اقوم بعمل برنامج بالسي شارب والسكول وهناك جهازين واحد بيعمل اضافة في الداتا بيز و الأخر بيعرض الداتا

انا عاوز اول ما يحصل اضافة يتم تغير الداتا المعروضة اوتوماتيكيا علي شاشة الجهاز الاخر

يمكنني عمل ذلك باستخدام التيمر (timer)

فهل هناك طريقة اخرى ؟؟

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

1- ان يقوم الجهاز الاول بتشغيل الكود الخاص بعرض الداتا على الجهاز الثاني (وهذا ما اريده )

2- ان يرسل الجهاز الاول رسالة تفيد بانه تم اضافة بيانات جديده و بالتالي يقوم المستخدم علي الجهاز الثاني بعمل اعادة تحميل عندما يرى هذة الرسالة

#2
اقتباس
1- ان يقوم الجهاز الاول بتشغيل الكود الخاص بعرض الداتا على الجهاز الثاني (وهذا ما اريده )

هذه الفكره هي نفسها الفكره التاليه مع تغيير إسلوب الكتابه.

اقتباس
2- ان يرسل الجهاز الاول رسالة تفيد بانه تم اضافة بيانات جديده و بالتالي يقوم المستخدم علي الجهاز الثاني بعمل اعادة تحميل عندما يرى هذة الرسالة

الفكره تقوم على اكثر من محور و هم: سنطلق على الجهاز الأول A و الجهاز الثاني B

1- الجهاز A متصل بقاعدة البيانات و يقوم بالإضافه عليها.

2- الجهاز B متصل بقاعدة البيانات و يقوم بالعرض منها.

3- الجهاز A متصل بالجهاز B و يقوم بتنبيهه بإضافة بيانات جديده، حينها يقوم B بتنفيذ الخطوه 2.

الخطوات 1 و 2 اعتقد انك على درايه بهم لذا سأتخطاهم و اتكلم عن الخطوه 3:

الجهاز A بالنسبه لنا يمثل جهاز سرفر و ذلك لأنه المسئول عن اضافة البيانات و تنبيه الأجهزه الأخرى لوصولها لذا لابد ان يحصل على IP ثابت على مستوى الشبكه، عندما تبدأ الأجهزه الأخرى عملها سترسل رساله للجهاز A بالـ IP ألخاص بها - فى حالتنا هذه الجهاز B هو من سيقوم بإرسال الـ IP الخاص به - حينها سيقوم الجهاز A بحفظ هذا الـ IP لديه و بعد كل عملية اضافه او تعديل سيقوم بإرسال رساله تنبيهيه لكل الـ IPs الموجوده لديه بالقائمه ليقوموا بتحديث محتوياتهم.

الإرسال و الإستقبال من كلا الطرفين يمكن ان يتم بإستخدام بروتوكول TCP أو UDP.

حيث انك تستخدم الدوت نت فأغلب العمل سيتم بإستخدام كل او بعض من الفئات التاليه:

TcpListener, TcpClient, UdpClient, Socket, NetworkStream

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 15 يونيو 2011 في 15:11

مدونتي: C++ Tips and Tricks

#3

تمام، كما ذكر محمد علاء

باعتبار أن البيانات المتبادلة ستكون عبارة عن رسالة بسيطة لتعلم الطرف الثاني أن عليه قراءة المحتوى من قاعدة البيانات، فأنصحك باستخدام TCP.

مسألة إنشاء TcpListener و TcpClient أمر سهل، وإرسال رسالة على الـ Stream الذي تحصل عليه من NetworkStream أمر سهل أيضاً،

لكني سأنصحك بالاستفادة من الكود التالي:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

// This file contains all messages defined that are passed back and forth between the client and the server.
// three messages are defined for the sole of this project only.

namespace Messages
{
	// Helper functions for message serialization and deserialization.
	public static class Util
	{
    	// Serializes an object to a binary representation, returned as a byte array.
    	public static byte[] Serialize(object Object)
    	{
        	using (MemoryStream stream = new MemoryStream())
        	{
            	new BinaryFormatter().Serialize(stream, Object);
            	return stream.ToArray();
        	}
    	}

    	// Deserializes an object from a binary representation.
    	public static object Deserialize(byte[] binaryObject)
    	{
        	using (MemoryStream stream = new MemoryStream(binaryObject))
        	{
            	return new BinaryFormatter().Deserialize(stream);
        	}
    	}
	}

	// A message to pass notes/errors/etc
	[Serializable]
	public class StringMessage
	{
    	public string message;
	}

	// A message with connected clients information
	[Serializable]
	public class FilesList
	{
    	// The files names
    	public List<string> Name = new List<string>();

    	// The files size
    	public List<int> Size = new List<int>();
	}

	[Serializable]
	public class FilePacket
	{
    	// The file name
    	public string Name;

    	// The file content
    	public byte[] Stream;
	}

	[Serializable]
	public class Chunk
	{
    	// The file name
    	public string Name;

    	// The chunk sequence number
    	public int Seq;

    	// The packet complete size
    	public int Size;

    	// The chunk data
    	public byte[] Data;
	}
}

هذا جزء من مشروعي لمادة برمجة التطبيقات الشبكية، وهي عبارة عن مكتبة DLL يمكنك استخدامها للقيام بعملية Serialize و Deserialize لأغراض قمت بتعريفها مسبقاً، حيث أقوم فيها بتعريف class من نوع StringMessage (وهو كل ما ستحتاجه وسأترك لك باقي الأمثلة للاستفادة منها في حال أردت إنشاء complex message)

سأفترض أنك قمت باستلام سلسلة من البايتات من الجهاز الأول بنجاح،

سنحتاج أولاً لتنفيذ Deserialize على الرسالة:

object message = Messages.Util.Deserialize(e.Result);
Messages.StringMessage stringMessage = message as Messages.StringMessage;
if (stringMessage != null)
{
if (message == "UPDATE")
{
.. do update
}
}

ولنفرض أن الجهاز الأول يريد إرسال رسالة للجهاز الثاني:

Messages.StringMessage stringMessage = new Messages.StringMessage();

stringMessage.message = "UPDATE";

byte[] binaryObject = Messages.Util.Serialize(stringMessage);

socket.WriteAsync(binaryObj);

هذا الأمر سيجعل عملية تبادل الرسائل بين الطرفين سهلة وواضحة.

طبعاً الجهاز الأول سيكون client وسيحتاج لـ TcpClient والثاني server وسيحتاج لـ TcpListener.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

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

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

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

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

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