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

Java.io.utfdataformatexception

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

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

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

String txt = reciever.readUTF();

حيث ظهر عندي الاستثناء التالي :

java.io.UTFDataFormatException: malformed input around byte 3
		 at java.io.DataInputStream.readUTF(DataInputStream.java:639)
		 at java.io.DataInputStream.readUTF(DataInputStream.java:547)
		 at ServerManager$Clients_Requists.run(ServerManager.java:116)
 java.io.UTFDataFormatException: malformed input around byte 1
		 at java.io.DataInputStream.readUTF(DataInputStream.java:639)
		 at java.io.DataInputStream.readUTF(DataInputStream.java:547)
		 at ServerManager$Clients_Requists.run(ServerManager.java:116)
 java.io.UTFDataFormatException: malformed input around byte 2
		 at java.io.DataInputStream.readUTF(DataInputStream.java:617)
		 at java.io.DataInputStream.readUTF(DataInputStream.java:547)
		 at ServerManager$Clients_Requists.run(ServerManager.java:116)
 java.io.UTFDataFormatException: malformed input around byte 3
		 at java.io.DataInputStream.readUTF(DataInputStream.java:617)
		 at java.io.DataInputStream.readUTF(DataInputStream.java:547)
		 at ServerManager$Clients_Requists.run(ServerManager.java:116)

بصراحة Exception السابق طويل جدا , لكن انا اقتطعت جزء منه , حيث أنه مكرر .

حقيقة , إن هذا الخطأ لا أعرف له أي سبب , لذلك من لديه خلفية عن معالجة هذه المشكلة أن لا يبخل علينا بعلمه ,, وجزاكم الله خيرا

#2

ما هو الملف الذي تقوم بكتابته؟

يتهيألي أنك تقوم بكتابة شيء بتشفير encoding غير UTF

ضع الملف وضع الشيفرة في المرفقات وسنرى ما يمكننا عمله

تحياتي

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

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

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

728x90.png

#3

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

بالنسبة للكود أخ علاء فهو كالتالي :

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

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Test {

	DataInputStream reg_reciever = null;
	private ServerSocket ss = null;
	private final static int PORT = 12500;

	public Test()throws IOException{
		ss = new ServerSocket(PORT);
		while(true){
			Socket socket = ss.accept();
			Clients_Requists cr = new Clients_Requists(socket);
			cr.start();
		}
	}
	private class Clients_Requists extends Thread{

		Socket socket = null;
		DataOutputStream sender = null;
		DataInputStream reciever = null;

		public Clients_Requists(Socket socket)throws IOException{
			this.socket = socket;
			sender = new DataOutputStream(socket.getOutputStream());
			reciever = new DataInputStream(socket.getInputStream());
		}
		@Override
		public void run(){
			 while(true){
				 try{
					 String type = reciever.readUTF();
					 if( type.equals(":file:") ){
						 String from = reciever.readUTF();
						 String filename = reciever.readUTF();
						 int file_length = reciever.readInt();
						 byte[] bytes = new byte[file_length];
						 reciever.read(bytes);
						 File file = new File("C:\\"+filename);
						 FileOutputStream writer = new FileOutputStream(file);
						 writer.write(bytes);
						 writer.close();
					 }
					 else
					 if( type.equals(":txt:") ){
						 String from = reciever.readUTF();
						 String txt = reciever.readUTF();
						 System.out.println(from+">> "+txt);
					 }
				 }
				 catch(IOException ex){ex.printStackTrace();}

			 }
		}
	}
	public static void main(String[]args){
		try{Test sm = new Test();}
		catch(IOException ex){ex.printStackTrace();}
	}
}

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

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author mk
 */
public class clientTest {

	Socket socket = null;
	DataOutputStream sender = null;
	DataInputStream reciever = null;

	String name;

	public clientTest()throws IOException{

		socket = new Socket(InetAddress.getLocalHost(), 12500);
		name = JOptionPane.showInputDialog("Enter the nickname please..");
		sender = new DataOutputStream(socket.getOutputStream());
		reciever = new DataInputStream(socket.getInputStream());


		String state;
		Scanner scan = new Scanner(System.in);
		main();
		while(!(state = scan.nextLine()).equalsIgnoreCase("finish")){

			if( state.equals("txt") ){
				String txt = scan.nextLine();
				chat(txt);
			}
			else
			if( state.equals("file") )
				sendFile();

			System.out.println("================================");
			main();
		}

		System.exit(0);
	}
	protected void chat(String txt)throws IOException{
		sender.writeUTF(":txt:");
		sender.writeUTF(name);
		sender.writeUTF(txt);
		sender.flush();
	}

