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

شرح ربط الj2me بقاعدة بيانات بواسطة الانترنت :)

مثبّت
بدأه .S.T.A.L.K.E.R في 17 يناير 2009 · 34 رد · 17,942 مشاهدة · في JavaME
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بســم الله الـرحمــن الرحيــم

انا عارف اني اتأخرت كثيرا في وضع هذا الموضوع و ذلك بسبب انشغالي :)

في هذا الشرح سوف يتم ربط برنامج j2me مع servlet بواسطة اتصال http

في الj2me لا يتم دعم الjdbc و هي التقنية المستخدمة في j2se و j2ee للربط و التعامل مع قواعد البيانات سواء كانت oracle,MySQL,Apache,MS Access...

لذلك يتم وصل برنامج الj2me مع سيرفلت و السيرفلت هي التي تقوم بالاستعلام مع قاعدة البيانات و ارجاع القيم الى الموبايل كنص و يقوم برنامج الموبايل بالتعامل معها.

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

1- في جانب الموبايل ( j2me ):

import java.io.*;
import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;

public class testMySQL extends MIDlet implements CommandListener {
	private String username;
	private String url = 
		"http://localhost:8080/servlets-examples/servlet/getConnection";\\ موقع قاعدة البيانات

	private Display display;
	private Command exit = new Command("EXIT", Command.EXIT, 1);;
	private Command connect = new Command("Connect", Command.SCREEN, 1);
	private TextField tb;
	private Form menu;
	private TextField tb1;
	private TextField tb2;
	DB db;

	public testMySQL() throws Exception {
		display = Display.getDisplay(this);

	}

	public void startApp() {
		displayMenu();
	}

	public void displayMenu() {
		menu = new Form("Connect");

		tb = new TextField("Please input database: ","",30,TextField.ANY );

		tb1 = new TextField("Please input username: ","",30,TextField.ANY);

		tb2 = new TextField("Please input password: ","",30,
TextField.PASSWORD);

		menu.append(tb);
		menu.append(tb1);
		menu.append(tb2);
		menu.addCommand(exit);
		menu.addCommand(connect);
		menu.setCommandListener(this);
		display.setCurrent(menu);
	}

	public void pauseApp() {}

	public void destroyApp(boolean unconditional) {}

	public void commandAction(Command command, Displayable screen) {
		if (command == exit) {
			destroyApp(false);
			notifyDestroyed();
		} else if (command == connect) {
			db  = new DB(this);
			db.start();
			db.connectDb(tb.getString(),tb1.getString(),tb2.getString());
		}
	}

	public class DB implements Runnable {
		testMySQL midlet;
		private Display display;
		String db;
		String user;
		String pwd;
		public DB(testMySQL midlet) {
			this.midlet = midlet;
			display = Display.getDisplay(midlet);
		}

		public void start() {
			Thread t = new Thread(this);
			t.start();
		}

		public void run() {
			StringBuffer sb = new StringBuffer();
			try {
				HttpConnection c = (HttpConnection) Connector.open(url);
				c.setRequestProperty(
"User-Agent","Profile/MIDP-1.0, Configuration/CLDC-1.0");
				c.setRequestProperty("Content-Language","en-US");
				c.setRequestMethod(HttpConnection.POST);

				DataOutputStream os =(DataOutputStream)c.openDataOutputStream();

				os.writeUTF(db.trim());
				os.writeUTF(user.trim());
				os.writeUTF(pwd.trim());
				os.flush();
				os.close();

				// Get the response from the servlet page.
				DataInputStream is =(DataInputStream)c.openDataInputStream();
				//is = c.openInputStream();
				int ch;
				sb = new StringBuffer();
				while ((ch = is.read()) != -1) {
					sb.append((char)ch);
				}
				showAlert(sb.toString());
				is.close();
				c.close();
			} catch (Exception e) {
				showAlert(e.getMessage());
			}
		}
			/* This method takes input from user like db,user and pwd and pass
			to servlet */
		public void connectDb(String db,String user,String pwd) {
			this.db = db;
			this.user = user;
			this.pwd = pwd;
		}

		/* Display Error On screen*/
		private void showAlert(String err) {
			Alert a = new Alert("");
			a.setString(err);
			a.setTimeout(Alert.FOREVER);
			display.setCurrent(a);
		}

	};
}

