مشکل با jar

the_king

مدیرکل انجمن
من با IntelliJ IDEA 2017.2 x64 کد میزنم که سورس p2p چت هست.وقتی اجرا میکنم درست کار میکنه ولی وقتی خروجی jar میگیرم درست کار نمیکنه فایلها علت چیه؟
اینم سورس
GitHub - hackerkid/peerchat: Peer to peer multi chat application with encryption made in Java
این کد برای محیط کنسولی ویندوز طراحی نشده، ویندوز محیط کنسولی اش با ISO-8859-1 سازگار نیست، برای همین بصورت پیشفرض BufferedReader و PrintWriter ای ایجاد میشه که نمیتونه محتویات ISO-8859-1 رو انتقال بده. تو هر دو تا کد سرور و کلاینت ببینید in و out چطور ساخته میشه، باید طوری تغییر شون بدید که سازگار با ISO-8859-1 باشند نه CP850 پیشفرض
کد:
                in = new BufferedReader(new InputStreamReader(
                    socket.getInputStream(),"ISO-8859-1"));
                out = new PrintWriter(new OutputStreamWriter(
                        socket.getOutputStream(),"ISO-8859-1"), true);

فراموش نکنید که وقتی دارید با jar کار می کنید برای بسته شدن سرور در Task Manager پروسه های java و javaw در حال اجرا رو ببندید.
نمونه پیوستی شامل کد ویرایش شده و فایل های jar ئه.
peerchat-master-zip
 

پیوست ها

  • peerchat-master.zip
    13.5 کیلوبایت · بازدیدها: 4
کلی ممنون راستش تازه دارم کار میکنم البته یک برنامه میخوام درست کنم که با سوکت نویسی معمولی نتونستم برای همین اومدم سراغ p2p مگه نه جاوا فقط یه خورده سینتکسش رو مطالعه کردم و اینایی که گفتین رو اصلا متوجه نشدم و به نظر خیلی تخصصیه.بهر حال همیشه موفق باشین این همه کامل و مفهموی جواب میدین.یاشاسین تبریز
 
ببخشید در مورد این پروسه یا پروتکل p2p یا هر چی که تو نت سرش بحثه دقیقا چی هست (طبق سرچی که زدم) اموزش فارسی خوبی نبود که کد به کد یا کمی دقیق در مورد پیاده سازیش توضیح داده باشه میتونین یه توضیح و برداشت شخصیتون رو بگین و یک اموزش که چه طوری شروع کنیم و تابعها یا کلاسهاش چین و هر کدوم چه کاری نمیکنن رو بزارین
 

the_king

مدیرکل انجمن
ببخشید در مورد این پروسه یا پروتکل p2p یا هر چی که تو نت سرش بحثه دقیقا چی هست (طبق سرچی که زدم) اموزش فارسی خوبی نبود که کد به کد یا کمی دقیق در مورد پیاده سازیش توضیح داده باشه میتونین یه توضیح و برداشت شخصیتون رو بگین و یک اموزش که چه طوری شروع کنیم و تابعها یا کلاسهاش چین و هر کدوم چه کاری نمیکنن رو بزارین
این p2p نه پروسه است و نه پروتکل. p2p یا peer to peer یجور معماری توزیع شده است که خیلی مفهوم کلی ای هم داره و پیاده سازیش فقط یا یکی دو روش نیست.
مفهوم کلی اش اینه که هر گره تو شبکه هم نقش Server رو داشته باشه و هم Client و برای ارتباطش با سایر گره ها یک Server مرکزی در کار نباشه، دیگه از این ساده تر معماری شبکه ای وجود نداره.
کد نویسی خاصی نداره، چون یک مفهوم کلی ئه. وقتی شما با کابل شبکه دو تا کامپیوتر رو به هم وصل می کنید یک شبکه p2p بین شون ایجاد کردید، حالا اگه ارتباط این دو تا کامپیوتر با Bluetooth یا Wifi یا کابل Parallel پرینتر یا کابل رابط USB بود باز هم این معماری p2p ایجاد میشد، این چیزی نیست که ربطی به کد نویسی داشته باشه.
برنامه نویسی سوکت هم بخشی اش مربوط به سیستم عامله و بخشی اش مربوط به زبان برنامه نویسی. تو زبان هایی مثل جاوا که مستقیما درگیر سیستم عامل نیستید خیلی ساده تر.
اون سیستمی که میخواد ارتباط رو روی سوکت ایجاد کنه یک ServerSocket ایجاد می کنه روی پورت فلان :
کد:
ServerSocket socket = new ServerSocket(PORT);
این سوکت با start منتظر میشینه تا کسی بهش وصل بشه و پیامی ارسال کنه، تا وقتی ارتباط مشکل نداشته باشه این دریافت پیام ها ادامه داره، ولی وقتی سوکت به خطا برخورد کرد دیگه باید سوکت با close بسته بشه :
کد:
        try {
            while (true) {
                new Handler(socket.accept()).start();
            }
        } finally {
            socket.close();
        }

