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

[تنبيه - عنوان غير مناسب : ]مساعدة ياشباب الجافا

بدأه mmm43 في 29 أبريل 2009 · 13 رد · 831 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اما بعد اخواني انا اريد برنامج (كود بالجافا) عن Server and Client

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

ارجو المساعدة اخواني .......

#2

الأخ الكريم/الأخت الكريمة

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

مرحباً بكم في منتدى الفريق العربي للبرمجة

نود تنبيهك أن العنوان غير مناسب.

الرجاء اختيار عنوان مناسب أكثر في مواضيعك القادمة، وهذا بمثابة إشعار للأهمية.

وفي حال التكرار سيتعرض موضوعك للإغلاق والحذف!!!

قواعد المشاركة

/index.php?showtopic=29343

شاكرين لكم حُسن تعاونكم

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

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

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

728x90.png

#3

يوجد امثلة بالمنتدى كثيرة عن هذا الموضوع ابحث

موفق

الله معك

#5

اهلا اخي من جديد

الصراحة الموضوع مبت فيه من قبل المشرف بانه مخالف

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

بحسب ما اخبرتني انك تريد عدة كلاينت لسيرفر واحد اذا نحن امام Multithreads

ارجع واقول لك لن يكون شرحي اكثر وضوحا وامثلتي من الموجود بالمنتدى ..يوجد مواضيع كثيرة حول هذا الموضوع

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

import java.net.*;
import java.io.*;
class ReverserServer implements Runnable
{
	static ServerSocket server;
	Socket client;
	static int connectionNO;//connect number
	static isfirstrun=false;
	final int port=3510;
	public ReverserServer()
	{
		try{
			if(isfirstrun==false)
			{
				server=new ServerSocket(port);
				System.out.println("server has been creat");
				isfirstrun=true

			}
			client=server.accept();
			System.out.println("connection"+ ++connectionNo +"has been accepted >>ok");
			//  اذا اردت هنا تعليمات لانشاء كائنات للقراءة والكتابة اذا شات

		}
		catch(IOException e)
		{
			System.out.println(e.toString());
		}
	}
	public void closesocket() throws IOException
	{
		client.close();
		connectionNO --;

	}
}

Runnable هي عبرة عن interface يجب تحقيقها فقط من اجل قدرة الكلاس على استقبال عدة اتصالات في ان معا

وفي قسم الكلاينت يتم تحقيق الاتصال والتاكد منه

/**
 * @(#)ClientSocket.java
 *
 *
 * @author 
 * @version 1.00 2009/4/30
 */

import java.io.*;
import java.net.*;
public class ClientSocket {
	Socket myclient;
		final port=3510;

	public ClientSocket() {
		System.out.println("try to connect");
		myclient=new Socket("localhost",port);
		System.out.println("connect is made");

	}
	catch(IOException e)
	{
		System.out.println("error to try to connect")
	}



}
public void close() throws IOException{
	myclient.close();
}

بالتوفيق

الله معك

#6

الله يوفقك يا شادو

#7

اشكر اخ شادي على مساعدته ,,,

وانا اسف كثيرا على عدم مساعدة الأخ mmm43 ,, لكن اتمنى منه ان يسامحني ,, هذا الكود شبيه بكود الأخ شادي لإن اردت الاطلاع عليه .

import java.io.*;
import java.net.*;
import java.util.*;
public class Server
{
	//DataOutputStream out;
	//DataInputStream in;
	ServerSocket s;
	Socket sc;
	String n;
	public static void main(String[]arsg){
		new Server();
	}
	public Server()
	{
		try{
		n = javax.swing.JOptionPane.showInputDialog

(null,"Enter nickName..");
		s = new ServerSocket(6450);
		while(true){
		sc = s.accept();
		DataOutputStream out = new DataOutputStream

(sc.getOutputStream());
		DataInputStream in = new DataInputStream

(sc.getInputStream());

		DataProc d = new DataProc(in);
		d.start();

		//send(out);
		SendData s = new SendData(out);
		s.start();}
		}
		catch(Exception ex){}

	}// end const
	public void send(DataOutputStream out)throws 

Exception
	{
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		while(!str.equalsIgnoreCase("exit")){
		out.writeUTF(n+">> "+str);
		str = scan.nextLine();
		}
	}
	class SendData extends Thread
	{
		DataOutputStream out;
		public SendData(DataOutputStream out)

{this.out = out;}
		public void run()
		{
			try{send(out);
			}catch(Exception e){}

		}// end run
	}
	class DataProc extends Thread
	{
		DataInputStream in;
		public DataProc(DataInputStream in){this.in 

= in;}
		public void run()
		{
			while(true)
			{
				try{
				String s = in.readUTF();
				System.out.println( s);}
				catch(Exception e){}
			}
		}// end run
	}// inner class
}// end Server

