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

Stream Problem

بدأه qamber في 1 مارس 2008 · 11 رد · 1,339 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أنا أبرمج حاليا بريد إلكتروني وتواجهني مشكلة وهو أن الكلاينت الذي رأيته في التوتوريال ليس فيه أكثر من وظيفة يعني يدوبك يبعث كلمة إلى السرفر ويستقبل كلمة لكني احتاج أكثر من ذلك ففي نفس الكونكشن سيتم تبادل المعلومات بين السرفر والكلاينت أكثر من مرة

فهل لديكم مثال لكلاينت فيه أكثر من وظيفة يقوم بها؟

هذا ما توصلت إليه لعمل الوظائف لكنه لايعمل لأنه يغلق الستريم فيجب أن تفتح ستريم آخر

وهذا هو الكود من جانب السرفر



InputStream in=null;
OutputStream out=null;
BufferedReader bfr=null;
PrintWriter writer=null;
String recieve,userName,passWord;
boolean logged;

try{
in=s.getInputStream();
out=s.getOutputStream();
bfr=new BufferedReader(new InputStreamReader(in));
writer=new PrintWriter(out,true);
recieve=bfr.readLine();
logged= false;

if(recieve.equals("login")){
userName=bfr.readLine();
System.out.println(userName);
passWord=bfr.readLine();
System.out.println(passWord);
System.out.println("hashtable");
System.out.println(urs.users.toString());

if((urs.users.containsKey(userName)))
logged=true;
else writer.println("no");

}
if(recieve.equals("sign")){
userName=bfr.readLine();
passWord=bfr.readLine();
if(urs.users.containsKey(userName)==false){
urs.addRecord(userName, passWord);
System.out.print(urs.users.toString());
writer.println("approved");
}
else writer.println("taken");

}
if(recieve.equals("write")){
}
if(recieve.equals("read")){
}
if(recieve.equals("delete")){
}
if(recieve.equals("stop"))break;

System.out.println("here we are");
in.close();
out.close();
bfr.close();
writer.close();

}catch(IOException e){
System.out.println("server error");
}
}
}
public void run() {

تم تعديل هذه المشاركة بواسطة qamber في 1 مارس 2008 في 23:17

#2

الإشكال أني لم أستطع أن أجعل الستريم مفتوحا حتى ينتهي الكلاينت من عمل كل ما يريد

تم تعديل هذه المشاركة بواسطة qamber في 1 مارس 2008 في 23:19

#3

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

while ( true )
{
// here all processing

if ( Client Send "CLOSE" )
break;
}

اما اذا كان هناك مهمات منفصله ، فايضا ستستخدم حلقه while ، ولكن ستضع شرط معين ، مثلا اذا أدخل 1 ينفذ المهمه الأولى ، وهكذا لباقي المهمات .

أرفق كود الـ Client في حال لم تفهم الكلام السابق ، حتى نستطيع مساعدتك بشكل أكبر .

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

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

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

#4

نعم أخي الكريم أولا أشكرك على التجاوب

ثانيا: مشكلتي هي كما رأيت أن السرفر الذي صممته يغلق مباشرة بعد أن تتم أول عملية مما يمنعني من أن أسمح للكلاينت أن يؤدي كل المهام المطلوبة منه

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

ثالثا:هل اقتراحك هذا سيحل المشكلة؟

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

تم تعديل هذه المشاركة بواسطة qamber في 2 مارس 2008 في 23:17

#5

فقط لكي أبين مدى فهمي لإضافتك الكريمة

هل تريد أن أجعل كل وظيفة في السرفر داخل while loop لمفردها

يعني لتخزين معلومات المستخدم نضع لوب

ولدخول المستخدم نضع لوب أيضا وهكذا

أهذا ما تريد؟

تم تعديل هذه المشاركة بواسطة qamber في 2 مارس 2008 في 23:34

#6

حسنا ، أجعل السيرفر في حلقه مستمره ، وهكذا ستتعامل مع طلبات الـClient .

while ( true )
{
recieve=bfr.readLine();
logged= false;

if(recieve.equals("login")){
userName=bfr.readLine();
System.out.println(userName);
passWord=bfr.readLine();
System.out.println(passWord);
System.out.println("hashtable");
System.out.println(urs.users.toString());

if((urs.users.containsKey(userName)))
logged=true;
else writer.println("no");

} 
if(recieve.equals("sign")){
userName=bfr.readLine();
passWord=bfr.readLine();
if(urs.users.containsKey(userName)==false){
urs.addRecord(userName, passWord);
System.out.print(urs.users.toString());
writer.println("approved");
}
else writer.println("taken");

}
if(recieve.equals("write")){
}
if(recieve.equals("read")){
}
if(recieve.equals("delete")){
}
if(recieve.equals("stop"))break;

}

بشكل عام ، السيرفر غالبا ما يكون مستمر في العمل ، يعني في حلقه للأبد حتى يتعامل مع عميل اتصل به .

أرجوا ان يكون وضحت الفكره .

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

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

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

#7

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

صادفتني مشكلة أخرى وهي إذا أردت أن أشرع بالمهمة التالية فإن البفر ريدر يتوقف وهذه هو سبب الخلل في فئة البفر ريدر كما تشير إليه رسالة الخطأ

public String readLine() throws IOException {
		return readLine(false);
	}

ما الذي يجعله يتوقف؟ المفروض أن يستمر طالما أنه لم يغلق؟

تم تعديل هذه المشاركة بواسطة qamber في 4 مارس 2008 في 01:40

#8

طبعا هذا الأمر يحدث في العميل client حينما أنفذ أي مهمة ثانية يحدث هذا الخطأ عند سطر bfr.readline();d

#9

بصراحة استغرب ما الذي يجعله يتوقف بعد أول عملية ؟

عموما هذا هو الكود للعميل

public class LoginPage extends JFrame implements ActionListener{
	InputStream in=null;
	OutputStream out=null;
	BufferedReader bfr=null;
	PrintWriter writer=null;
	Socket s;
	JPanel p1,p2,p3;
	JLabel userName,passWord,loginError;
	JButton login,signUp;
	JTextField userNameField;
	JPasswordField passWordField;
	public LoginPage(){

		p1=new JPanel();
		p2=new JPanel();
		p3=new JPanel();
		userName= new JLabel("USER NAME");
		userNameField = new JTextField(10);
		passWord = new JLabel("PASSWORD");
		passWordField = new JPasswordField(10);
		login= new JButton("LOG IN");
		signUp= new JButton("SIGN UP");
		loginError=new JLabel("");
		setLayout(new GridLayout(4,0));
		p1.setLayout(new FlowLayout());
		p1.add(userName);
		p1.add(userNameField);
		add(p1);
		p2.setLayout(new FlowLayout());
		p2.add(passWord);
		p2.add(passWordField);
		add(p2);
		p3.setLayout(new FlowLayout());
		p3.add(login);
		p3.add(signUp);
		add(p3);
		add(loginError);
		login.addActionListener(this);
		signUp.addActionListener(this);
		try{
			s = new Socket("127.0.0.1",2000);
			in = s.getInputStream();
			out = s.getOutputStream();
			bfr = new BufferedReader(new InputStreamReader(in));
			writer = new PrintWriter(out,true);
		}
		catch(IOException e){
			System.out.println("Error connecting with the Server  "+e);
		}
	}


	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==login){
			try {
				String u = userNameField.getText();
				String p = passWordField.getText();
				userNameField.setText("");
				passWordField.setText("");
				writer.println("login");
				writer.println(u);
				writer.println(p);
				out.flush();
				writer.flush();
				String errorMessage = bfr.readLine();
				if (errorMessage != null) {
					loginError.setText(errorMessage);
				}else{
					MailPage m = new MailPage();
					m.setTitle(u);
				}

			} catch (IOException ex) {
				System.out.println("login page unable to send/receive");
				ex.printStackTrace();
			}
		}
		if(e.getSource()== signUp){
			SignupPage sp= new SignupPage();
		}
	}
	public static void main(String args[]){
		LoginPage l=new LoginPage();
		l.setTitle("LOGIN ");
		l.setDefaultCloseOperation(EXIT_ON_CLOSE);
		l.pack();
		l.setVisible(true);
	}

	class SignupPage extends JFrame {
		JPanel p1,p2,p3,p4;
		JButton submit;
		JLabel userName,passWord,confirm,result;
		JTextField userNameField;
		JPasswordField passWordField,confirmField;
	public SignupPage(){
		setTitle("SIGNUP WINDOW");
		setBounds(205,0,200,200);
		p1=new JPanel();
		p2=new JPanel();
		p3=new JPanel();
		p4= new JPanel();
		userName= new JLabel("USER NAME");
		userNameField = new JTextField(10);
		passWord = new JLabel("PASSWORD");
		passWordField = new JPasswordField(10);
		confirm = new JLabel("RE-ENTER IT");
		confirmField = new JPasswordField(10);
		submit = new JButton("SUBMIT");
		result = new JLabel("");
		setLayout(new GridLayout(5,0));
		p1.setLayout(new FlowLayout());
		p1.add(userName);
		p1.add(userNameField);
		add(p1);
		p2.setLayout(new FlowLayout());
		p2.add(passWord);
		p2.add(passWordField);
		add(p2);
		p3.setLayout(new FlowLayout());
		p3.add(confirm);
		p3.add(confirmField);
		add(p3);
		p4.setLayout(new FlowLayout());
		p4.add(submit);
		p4.add(new JLabel(""));
		add(p4);
		add(result);
		submit.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
			  if(e.getSource()==submit){
				  try{
					  String un=userNameField.getText();
					  String ps=passWordField.getText();
					  String pc=confirmField.getText();
					  if(ps.equals(pc)){
						  writer.println("sign");
						  writer.println(un);
						  writer.println(ps);
						  out.flush();
						  writer.flush();
						  String reply=bfr.readLine();
						  result.setText(reply);
					  }else{
						  result.setText("Re Enter The Same PassWord");
					  }

				  }
				  catch(IOException ex){
					  System.out.println(" signup page Unable to Send/Recieve");
					  ex.printStackTrace();
				  }
			  }  
			}
		});
		pack();
		setVisible(true);
	}

}

والأسطر التي فيها استدعاء وظيفة قراءة سطر للبفر ريدر موجودة في ميثود أكشن برفورمد لكل من LoginPage class and SignupPage class

#10

إضافة توضيحية: البرنامج لا يعمل فقط في حالة إذا استخدمت log in بعدsign up أما بالعكس فهو شغال على حسب الأصول

فما المشكلة؟

#11

خلاص ما تتعب نفسك حبيبي

عرفت المشكلة يموت اللنك حينما يكون قيمة السطر لا شيء فالقاريء يظل منتظرا

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

#12

الحمد لله :) .

بالتوفيق .

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

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

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

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