چون اون سیستم سوکت رو ایجاد کرده بود و مسئولیتش رو داشت باید سوکت رو در انتها می بست تا پورت آزاد بشه وگرنه در بقیه سیستم ها دیگه اون چند خط کد هم لازم نیست.
هر سیستمی دیگه ای که بخواد از این ارتباط سوکتی استفاده کنه دیگه نمیاد یه ServerSocket جدید بسازه، بجاش با ساختن Socket وصل میشه به همون سوکتی که قبلا در سیستم دیگری ایجاد شده و البته باید آدرس میزبانی که سازنده اش بوده بدونه :
کد:
Socket socket = new Socket(serverAddress, PORT);
هم اون ServerSocket و هم اون Socket یک InputStream دارن و یک OutputStream، اولی ورودی ئه که پیام بگیره مثل cin در ++C و دومی خروجی ئه که پیام بفرسته مثل cout در ++C.
با getInputStream اون Stream ورودی رو میگیرند و با getOutputStream اون Stream خروجی رو. از تو Stream ورودی میشه مقدار برداشت و تو Stream خروجی میشه مقدار نوشت، حالا اینکه پیام ها چه پروتکلی دارن دیگه ربطی به سوکت نداره، مطابق تعریف کد نویسه. برنامه نویس تصمیم میگیره که ورودی و خروجی ها با چه پروتکلی باشند، کاملا شخصی و دست برنامه نویس بازه. این stream ها شبیه به cin و cout تو ++C ئه.
کد:
in = new BufferedReader(new InputStreamReader(
            socket.getInputStream(),"ISO-8859-1"));
کد:
        out = new PrintWriter(new OutputStreamWriter(
                socket.getOutputStream(),"ISO-8859-1"), true);
حالا اینکه این مقادیر رد و بدل شده رمز نگاری میشه یا نمیشه، برای درستی و نویز چک میشه یا نمیشه و چه اطلاعاتی داخلشون هست دیگه بحث ارتباط سوکتی نیست، مربوط به پروتکل دلخواه برنامه نویسه.
 
خیلی ممنون تمام مشکل من تو سوکت نویسی ایجاد ارتباط بین یه سرور و کلاینت که تو یک شبکه نیستن هستش برای همین رو اوردم به این سورس که این قابلیت رو داشت که کلاینت رو به هر کی حتی یک شهر دیگه میدم میتونه بهم وصل بشه و چت کنیم اما تو سورسهای سوکت فقط با لوکال ایپی میتونم وصل بشم فکر کمک 25 نوع سورس رو تست کردم که همه با 127.0.0.1 کار میکنن که به دردم نمیخوره سوال قبلیمم که مربوط به سورس یک سوکت بود مربوط بهمین بود نمیتونستم به سرور در یک شبکه خارجی با ایپی اینترنتی یا ادرس دی ان اس وصل بشم اگه براتون زحمتی نیست یک سورس سوکت نویسی سرور کلاینت بزارین که با ایپی اینترنتی نه لوکال هست بشه به هم وصل شد
مشکل با کد جاوا
 

the_king