	protected void sendFile()throws IOException{
		JFileChooser file_chooser = new JFileChooser();
		int state = file_chooser.showOpenDialog(null);
		if( state != JFileChooser.CANCEL_OPTION ){
			File file = file_chooser.getSelectedFile();
			try{
				FileInputStream reader = new FileInputStream(file);
				int file_length = (int)file.length();
				byte[] bytes = new byte[file_length];
				reader.read(bytes);
				String filename = file.getName();
				sender.writeUTF(":file:");
				sender.writeUTF(name);
				sender.writeUTF(filename);
				sender.writeInt(file_length);
				sender.write(bytes);
				sender.flush();
			}
			catch(IOException ex){ex.printStackTrace();}
		}

	}
	private void main(){
		System.out.println("write [txt] to send text");
		System.out.println("write [file] to send file");
		System.out.println("write [finish] to exit..");
		System.out.println("================================");
	}
	public static void main(String[]args){
		try{
			clientTest ct = new clientTest();
		}
		catch(IOException ex){ex.printStackTrace();}


	}
}
#4

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

حياك الله أخي الكريم محمد ، كيف حالك ؟ أرجوا أن تكون بخير ...

السيرفر (Test.java) لديك يحتوي على حلقه لا نهائيه في كل مره يستقبل النص باستخدام الداله :

String type = reciever.readUTF();

بعدها يقوم بالتحقق من هل txt أم file للقيام بالمهمه ،،واذا لم تكن أي منهم فلن يقوم بشيء .. جميل ،،

الكلاينت (clientTest.java) يقوم بادخال النص والتأكد من هل هو finish فاذا كان كذلك خرج من الحلقة ، والا سيكمل العمل ..

البرنامج يعمل عند ادخال txt ولم أجرب file ، والمشكله exception تحصل عند ادخال finish ..

السبب في ذلك ، عندما يقوم العميل client بادخال الكلمة finish سوف يخرج من حلقته ،، وعند السيرفر سوف يستلم الكلمة finish ولن يفعل شيئا لأنها ليست txt ولا file ، وحينها سيقوم بالقرائه مره أخرى .. وهنا المشكل !! فلا يوجد شيء يرسله الكلاينت ...

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

عدلت قليلا ، وهذه الدالة run في السيرفر :

  public void run(){
			 while(true){
				 try{
					 String type = reciever.readUTF();
					 if( type.equals(":file:") ){
						 String from = reciever.readUTF();
						 String filename = reciever.readUTF();
						 int file_length = reciever.readInt();
						 byte[] bytes = new byte[file_length];
						 reciever.read(bytes);
						 File file = new File("C:\\"+filename);
						 FileOutputStream writer = new FileOutputStream(file);
						 writer.write(bytes);
						 writer.close();
					 }
					 else
					 if( type.equals(":txt:") ){
						 String from = reciever.readUTF();
						 String txt = reciever.readUTF();
						 System.out.println(from+">> "+txt);
					 }
					 else if ( type.equals(":finish:") ){
						 System.out.println("Cleint Exit");
						 return;
					 }

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

			 }
		}

وهذا تعديل بسيط في الكلاينت :

 String state;
		Scanner scan = new Scanner(System.in);

		main();

		while(true){
			state = scan.nextLine();
			if( state.equals("txt") ){
				String txt = scan.nextLine();
				chat(txt);
			}
			else
			if( state.equals("file") )
				sendFile();
			else if ( state.equals("finish") ) {
				 sender.writeUTF(":finish:");
				 break;
			}

			System.out.println("================================");
			main();
		}

لماذا خرج هذا الException ، الله أعلم :) .. فكما وضح أخي علاء هو له علاقه بالترميز ، لكن مالذي حدث فعليا فلا أعرف ..

---------

أخي علاء كيف حالك ان شاء الله تكون بخير ؟

اشتقنالكم شباب ولقسم الجافا :blush:

بالتوفيق :) ..

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

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

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

#5

هذا الكلام المذكور في الدالة read وهي الدالة التي تقوم بإنتاج المشكلة

UTFDataFormatException - if the bytes do not represent a valid modified UTF-8 encoding of a string

أي جملة يا محمد التي تؤدي إلى المشكلة؟

وهل المشكلة تظهر دوماً لأني جربت البرنامج ولم أحصل على أي شيء

وجدي يا دب

