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

Send Jdbc Connection Object From Client To Server

بدأه Tigger_it في 10 سبتمبر 2009 · 17 رد · 1,122 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

بدات في تصميم برنامج بسيط عباره عن بنك الكتروني server\client and JDBC واجهتني مشكله وهي كيفه ارسال اوبجيكت من يحتوي علي استعلام من client الي server كي يعمل ال server علي اتمام هذا الطلب وارساله الي ال client ..

كيف ممكن ارسل الابوجيكت من ال client to server لكي يتم هذا الطلب

تحياتي

ab66i830gh93.gif

i25sctz8qnls.jpg

#2

ليست لدي دراية كبيرة ببرمجة الشبكات، لكني رأيت أن الكلاس Socket لديها الميثود getOutputStream() وهي تعيد الOutputStream الذي يمكننا الكتابة فيه

كيف نكتب object إلى هذا الOutputStream؟؟ لدينا الكلاس ObjectOutputStream التي تسمح بكتابة الobjects

يعني ممكن نعمل هكذا


ObjectOutputStream objectOut = new ObjectOutputStream(socketOut);
objectOutput.writeObject(theObjectYouWantToWrite);
 OutputStream socketOut = yourSocket.getOutputStream();

ولا تنسى تعمل try/catch

بالطبع لم أجرب الطريقة، وبانتظار النتيجة :D

#3

استاذ herch ممكن تساعدنى ضرورى جزاك الله خيراً

#4

ليس هاذا قصدي قصدي هو ان يقوم client باختيار ماذا يريد مثلا اذا اراد ان يقوم بعمليه السحب (withdrawal ) سوف يرسل الكلمة هذا الي الserver والسيرفر سوف يقوم بعمل الاجراء علي ال database وبرسل رساله الي client انهو قام بهذا الاجراء ..

ab66i830gh93.gif

i25sctz8qnls.jpg

#5

أخي elmo7tref، سبق أن فتحت موضوعا ووضعت فيه تساؤلك، من عنده جواب فسيجاوبك هناك

----------------------------

هذا مثال بسيط، الclient يرسل بعض الجمل إلى الserver، وهذا الأخير يقوم فقط بطباعتها

Server

	 import java.net.*;
	 import java.io.*;

	 public class Server {
		 public static void main(String[] args) throws Exception {
			 int port = 6666;
			 ServerSocket server = new ServerSocket(port);
			 Socket sockClient = server.accept();
			 BufferedReader reader = new BufferedReader(new InputStreamReader(sockClient.getInputStream()));
			 String line;
			 while ((line = reader.readLine()) != null) {
				 System.out.println(line);
			 }
			 reader.close();
			 sockClient.close();
			 server.close();
		 }
	 }

Client

	 import java.net.*;
	 import java.io.*;

	 public class Client {
		 public static void main(String[] args) throws Exception {
			 InetAddress serverAdr = InetAddress.getLocalHost();
			 int port = 6666;
			 Socket client = new Socket(serverAdr, port);
			 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
			 writer.write("Hi Mr.Server\n");
			 writer.write("How are you?\n");
			 writer.write("That's all\n");
			 writer.write("Bye\n");
			 writer.close();
			 client.close();
		 }
	 }
#6

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

يمكنك أن ترسل النص (مثلا علامة # ثم 123 ) والسيرفر يعرف أن اذا جاء الحرف الأول من الكلاينت علامة # فيستدعي الدالة Add ويرسل لها ما بعد # وهو 123 . ,ومثلا اذا جاء الحرف الأول @ يستدعى الدالة Sub وهكذا ..

طبعا هذا حل كنت أستخدمه في السابق لكنه غير جيد لأنه صعب الفهم + يتطلب عمل parse للنص حتى تحصل على الحرف الأول وتحصل على الرقم التالي ..

الحل الأخر وهو أن ترسل 1 للسيرفر وهنا يعرف السيرفر أنه يجب أن يستدعي الدالة Add وينتظر القيمه التي سترسلها ... وهكذا 2 للعملية الأخرى ..

أيضا هذا الحل غير جيد لأن التعامل الأرقام هكذا يصعب فهم البرنامج ..وأيضا اذا أردت التغيير مثلا 1 لرقم أخر سيحتاج الكثير من التغيير في الكلاينت والسيرفر ..

الحل الأفضل هو عمل ثوابت constant أو نوع معرف Enumerated type وارسالها للسيرفر ..

سأحاول أن أضع مثالا على ذلك ، اذا لم تفهم ما أقصد واذا كنت أفهم ما تريد :) ..

بالتوفيق ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#7

بالفعل هاذا ما قصدتو اخ وجدي .. راح استني المثال لانو كثير مهم الموضوع هاد لاي :)

شكرا اخ herch علي المثال :)

ab66i830gh93.gif

i25sctz8qnls.jpg

#8

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

لا يوجد لدى مترجم ،، ولكن سأوضح بقدر المستطاع ،،

في البدايه العميل يرسل للسيرفر نوع العملية التي يريدها ومن ثم يرسل المعاملات المطلوبة .. مثلا العملية A كان يحتاج الكلاينت ان يرسل 3 معاملات وهنا في السيرفر عندما يعرف أن نوع العملية هو A فسوف يحتاج 3 جمل لأستقبال المعاملات من الكلاينت .. وهكذا ..

مثلا نريد عمل كلاينت يطلب من السيرفر جمع أو طرح عددين ..

سنقوم بكتابة ثوابت تمثل لي العمليات المطلوبة :

public class OPERATION {
	public static final String ADD = "1";
	public static final String SUB = "2";
	public static final String CLOSE = "3";
}

الان في الخادم :