مدیرکل انجمن
خیلی ممنون تمام مشکل من تو سوکت نویسی ایجاد ارتباط بین یه سرور و کلاینت که تو یک شبکه نیستن هستش برای همین رو اوردم به این سورس که این قابلیت رو داشت که کلاینت رو به هر کی حتی یک شهر دیگه میدم میتونه بهم وصل بشه و چت کنیم اما تو سورسهای سوکت فقط با لوکال ایپی میتونم وصل بشم فکر کمک 25 نوع سورس رو تست کردم که همه با 127.0.0.1 کار میکنن که به دردم نمیخوره سوال قبلیمم که مربوط به سورس یک سوکت بود مربوط بهمین بود نمیتونستم به سرور در یک شبکه خارجی با ایپی اینترنتی یا ادرس دی ان اس وصل بشم اگه براتون زحمتی نیست یک سورس سوکت نویسی سرور کلاینت بزارین که با ایپی اینترنتی نه لوکال هست بشه به هم وصل شد
مشکل با کد جاوا
هیچ کد برنامه نویسی ای تو دنیا پیدا نمی کنید که با IP ای که تو شبکه درست Forward نمیشه کار کنه. روتر هم بدون تنظیم ارتباطی که گیرنده خودشه تو شبکه Forward نمی کنه.
قبلا که توضیح دادم صورت مساله رو، خودتونم گفتید به Port Forwarding وارد هستید. کد ها هیچ ایرادی ندارند، صورت مساله شما مثل اینه که انگار تو یه خونه مودم Wifi ای هست و فرهاد و شهاب و بابک وصل شدن به این مودم و از اینترنت استفاده می کنند. هر کدوم که توی اینترنت دنبال IP شون بگردند یک آدرس یکسان می بینند. مگه توقع دارید هر کدوم یک IP جدا گانه داشته باشند؟ خوب اینکه طبیعیه، شما IP ای که متعلق به کارت شیکه تون نیست و متعلق به روتر ئه رو میذارید جای IP محلی و میگید کد کار نمی کنه.

این IP که واقعا متعلق به فرهاد و شهاب و بابک که نیست، IP ای است که سرویس دهنده اینترنت به روتر مودم تخصیص داده، با همچین IP ای فرهاد و شهاب و بابک که نمیتونند روی یک پورت با هم در ارتباط باشند، چون فرستنده روتر ئه و گیرنده روتر. پورت هم که یکی ئه، تا روتر نفهمه که فرستنده کیه و گیرنده کیه نمیتونه ارتباط بینشون رو برقرار کنه.
حالا هر کدی رو امتحان کنید تا پای روتر درست کار می کنه ولی روتر اگه درست پیام رو Forward نکنه به هیچ گیرنده ای پیام نمیرسه. میگید کد ایراد داره که با همچین IP ای نمیشه اتصال سوکت برقرار کرد، میگم کد ایراد نداره، میشه، فرقی نداره IP چی باشه، شرطش اینه که روتر های بین راهی ارتباط رو درست Forward کنند. تو روتر های سرویس دهنده و اینترنت که مشکلی نیست که بخواهید تنظیمشون رو دست بزنید، دست شما هم نیستند که تنظیم شون رو تغییر بدید. حتی اگه یه پورتی رو ببندن هم نمیتونید بازش کنید. فقط میمونه روتر خودتون که قابل تنظیمه. حالا تنظیمش رو درست انجام بدید کار می کنه و درست تنظیمش نکنید صد تا کد دیگه رو هم تو هر زبانی امتحان کنید همین میشه. این مشکل ارتباط شبکه و روتر ئه، مشکل کد نویسی که نیست.
 
ببخشین من این سورس رو اون موقع تست کردم درست بود امروز دوباره تست کردم فایل سرور بالا نمیاد مشکل از کجاست
 
این کد برای محیط کنسولی ویندوز طراحی نشده، ویندوز محیط کنسولی اش با ISO-8859-1 سازگار نیست، برای همین بصورت پیشفرض BufferedReader و PrintWriter ای ایجاد میشه که نمیتونه محتویات ISO-8859-1 رو انتقال بده. تو هر دو تا کد سرور و کلاینت ببینید in و out چطور ساخته میشه، باید طوری تغییر شون بدید که سازگار با ISO-8859-1 باشند نه CP850 پیشفرض
کد:
                in = new BufferedReader(new InputStreamReader(
                    socket.getInputStream(),"ISO-8859-1"));
                out = new PrintWriter(new OutputStreamWriter(
                        socket.getOutputStream(),"ISO-8859-1"), true);

فراموش نکنید که وقتی دارید با jar کار می کنید برای بسته شدن سرور در Task Manager پروسه های java و javaw در حال اجرا رو ببندید.
نمونه پیوستی شامل کد ویرایش شده و فایل های jar ئه.
peerchat-master-zip
منظورم همین سورساست که زحمت کشیدین ادیت کردین.سرور اصلا باز نمیشه
 

جدیدترین ارسال ها

بالا