لو اشتقتلنا كنت سألت علينا :(

بس والله منورنا آخر حاجة على رأي الإخوة المصريين :lol:

تحياتي

تم تعديل هذه المشاركة بواسطة علاء الصالحي في 2 أغسطس 2009 في 05:53

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

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

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

728x90.png

#6
اقتباس
......... ...

البرنامج يعمل عند ادخال txt ولم أجرب file ، والمشكله exception تحصل عند ادخال finish ..

.........

وين هالغيبة الطويلة يا وجدي , والله اشتقنالك و لإبداعاتك .... شكرا على محاولاتك معي.

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

اقتباس
أي جملة يا محمد التي تؤدي إلى المشكلة؟

وهل المشكلة تظهر دوماً لأني جربت البرنامج ولم أحصل على أي شيء

حقيقة المشكلة تكمن في السيناريو التالي :

انه بعد تحديد عملية ارسال البيانات على أنها (ملف) File , وظهور JFileChooser لاختيار الملف المراد إرساله , تظهر هنا المشكلة , وحتى أكون صادق , المشكلة لا تظهر في كل الحالات , وإنما أثناء أرسال بعض انواع الملفات, وبصراحة لا أعلم ما هي معايير إرسال الملفات , لكن الإستثناء أو Exception يحدث في الجزء الخاص بـالسيرفر , و بالأخص في جملة الإستقبال

String type = reciver.readUTF()

,

للتوضيح أكثر نتابع الصور :

انا استخدم شاشة command الخاصة ببرنامج NetBeans , حيث أنه بعد كتابة الأمر File الدال على أن العملية هي عملية إرسال ملف إلى السيرفر , وبعد اختيار الملف من شاشة JFileChooeser, وهو كما تشاهدون في الصورة ArabicList.xls

397782018.jpg

النتيجة كما تشاهدون في الصورة التالية :

حيث أن هذا الإستثناء حدث بعد اختيار الملف و إرساله إلى السيرفر :

547355459.jpg

#7

تحياتي

اضن الموضوع واضح اخ محمد وكما ذكر الاخ علاء

االاحظ في الاستثناءات التي ادرجتها بالصورة و بالكود وحسب السيناريو الذي طرحته بان المشكلة في encryption التي تقوم فيها الة جافا

لحماية الملفات انت تقوم بقرأتها كتشفير ..لكن اذا لاحظت هناك توزيع معين للـ byte عندما يحول الى bits

وهذا التوزيع يختلف اختلافا" تاما" بين ملف واخر .. لا اريد ان ادرخل في معمعة قد لا اخرج منها لكن

الحل :

اضن عليك باستخدام method تقوم بقرأئة البيتات كلها

void readFully(byte[] b)
			   throws IOException

هكذا فهمت المشكلة ... اذا كنت مخطا تستطيع التجاهل ... او تنبيهي

لم اجرب كودك الصراحة ...لانني لا اعمل على جهازي

بالتوفيق للجميع

الله معكم

#8
String type = reciver.readUTF()

غريبة جداً

في هذه الجملة لا تقرأ من ملف أصلاً

معنى الكلام أنك لن تخالف UTF إلا لو كانت String نفسها تخالفها

تحياتي

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

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

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

728x90.png

#9

شكرا لجميع إخواني الذين شاركوني :::

لكن للأسف لم أتمكن من حل المشكلة أبدا ,, لذلك قمت بالإستغناء عن readUTF , واستخدمت بدلا منها readInt , للدلالة على نوع العملية , والحمد لله نجحت العملية إلى الان ,,, لكن بصراحة لم أتوقع أن أواجه مشكلة كالتي سبقت و لا أجد لها حل , حتى أني بحثت في الشبكة لكن لم أجد حل مقنع للأسف..

إخواني عندي سؤال لو سمحتم :

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

ثانيا :

ما هو الفرق بين انشاء File و إنشاء TempFile ????

#10

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

حمد لله المهم أتحلت :P ..

بالنسبة للحجم المسموح عند الإرسال فعند استخدامك tcp socket فلا يوجد هناك حد معين على ما أعتقد ،، أما عند استخدامك للudp socket فحجم أي باكت يجب أن يكون بحدود 60 KB ، واذا كان الملف أكبر يجب تقسيمه لعده باكتات حتى ترسل ..

بالتوفيق :) .

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

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

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

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

حمد لله المهم أتحلت tongue.gif ..

بالنسبة للحجم المسموح عند الإرسال فعند استخدامك tcp socket فلا يوجد هناك حد معين على ما أعتقد ،، أما عند استخدامك للudp socket فحجم أي باكت يجب أن يكون بحدود 60 KB ، واذا كان الملف أكبر يجب تقسيمه لعده باكتات حتى ترسل ..

بالتوفيق regular_smile.gif .

شكرا يا وجدي على المتابعة , لكن ما الحكمة من أن حجم البيانات المرسلة يجب أن تكون بحدود 60KB ؟؟؟

ما هو الفرق بين انشاء File و إنشاء TempFile ????

#12

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

التراسل في الudp يكون على شكل باكتات وبروتكول udp محدد شكل الباكت Packet structure ومكوناته ، وحجم الباكت بالكامل 60 KB ينقص منها 2 KB للهيدر ، يعني لديك 58 KB فقط ، عن نفسي سابقا احتجت لنقل ملفات كبيره حوالي 1 GB وقمت بنقلها بtcp بلا مشاكل ، أما بudp فظهر لي exception واضطرت لعمل طريقة لتقسيم الملف وارساله كباكتات .. يمكنك مراجعه الشفره في موضوع "برمجه الشبكات" ..