import java.io.*;
import java.net.*;
import java.util.*;
public class Client
{
	DataOutputStream out;
	DataInputStream in;
	Socket sc;
	String  n;
	public static void main(String[]arsg){
		new Client();
	}
	public Client()
	{
		try{
		n = javax.swing.JOptionPane.showInputDialog(null,"Enter nickName..");
		sc = new Socket("192.168.1.5",6450);

		out = new DataOutputStream(sc.getOutputStream());
		in = new DataInputStream(sc.getInputStream());

		DataProc d = new DataProc();
		d.start();

		SendData s = new SendData();
		s.start();

		}
		catch(Exception ex){}

	}// end const
	public void send()throws Exception
	{
		System.out.println("Enter the stamtent to be sent..");
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		while(!str.equalsIgnoreCase("exit")){
		out.writeUTF(n+">> "+str);
		str = scan.nextLine();
		}
	}
	class SendData extends Thread
	{
		public void run()
		{
			try{send();
			}catch(Exception e){}
		}// end run
	}
	public class DataProc extends Thread
	{
		public void run()
		{
			while(true)
			{
				try{

				String s = in.readUTF();
				System.out.println(s);}
				catch(Exception e){}
			}
		}// end run
	}// inner class
}// end Client
#8

مشكوووووووووور اخي mksoft

#9

أهلا فيك أخ mmm43

 s = new ServerSocket(6450);

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

sc = s.accept

();

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

DataOutputStream out = new DataOutputStream
(sc.getOutputStream());
		DataInputStream in = new DataInputStream
(sc.getInputStream());

ممكن ان نتعتبر الكود السابق , هما مسارات مرور البيانات من الخادم إلى العميل و العكس .

out.writeUTF(n+">> "+str);

الجملة السابقة , هي التي تسخدم لإعطاء الأمر لنقل البيانات من الخادم إلى العميل أو العكس , ( اي من هذه اللحظة تبدأ البيانت في الانطلاق في المسارات)

writeUTF()

معنى هذه Method الموجودة ضمن الفئة DataOutputStream , انني اريد ان اعطي امر بنقل البيانات , لكن هذه البيانات من نوع String أي نصي .

هناك اوامر اخرى مثل

	تستخدم لاعطاء امر بنقل بيانات صحيحة writeInt()
writeByte()  تستخدم لاعطاء امر بنقل بيانات على مستوى البايت
writeFloat()  تستخدم لاعطاء امر بنقل بيانات حقيقية ... و هكذا
#10

أهلا بك اخي الكريم , ونسأل الله ينفعنا بما علمنا و ان يعلمنا ما ينفعنا

حاولت ان ارسل لك رسالة تحتوي على إيميلي لكن لم استطيع ,, بسبب خاصية (عدم تلقي رسائل)

#11

بناء على رسالة الأخ mmm43 , فقط طلب تفسير لطريقة تنفيذ جمل thread ..

في البداية عليك أن تعلم أخي أن البرنامج اثناء التنفيذ , يكون على شكل مسار واحد ( بمعنى انه لا يتم تنفيذ خطوة معينة إلا إذا تم تنفيذ الخطوة التي تسبقها )

مثال :

public class MainThread
{
public static void main(String[]args)
{
for(int i = 0; i < 10; i++)
System.out.println("i := "+i);

for(int z = 0; z < 10; z++)
System.out.println("z := "+z);
}
}

لو تتبعت المثال السابق , سوف تستنتج ان طريقة تنفيذ البرنامج هي سطر سطر , فبعد أن ينتهي من تنفيذ جملة التكرار الأولى ,, فإنه ينتقل لجملة التكرار الثانية .. هذا النوع من المسارات يسمى ب Thread (خيط ) .