socket = serverSocket.accept();

			Scanner input = new Scanner ( socket.getInputStream() );
			PrintWriter output = new PrintWriter( socket.getOutputStream() , true );

			String  msgIn = input.nextLine();

			while ( ! msgIn.equals(OPERATION.CLOSE) )
			{
				if ( msgIn.equals(OPERATION.ADD) ) {
					System.out.println("Client > " + msgIn );
					int x  = Integer.parseInt(input.nextLine());
					int y  = Integer.parseInt(input.nextLine());
					output.println(x+y);
				}
				else if ( msgIn.equals(OPERATION.SUB) ) {
					System.out.println("Client > " + msgIn );
					int x  = Integer.parseInt(input.nextLine());
					int y  = Integer.parseInt(input.nextLine());
					output.println(x-y);
				}

				msgIn = input.nextLine();
			}

وفي الكلاينت :

 socket = new Socket(address,PORT);

			Scanner input = new Scanner( socket.getInputStream() );
			PrintWriter output = new PrintWriter( socket.getOutputStream() , true );

			String msgIn = "" , msgOut = "";

			Scanner uInput = new Scanner( System.in);

			while ( ! msgOut.equals(OPERATION.CLOSE) )
			{
				System.out.println("1- ADD Number");
				System.out.println("2- SUB Number");
				System.out.println("3- CLOSE ");
				System.out.print(" Enter Number >> " );
				msgOut = uInput.nextLine();

				if ( msgOut.equals(OPERATION.ADD)) {
					System.out.print("Enter First Number : ");
					int x = uInput.nextInt();
					System.out.print("Enter Second Number : ");
					int y = uInput.nextInt();

					output.println(msgOut); // type
					output.println(x);	  // first number
					output.println(y);	  // second number

					msgIn = input.nextLine();
					System.out.println(x + "+" + y + " = " + msgIn );
				}
				else if (msgOut.equals(OPERATION.SUB) ) {
					System.out.print("Enter First Number : ");
					int x = uInput.nextInt();
					System.out.print("Enter Second Number : ");
					int y = uInput.nextInt();

					output.println(msgOut); // type
					output.println(x);	  // first number
					output.println(y);	  // second number

					msgIn = input.nextLine();
					System.out.println(x + "-" + y + " = " + msgIn );
				}
			}

لاحظ ان في العمليتين الطرح والجمع سوف نرسل أولا OPERATION للسيرفر والذي يعرف من خلال الجمل الشرطية انه اذا كانت العملية الفلانية سوف يستقبل عدد x من المعاملات .. وفي الكلاينت تقوم بارسال هذه المعاملات للسيرفر .. أيضا اذا كان السيرفر سيرد بجمله أو أكثر عليك أن تستقبل ذلك من الكلاينت ..

بالتوفيق ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#9

جزاك الله كل الخير اخ وجدي بالفعل هاد ما قصدتو سوف اطبق الشرح في مشروعي ولي رجعه ان لقيت شي صعب :)

تحياني ..

ab66i830gh93.gif

i25sctz8qnls.jpg

#10

you can use this object.

you can send any object via socket and retrieve it as object in another side of connection

ObjectOutputStream output new = ObjectOutputStream( connection.getOutputStream() ); 
ObjectInputStream input = new ObjectInputStream( connection.getInputStream() );

output.writeObject( "any object  here" );
output.flush();

MyObject obj = ( MyObject ) input.readObject();

now you can use obj as you defined in another side.

في اتصالات السيرفر و الكلينت و قواعد البيانات في العادة يتم استخدام ال XML لنقل البيانات

#11

بالنسبة لموضوع xml فليس بالضرورة

على كل أؤيد هذه النقطة في حالة الاتصال ما كان في منظورك تغيير client أو server

تحياتي

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

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

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

728x90.png

#12

هناك حزمه تدعي jPOS معظم البنوك تستخدمها لإرسال الصفقات بينها و بين بعضها , هي ليست ضروريه لمشروعك, و لكن إذا اردت علمها فسيكون شئ جيد

#13

هل هناك فوائد معينة سأستفيدها لو تعلمت هذه الحزمة؟

تحياتي

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

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

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

728x90.png

#14

هذا يعتمد على مجال عملك، فحسب موقع المكتبة

http://www.jpos.org/ فهي
اقتباس
ISO-8583 based financial transaction library/framework

يعني إذا كنت تعمل في الميدان المالي فممكن تفيدك

والprotocol ISO-8583 حسب ويكيبيديا http://en.wikipedia.org/wiki/ISO_8583 هو

اقتباس
ISO 8583 Standard for Financial Transaction Card Originated Messages - Interchange message specifications is the International Organization for Standardization standard for systems that exchange electronic transactions made by cardholders using payment cards.

#15

تعرف يا عصام

أحياناً أعتقد أني لو أعطيت لنفسي العنان في القراءة

ما استطعت أن أكتب سطر كود واحد من ضيق الوقت

هل استخدمت الحزمة مسبقاً؟

أعطيني بعض المزايا التي لمستها كمختصر

:)

لا تقل عني أني كسول

لأني فعلياً لست كسول وإنما أستصعب البدايات

تحياتي

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

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

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

728x90.png

#16

لا أعرف عنها شيء :lol: أنا أيضا قلت مع نفسي أنك مشغول فقلت أعطيك عنها نبذة مختصرة

لكن الذي فهمته أنها تستعمل في الدفع بواسطة الكارت visa و mastercard وما شابههما

#18

شكرا جزيلا أخ محمد مشاري, فقد كنت أبحث عن هذا الكتاب منذ فتره كبيره

جزاك الله خيرا و جعله في ميزان حسناتك و غفر لك

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