لذلك يفضل أن تستخدم tcp اذا كنت تريد نقل كميات كبيره من البيانات ، كما جاء هنا ( UDP : Java Glossary ) :

You use TCP/IP over UDP when:

* You want to transport large volumes of data.

* Accuracy is important.

* You want to use HTTP which piggybacks over TCP/IP.

بالنسبة لTempFile فأول مره أرى هذا الكلاس ، وهو يستخدم لإنشاء ملفات يستخدمها التطبيق نفسه ،، وتكون عملها في أثناء عمل البرنامج وينتهي دورها بانتهاء الملف ،، يعني تستخدم لتخفيف العبيئ على الذاكرة فبدلا من تخزين كمية من المعلومات في الجلسة الحالية للتطبيق في الذاكرة يمكنك وضعها في ملف وتستخرجها وقت الحاجه لها اثناء عمل البرنامج .. وعندما ينتهي عمل البرنامج تفرغ المحتويات وربما يحذف الملف ، لم أجربها ولكن يبدوا كذلك :) .

بالتوفيق :) ..

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 4 أغسطس 2009 في 08:54

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

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

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

#13
اقتباس
وجدي يا دب

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

بس والله منورنا آخر حاجة على رأي الإخوة المصريين

حرام عليك يا أبو علوة :) .. شوقنا بحر زي ما يقولوا .. بس كنت عايز اظهر بعد التخرج كمفأجأة يعني :P ..

كده يعني لا تقول مبروك ولا تجيب لا كيكة ولا لحمة ولا فول حتى :angry:

بعدين انا دب :S انا وزني بضعه وخمسون ميغابايت وكم كيلوبايت كده :lol:

بالتوفيق :wub: ..

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

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

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

#14

هذا الكلام صحيح لأن TCP يعمل على التقسيم منه فيه ويقوم بضمان وصول البيانات إلى الطرف الآخر

بالعكس مع UDP الذي لا يهتم إلا بعملية نقل البيانات طبعاً أنت ونصيبك وصلت أو ما وصلتيش

محمد هل لاحظت أي شيء على الملفات التي تقوم بنقلها؟

كبيرة صغيرة اسمها بالعربي امتدادات معينة

أي شيء حول الموضوع

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

حبيبي يا أبو الوجد

ألف مبروك ولو أنك ما عزمتنيش على المشروع تبعك

ولا شكلك خفت لحسن ما تعرف تناقش كويس :lol:

أصل كلمة يا دب بقولها لما أحب أعاتب أخ عزيز عليه

وأنتا عزيز عليه يا وجدي

مرة ثانية ألف مبروك وعقبال الماجستير إن شاء الله

تحياتي

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

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

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

728x90.png

#15

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

ثانيا : ألف شكر على محاولاتك معي , وجزاك الله خيرا.

اقتباس
محمد هل لاحظت أي شيء على الملفات التي تقوم بنقلها؟

كبيرة صغيرة اسمها بالعربي امتدادات معينة

أي شيء حول الموضوع

للأسف يا علاء لم ألاحظ اي شيء مما ذكرت , و لا أظن أن له علاقة باللغة , و لا أعتقد ان لها علاقة بحجم الملفات , و الدليل على ذلك أنه بعد استبدالي طريقة استقبال نوع العملية من UTF إلى Int , لم أعد ألاحظ المشكلة .

#16

يهيألي أني مسكت المشكلة والله العليم

بعد إرسالك للملف جرب أغلق الـ stream بمعنى آخر أغلق المنفذ socket نفسه

وأخبرني إذا كانت نفس المشكلة تحصل أم لا

تحياتي

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

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

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

728x90.png

#17
اقتباس
يهيألي أني مسكت المشكلة والله العليم

بعد إرسالك للملف جرب أغلق الـ stream بمعنى آخر أغلق المنفذ socket نفسه

وأخبرني إذا كانت نفس المشكلة تحصل أم لا

أنا لم أجرب فكرتك يا علاء وذلك لانني بحاجة لأن أبقي Socket مفتوح طول وقت الجلسة.

ألا ترى معي أني من غير المنطقي أن أغلق Socket و افتحه في كل مرة أريد الاتصال ...

تم تعديل هذه المشاركة بواسطة MKSoft في 5 أغسطس 2009 في 14:49

#18

طيب ما رأيك أن ترسل الجميع عن طريق الدالة UTF

ربما قد يبدو هذا غير منطقياً عند إرسال ملف

لكن بعض التجربة قد تجدي نفعاً

تحياتي

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

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

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

728x90.png

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