السؤال : هل فكرت يوما أخي , ان تجعل جملة التكرار الأولى و الثانية يعملان معا في نفس اللحظة ,,, هذا ممكن من خلال ما يسمى بتعدد الخيوط MultiThread .

من الأمثلة المشهورة جدا على تعدد الخيوط , برنامج MS Word , حيث انك تنفيذ البرنامج اي اثناء كتابتك على برنامج الوورد , تجد ان البرنامج و بشكل الي يقوم بتنفيذ خطوة اخرى , و هي انه يقوم بوضع خط احمر تحت الكلمات التي بها خطأ املائي , وهذا الامر تم في نفس اللحظة اثناء كتابتك , بالإعتماد على تكنولوجيا الخيوط المتعددة .. ( اكيد راسك عم توجعك من كلامي الكتير :lol: :lol: )

نعود للنقطة التي سألت عنها ..

سوف تلاحظ في برنامج السيرفر او الكلاينت , كلاس اسمها DataProc , وسوف تجد انها عبارة عن خيط thread وذلك من خلال الكود التالي :

public class DataProc extends Thread

وهو عبارة عن كلاس يقوم باستقبال البيانات من الطرف الاخر ... وحتى أتمكن من تشغيله , اي اجعله يبدأ عملية التنفيذ و استقبال البيانات يجب ان اقوم باساتخدام الكود التالي من خلال الدالة او d.start()

DataProc d = new DataProc();
		d.start();

بنفس الالية استخدمت الكلاس المسمى SendData , و هو أيضا عبارة عن خيط , حيث من خلاله اقوم بإرسال البيانات للطرف الاخر , و حتى اقوم ببدء التنفيذ لعملية ارسال البيانات استخدم الكود التالي :

 SendData s = new SendData();
 s.start();
#12

أخي في البداية ,, لا يمكنني ان ارسل لك راسائل خاصة و ذلك بسب انك قد منعت هذه الخاصية عن الأعضاء ..

يجب ان تعلم اخي mmm43 انه يفضل في عمليات استقبال الرسائل النصية ان تتم هذه العملية في Thread جديد ..

بالنسبة للبرنامج الذي ارسلته لك , اولا Server يحتوي على 3 threads , وهم :

Main Thread و الذي ينشأه VM الخاص بالجافا للبرنامج

DataProc و هو المسؤول عن استقبال البيانات

SendData المسؤول عن ارسال البيانات .

لقد قمت بحذف Thread الخاص بإرسال البيانات .. حيث قمت بتعليمة من خلال /* */ اي Comments

import java.io.*;
import java.net.*;
import java.util.*;
public class Server
{
	//DataOutputStream out;
	//DataInputStream in;
	ServerSocket s;
	Socket sc;
	String n;
	public static void main(String[]arsg){
		new Server();
	}
	public Server()
	{
		try{
		n = javax.swing.JOptionPane.showInputDialog(null,"Enter nickName..");
		s = new ServerSocket(6450);
		while(true){
		sc = s.accept();
		DataOutputStream out = new DataOutputStream(sc.getOutputStream());
		DataInputStream in = new DataInputStream(sc.getInputStream());

		DataProc d = new DataProc(in);
		d.start();


	send(out);
		/*SendData s = new SendData(out);
		s.start();*/}
		}
		catch(Exception ex){}

	}// end const
	public void send(DataOutputStream out)throws Exception
	{
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		while(!str.equalsIgnoreCase("exit")){
		out.writeUTF(n+">> "+str);
		str = scan.nextLine();
		}
	}
/*	class SendData extends Thread
	{
		DataOutputStream out;
		public SendData(DataOutputStream out){this.out = out;}
		public void run()
		{
			try{send(out);
			}catch(Exception e){}

		}// end run
	}*/
	class DataProc extends Thread
	{
		DataInputStream in;
		public DataProc(DataInputStream in){this.in

= in;}
		public void run()
		{
			while(true)
			{
				try{
				String s = in.readUTF();
				System.out.println( s);}
				catch(Exception e){}
			}
		}// end run
	}// inner class
}// end Server

نفس السابق في برنامج Client .