2- جانب السيرفر (السيرقلت ) (j2ee , Servlet)

import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class getConnection extends HttpServlet {

	public void init() {
	}

	public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, 
IOException {

		DataInputStream in = new DataInputStream(
				(InputStream)request.getInputStream());

		String db = in.readUTF();
		String user = in.readUTF();
		String pwd = in.readUTF();

		String message ="jdbc:mysql://localhost:3306/"+db+","+user+","+pwd;
		try {

			connect(db.toLowerCase().trim(),user.toLowerCase().trim(),pwd.toLowerCase().trim());

			message += "100 ok";

		} catch (Throwable t) {
			message += "200 " + t.toString();
		}
		response.setContentType("text/plain");\\ تحديد نوع الرد للموبايل على ان يكون من نوع نص 
		response.setContentLength(message.length());
		PrintWriter out = response.getWriter();
		out.println(message);\\ اضافة الرد 
		in.close();
		out.close();
		out.flush();\\ارسال الرد
	}

	public void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, 
			IOException {

		doPost(request,response);
	}

	/* This method connects to MYSQL database*/
\\الربط مع قاعدة بيانات
	private void connect(String db, String user,String pwd) 
	throws Exception {

		// Establish a JDBC connection to the MYSQL database server.
		//Class.forName("org.gjt.mm.mysql.Driver");
		Class.forName("com.mysql.jdbc.Driver").newInstance();
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+db,user,pwd);

		   }
}

و الامور تكون اوضح في نت بينز

و ان شاء الله سوف اضع شرح مفصل

1
#2

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

أخي الكريم يشرفني أنا أكون أول من يرد عليك.

كيف يتم الإتصال بين السيرفر و الموبايل هل ينفع عن طريق كابل USB ؟؟ أم من الضروري أن يكون الجهازان متصلان بالإنترنت عندئذ يجب إستبدال localhost ب رقم الأي بي الخاص بالسيرفر

وشكراً لك.

أعوذ بالله من الشيطان الرجيم

قل إنّ صلاتي و نسكي و محيّاي و مماتي لله رب العالمين

صدق الله العظيم

#3

بســم الله الـرحمــن الرحيــم

كلامك صحيح

يتم الربط بينهم بواسطة الانترنت، وانت تعلم ان هذا مثال ولذلك يتوجب وضع localhost و لا استطيع وضع رقم سيرفر كتوضيح لانه قد يشتت

و مع العلم انك تستطيع الربط ايضا بدل http ان تستخدم ال socket

#4

شكرا لك

.

.

اقتباس
و ان شاء الله سوف اضع شرح مفصل

با نتظارك

#5

السلام عليكم

شكرا على هذا الشرح

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

للاهمية

وشكرا

#6
d555 كتب:
السلام عليكم

شكرا على هذا الشرح

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

للاهمية

وشكرا

انا ايضا بحاجة الى التفاصيل (المملة لو امكن ) للضرورة والاهمية مع جزيل الشكر مقدما

#7

هل يجب تحويل الجهاز إلى server عن طريق انزال windows server ؟

#8

لا

يكفي تحميل ال Glass Fish

و يمكن استخدام السيرفر الموجود في النتبينز

#9

قمت بتنزيل glassfish

سؤال : هل يمكن توصيل الموبايل مع السيرفر وهم على وضع localhost عن طريق البلوتوث أو أي طريقة أخرى أسهل أم ضروري التوصيل يكون عن طريق الانترنت ؟

و شكرا على تعاونكم المستمر :)

1
#10

أشكرك شكرا جزيلاااا

#11

يمكن ايصالهم محليا

باستخدام localhost

او

127.0.0.1

عن طريق ال HttpConnection

او ال SocketConnection

بالتوفيق

#12

عندما أقول بعمل run لسرفليت ..تظهرلي هذه الصفحة :-

type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

java.io.EOFException

note The full stack traces of the exception and its root causes are available in the GlassFish v3 logs.

وعند الذهاب إلى السيرفلت عن طريق الرابط http://localhost:8084/babycareSer/babyCare/createUser

يظهرلي :-

HTTP Status 404 -

type Status report

message

