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

مشكلة في الإرسال أكثر من مرة في Socket ..

بدأه MKSoft في 13 سبتمبر 2008 · 6 رد · 729 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم .

صممت برنامج Client Server , حيث يقوم بالتالي .

الكلاينت يقوم بإرسال رسالة ل سيرفر ,,, وبعدها السيرفر يستقبل الرسالة , ثم يعيد السيرفر ارسالها ثانية للكلاينت .

المشكلة ان الكلاينت لا يرسل إلا مرة واحد , لا أدري ما المشكلة , لكني اتوقعها في كلاس ServerConnection.java الموجود بالمرفقات , او الذي سأعرضه الان .

import java.net.*;
import java.io.*;
import java.util.*;
public class ServerConnection extends Thread{
	ObjectOutputStream out;
	ObjectInputStream in;
	Socket clientSocket;

	public ServerConnection(Socket aClientSocket)throws Exception
	{
		clientSocket = aClientSocket;
		out = new ObjectOutputStream(clientSocket.getOutputStream());
		in = new ObjectInputStream(clientSocket.getInputStream());
		this.start();
	}
	public void send(String information)throws Exception{
		out.writeObject(information);
	}
	public void run()
	{
		try{
			recive();
		}
		catch(Exception ex){ex.printStackTrace();}
	}
	public void recive()throws Exception
	{
		String str = (String)in.readObject();
		send(str);
	}
}

المرفقات ::

Tmp.rar

#2

السلام عليكم

في الخيوط threads يجب أن تكون الشيفرة في while لكي يظل الخيط حياً in live

تحياتي

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

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

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

728x90.png

#3

شكرا أخي علاء ... فعلا جربت التعديل و نجح معي .

لكن عندما طورت البرنامج قليلا , لم يعد الكود يعمل .

حيث ان فكرة البرنامج الجديد كالتالي ..

يتم تشغيل Server , ومهمته فقط توصيل المعلومات للكلاينتس Clients .

وبعدها يتم تشغيل على الأقل اثنين من Clients , او اكثر , حيث عند تشغيل Client الأول يقوم بتسجيل نفسه في الشبكة , كذلك الثاني من خلال JoptionPane تظهر لكل client .

عندما يريد كلاينت Client معين ارسال رسالة إلى Client اخر , يجب فإنه تظهر له JOptionPane تطلب منه اسم Client المراد ارسال له الرسالة.

وبعدها يرسل بشكل جيد , لكن لمرة واحدة فقط , وحتى بعد إضافة infinite loop ل الإستقبال , تزيد المشكلة , حيث يصبح فقط كلاينت واحد فقط يرسل و لمرة واحدة , اما باقي الكلاينتس , إن ارادو الإرسال فإنه يحدث Exception .

كود السيرفر ..

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

public class ServerConnection extends Thread
{
	Vector listOfsokets;

	ObjectOutputStream out;
	ObjectInputStream in;

	Socket clientSocket;

	public ServerConnection(Socket aClientSocket,Vector listOfsokets)throws Exception
	{
		this.listOfsokets=listOfsokets;

		clientSocket = aClientSocket;
		Object object[] = new Object[3];

		out = new ObjectOutputStream(clientSocket.getOutputStream());
		in = new ObjectInputStream(clientSocket.getInputStream());

		object[1] = out;
		object[2] = in;

		object[0] = (String)in.readObject();

		listOfsokets.addElement(object);

		this.start();
	}
	public void send(String information)throws Exception
	{
		out.writeObject(information);
	}
	public void run()
	{
		try
		{
			while(true)
			recive();
		}
		catch(Exception ex){ex.printStackTrace();}
	}
	public void recive()throws Exception
	{
		String str = (String)in.readObject();
		Scanner scan = new Scanner(str);
		if(scan.hasNext())
		{
			String call = scan.next();
			for(int i = 0; i < listOfsokets.size();/* i++*/)
			{
				Object o[] = (Object [])listOfsokets.get(i);
				if(o[0].toString().trim().equals(call.trim()))
				{
					out = (ObjectOutputStream)o[1];
					in = (ObjectInputStream)o[2];

					i = listOfsokets.size();
					send(str);
				}
				else
					i++;

			}
		}

	}
}

المرفقات ::

Pro.rar

#4

بإذن الله أرى ما المشكلة الليلة

تحياتي

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

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

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

728x90.png

#5

السلام عليكم

كيفك حالك أخي محمد

المشكلة لديك في الفئة Server Connection

يجب أن تجعل الخيط حياً على المطلق

لا أدري لماذا لم تقم بعملها

بعد هذا يجب أن لا تستبدل in ,out داخل الدالة recive

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

أما لماذا تحصل المشكلة لأنك في كل مرة يموت فيها الخيط

يتوجب عليك إنشاء كائن جديد بالتالي ستجد أن العميل لا يبعث باسمه

فتجد أن السيرفر يأخذ الجملة

object[0] = (String)in.readObject();

في صانع الكائينات

ثم يأتي عند الجملة

String str = (String)in.readObject();

في الدالة recive فيتوقف عندها في إنتظار أن يحصل على كائن

على العموم أتمنى أن أكون أفدتك

package network;

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

public class ServerConnection extends Thread
{
	Vector listOfsokets;

	ObjectOutputStream out;
	ObjectInputStream in;

	Socket clientSocket;

	private ObjectOutputStream newout;

	private ObjectInputStream newin;

	public ServerConnection(Socket aClientSocket,Vector listOfsokets)throws Exception
	{
		this.listOfsokets=listOfsokets;

		clientSocket = aClientSocket;
		Object object[] = new Object[3];

		out = new ObjectOutputStream(clientSocket.getOutputStream());
		in = new ObjectInputStream(clientSocket.getInputStream());

		object[1] = out;
		object[2] = in;

		object[0] = (String)in.readObject();
		System.out.println(object[0]);

		listOfsokets.addElement(object);
		System.out.println("create object");

		this.start();
	}
	public void send(String information)throws Exception
	{
		System.out.println("before send object");
		//out.writeObject(information);
		newout.writeObject(information);
		System.out.println("send object");
	}
	public void run()
	{
		try
		{
			while(true){
				System.out.println("before recive object");
				recive();
				System.out.println("recive object");
			}
		}
		catch(Exception ex){ex.printStackTrace();}
	}
	public void recive()throws Exception
	{
		System.out.println("before read object");
		String str = (String)in.readObject();

		System.out.println(str);

		Scanner scan = new Scanner(str);
		System.out.println("create scanner object");
		if(scan.hasNext())
		{
			System.out.println("scanner has next");
			String call = scan.next();
			System.out.println("read has next");
			for(int i = 0; i < listOfsokets.size();/* i++*/)
			{
				Object o[] = (Object [])listOfsokets.get(i);
				if(o[0].toString().trim().equals(call.trim()))
				{
					//out = (ObjectOutputStream)o[1];
					//in = (ObjectInputStream)o[2];
					newout = (ObjectOutputStream)o[1];
					newin = (ObjectInputStream)o[2];
					i = listOfsokets.size();
					System.out.println("before send from rcive");
					send(str);
					System.out.println("after send from rcive");
				}
				else{
					i++;
				}

			}
		}

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

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

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

728x90.png

#6
اقتباس
يجب أن تجعل الخيط حياً على المطلق

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

اقتباس
بعد هذا يجب أن لا تستبدل in ,out داخل الدالة recive

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

ربما لقلة خبرتي في مجال الخيوط , جعلني لا انتبه لهكذا نقطة ....

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

#7

على الرحب والسعة محمد

تحياتي

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

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

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

728x90.png

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