import java.io.*;
import java.net.*;
import java.util.*;
public class Client
{
	DataOutputStream out;
	DataInputStream in;
	Socket sc;
	String  n;
	public static void main(String[]arsg){
		new Client();
	}
	public Client()
	{
		try{
		n = javax.swing.JOptionPane.showInputDialog(null,"Enter nickName..");
		sc = new Socket("192.168.1.5",6450);

		out = new DataOutputStream(sc.getOutputStream());
		in = new DataInputStream(sc.getInputStream());

		DataProc d = new DataProc();
		d.start();

	send();
		/*SendData s = new SendData();
		s.start();*/

		}
		catch(Exception ex){}

	}// end const
	public void send()throws Exception
	{
		System.out.println("Enter the stamtent to be sent..");
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		while(!str.equalsIgnoreCase("exit")){
		out.writeUTF(n+">> "+str);
		str = scan.nextLine();
		}
	}
	/*class SendData extends Thread
	{
		public void run()
		{
			try{send();
			}catch(Exception e){}
		}// end run
	}*/
	public class DataProc extends Thread
	{
		public void run()
		{
			while(true)
			{
				try{

				String s = in.readUTF();
				System.out.println(s);}
				catch(Exception e){}
			}
		}// end run
	}// inner class
}// end Client

ملاحظة // أخي ارجو ان لا تقوم بربط MultipleThread بعدد Clients , حيث لا يوجد علاقة بينهما , إلا ان تعدد لخيوط أو multiplethread تزيد من كفاءة البرنامج وسرعته .

#13

Server

import java.net.*;
import java.io.*;
import java.util.Scanner;

public class Server {
	public Server(){
		try{
			ServerSocket srvsc = new ServerSocket(12500);

			while(true){
				System.out.println("Server wait..");
				Socket socket = srvsc.accept();

				Writer wr = new OutputStreamWriter(socket.getOutputStream());
				BufferedWriter writer = new BufferedWriter(wr);

				Reader rd = new InputStreamReader(socket.getInputStream());
				BufferedReader reader = new BufferedReader(rd);

				Reciver reciver = new Reciver(reader,writer);
				reciver.start();

			}
		}
		catch(Exception ex){ex.printStackTrace();}

	}
	public class Reciver extends Thread{

		BufferedReader reader;
		BufferedWriter writer;

		public Reciver(BufferedReader reader, BufferedWriter writer){
			this.reader = reader;
			this.writer = writer;
		}
		@Override
		public void run(){
			try{

				while(true){

					int length = reader.read();
					char[] sAry = new char[length];
					reader.read(sAry);

					String str = new String(sAry);
					System.out.println(str);

					String data = "message of << "+str+" >> has been recieved from Server..";
					int sDlength = data.length();
					writer.write(sDlength);
					writer.flush();
					writer.write(data.toCharArray());
					writer.flush();
				}

			}
			catch(Exception ex){ex.printStackTrace();}
		}
	}

	public static void main(String[]args){
		new Server();
	}

}

Client

import java.net.*;
import java.io.*;
import java.util.Scanner;

public class Client {
	public Client(){
		try{
			Socket socket = new Socket("192.168.1.5", 12500);

			Writer wr = new OutputStreamWriter(socket.getOutputStream());
			BufferedWriter writer = new BufferedWriter(wr);

			Reader rd = new InputStreamReader(socket.getInputStream());
			BufferedReader reader = new BufferedReader(rd);

			Reciver reciver = new Reciver(reader);
			reciver.start();

			String str = Inet4Address.getLocalHost().getHostName();
			Scanner scan = new Scanner(System.in);
			do{
				System.out.print("You >> ");
				str = scan.nextLine();
				int length = str.length();
				writer.write(length);
				char[] sAry = str.toCharArray();
				writer.write(sAry);

				writer.flush();
			}
			while(!str.equalsIgnoreCase("exit"));

		}
		catch(Exception ex){ex.printStackTrace();}


	}
	public class Reciver extends Thread{
		BufferedReader reader;
		public Reciver(BufferedReader reader){
			this.reader = reader;
		}
		public void run(){
			try{
				String str;
				while(true){

					int length = reader.read();
					System.out.println("Lengtyh : = " + length);
					char[] sAry = new char[length];
					reader.read(sAry);
					str = new String(sAry);
					System.out.println(str);
				}

			}
			catch(Exception ex){ex.printStackTrace();}
		}
	}
	public static void main(String[]args){
		new Client();
	}
}
#14

مشكووووووووووووور اخي فعلا انا محرج منك كثير لكن اذا احتجت اي شيء فقط راسلني

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

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

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

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

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