descriptionThe requested resource () is not available.

GlassFish v3

أرجوكم ما الحل ؟

بارك الله فيكم

#13

انحلت المشكلة :)

#14

مشكلة اخرى ظهرت لي :

"javax.microedition.io.ConnectionNotFoundException: TCP open

هل لديكم أي فكرة لحلها ؟

تم تعديل هذه المشاركة بواسطة Life Shadows في 28 أبريل 2010 في 00:32

#16

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

HttpConnection c = (HttpConnection) Connector.open(url

);

هل هذا يكفي للموضوع ؟

#18

امممم هل هناك شرح للباراميتر لهذه النقطة :-

c.setRequestProperty("User-Agent","Profile/MIDP-1.0 Configuration/CLDC-1.0");

c.setRequestProperty("Content-Language", "en-CA");

-----

أنا قمت بتنزيلGlassFish Tools Bundle For Eclipse فقط >>>بما اني أستخدم الEclipse

هل هذا يكفي ؟

مشكلتي في ان صفحة localhost تعمل معي عند تشغيل السيرفلت لكن بعد ذلك تتعطل عند تشغيل ال midlet ..

#19

السلام عليكم

اولا شكر لتعبك وجزاكم الله خيرا

لكنى اريد توضيح ليكفيه عمل client ب J2me وعمل الserver اللى بيرد عليه ب C#

فهل يمكن ذلك وان كان ممكن ياريت توضح ذلك بمثال بكل تفاصيل او اعطاء لينك لكتاب معين لعمل ذلك

وشكرا لكم

#20

ارجو شرح كيفيه عمل client بال J2ME

وعمل السيرفر بال C#

وارجو التوضيح بمثال

مثلا الclient يبعت بطلب شى معين من السيرفر(C#)والسيرفر يرد عليه باللى هو عايزه

ارجو الرد بسرعه

شكرا لمجهوداتكم وجزاكم الله كل خير

#21
wael_magic كتب:

ارجو شرح كيفيه عمل client بال J2ME

وعمل السيرفر بال C#

وارجو التوضيح بمثال

مثلا الclient يبعت بطلب شى معين من السيرفر(C#)والسيرفر يرد عليه باللى هو عايزه

ارجو الرد بسرعه

شكرا لمجهوداتكم وجزاكم الله كل خير

to connect any 2 devices u should open server socket, to keep listenning for any incomming client (mobile phone in our case)

u may try to open a server socket using C# commands

then , at mobile phone, using J2ME

connect to the socket at server side

something like this:

HttpConnection c = (HttpConnection) Connector.open(url);

تم تعديل هذه المشاركة بواسطة Asmaa Abobakr في 31 يوليو 2010 في 19:59

#22

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

انا عضوة جديدة فى المنتدى وفى لغة ال J2ME

لقد قمت بتنفيذ هذا المثال ولكن عند تشغيل ال servlet يحدث هذا ال error

HTTP Status 500 -

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

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.io.EOFException

java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323)

java.io.DataInputStream.readUTF(DataInputStream.java:572)

java.io.DataInputStream.readUTF(DataInputStream.java:547)

getConnection.doPost(getConnection.java:19)

getConnection.doGet(getConnection.java:46)

javax.servlet.http.HttpServlet.service(HttpServlet.java:617)

javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.29 logs.

وكان هناك نفس الخطأ يحدث للعضو Life Shadows

وقال ان المشكلة اتحلت عندو

برجاء الافادة

#23

مرحبا

في حال كانت قاعدة البيانات من نوع Access 2003؟

ما هو التعديل على الكود

أرجو الرد ولك الشكر

#24
ASM200210 كتب:

مرحبا

في حال كانت قاعدة البيانات من نوع Access 2003؟

ما هو التعديل على الكود

أرجو الرد ولك الشكر

الـ Access ليست قاعده بيانات تعمل على سيرفر لانها ببساطه لا تقوم بانشاء وفتح Port لها

فهى لا تنفع فى هذه الحاله

Software Developer
Mahmoudkelany.com


 

#25

شكرا اخي على الرد السريع

طب في حال كانت قاعدة البيانات من نوع: SQL Server 2005

ما هو التغيير على الكود؟

ولك ألف شكر................

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