View Full Version : مشکل در نوشتن برنامه چت
kfaghih
دوشنبه 18 بهمن 1395, 18:42 عصر
با سلام خدمت اساتید محترم .
من با استفاده از برنامه نویسی سوکت یک برنامه چت خیلی ساده نوشتم . زمانی که برنامه رو روی کامپیوتر سرور اجرا می کنم مشکلی نداره اما زمانی که برنامه رو روی کامپیوتر کلاینت اجرا می کنم با این ارور مواجه می شم : java socket address already in use:jvm bind
کد قسمت های مختلف برنامه به این صورته
کد اتصال در سرور :
public ServerSocket so = new ServerSocket(3308);
public Socket ml =so.accept();
public DataInputStream input = new DataInputStream( ml.getInputStream() );
public DataOutputStream output=new DataOutputStream(ml.getOutputStream());
کد مربوط به اتصال در کلاینت :
public InetAddress ip=InetAddress.getByName("192.168.01.20");
int port=3308;
public Socket mylink=new Socket (ip, port);
public DataInputStream input = new DataInputStream( mylink.getInputStream() );
public DataOutputStream output=new DataOutputStream(mylink.getOutputStream());
این هم کد کلاس دریافت پیام در هر دو برنامه :
public class Receive implements Runnable {
@Override
public void run() {
Server_Side ss;
do{
try {
ss = new Server_Side();
String me =ss.input.readUTF();
ss.txtinbox.setText(ss.txtinbox.getText()+"\n"+me);
} catch (Exception ex) {
JOptionPane.showMessageDialog(null,ex.getMessage() );
}
}
while(true);
}
}
این هم کد اعلان این کلاس و اجرای ترد در متد main کلاس اصلی هر دو برنامه :
Receive re = new Receive();
ExecutorService exr = Executors.newCachedThreadPool();
exr.execute(re);}
catch(Exception e){System.out.println(e.getMessage());}
در ضمن این برنامه رو جند بار با port های متفاوت امتحان کردم ولی باز به همین ارور برخوردم.
ممنون می شم اگر من رو راهنمایی کنید.
[younes]
سه شنبه 19 بهمن 1395, 19:16 عصر
حداقل از تگ جاوا استفاده کن ، بتونیم بخونیمش ......
kfaghih
سه شنبه 19 بهمن 1395, 21:31 عصر
;2357759']حداقل از تگ جاوا استفاده کن ، بتونیم بخونیمش ......
من از تگ جاوا استفاده کردم نمی دونم چرا عمل نمی کنه
vahid-p
چهارشنبه 20 بهمن 1395, 22:09 عصر
بهتر نیست کدش رو بذارید و همچنین نحوه استفادش رو توضیح بدید تا ما هم با خطایی که گفتید روبرو بشیم
kfaghih
شنبه 23 بهمن 1395, 14:57 عصر
بهتر نیست کدش رو بذارید و همچنین نحوه استفادش رو توضیح بدید تا ما هم با خطایی که گفتید روبرو بشیم
کدش رو گذاشتم
vahid-p
شنبه 23 بهمن 1395, 22:33 عصر
در cmd ویندوز این کد رو وارد کنید netstat -nao تا وضعیت پورت ها رو ببینید.
ضمنا منظورم از سورس کد، کل سورس کد بود تا بتونیم اجرا کنیم (آماده اجرا باشه). و همچنین مراحلی که شما طی میکنید تا به این خطا بر میخورید تا به مشکل شما بربخوریم.
kfaghih
یک شنبه 24 بهمن 1395, 16:59 عصر
در cmd ویندوز این کد رو وارد کنید netstat -nao تا وضعیت پورت ها رو ببینید.
ضمنا منظورم از سورس کد، کل سورس کد بود تا بتونیم اجرا کنیم (آماده اجرا باشه). و همچنین مراحلی که شما طی میکنید تا به این خطا بر میخورید تا به مشکل شما بربخوریم.
سلام ممنون بابت توجهتون رابط گرافیکی برنامه رو با نت بینز طراحی کردم به همین خاطر سورس کد برنامه خارج از محیط نت بینز مرتب نیست
vahid-p
دوشنبه 25 بهمن 1395, 12:43 عصر
مثلا اون کلاس Server_Side که در کد بالا استفاده شده، کجاست کدش من نمیبینم؟ برای همین میگم کل سورس رو بذارید (مثل این پست http://barnamenevis.org/showthread.php?535057 کد پروژه رو بذارید تا بتونم اجرا کنم).
چند بار خواستم کل سورس کد رو بذارید، ولی هر بار یه چیزی میگید (شایدم گذاشتید، من که نمیبینم جز چند خطی که تو پست اول گذاشتید).
شاید من منظورم رو بد رسوندم و شاید شما متوجه منظور من نمیشید.
گفتم:
سورس پروژه (نت بینز یا هر چی شامل فولدرها srcوbuild و... و فایلها) در یک فایل zip قرار بدید و بفرستید.
بعلاوه
چه مراحلی رو اجرا میکنید که به اون خطا بر میخورید.
این ها رو که انجام دادید، اگر مشکلتون رو بدونم پاسخ میدم. اگر سورس نمیتونید بذارید، منم متاسفانه نمیتونم راهنمایی کنم (با اون دستوری که گفتم خودتون مشکل رو پیدا کنید).
موفق باشید
kfaghih
دوشنبه 25 بهمن 1395, 16:10 عصر
مثلا اون کلاس Server_Side که در کد بالا استفاده شده، کجاست کدش من نمیبینم؟ برای همین میگم کل سورس رو بذارید (مثل این پست http://barnamenevis.org/showthread.php?535057 کد پروژه رو بذارید تا بتونم اجرا کنم).
چند بار خواستم کل سورس کد رو بذارید، ولی هر بار یه چیزی میگید (شایدم گذاشتید، من که نمیبینم جز چند خطی که تو پست اول گذاشتید).
شاید من منظورم رو بد رسوندم و شاید شما متوجه منظور من نمیشید.
گفتم:
سورس پروژه (نت بینز یا هر چی شامل فولدرها srcوbuild و... و فایلها) در یک فایل zip قرار بدید و بفرستید.
بعلاوه
چه مراحلی رو اجرا میکنید که به اون خطا بر میخورید.
این ها رو که انجام دادید، اگر مشکلتون رو بدونم پاسخ میدم. اگر سورس نمیتونید بذارید، منم متاسفانه نمیتونم راهنمایی کنم (با اون دستوری که گفتم خودتون مشکل رو پیدا کنید).
موفق باشید
سلام عذر می خوام سورس کد سرور و کلاینت رو توی همون پست اصلی آپلود کردم
vahid-p
دوشنبه 25 بهمن 1395, 23:27 عصر
بعضی وقتا مثل اینکه کد یک بار که اجرا میشه، اون پورت رو میگیره، برنامت تو یه لوپ همچین چیزی افتاده و یا در دفعات بعدی اون پورت چون از قبلا اشغال شده این اررور میده.
یکم دستکاریش کردم، اون اررور رو نمیده، ولی مشکلی که داره کلا کد رو بد نوشتی. من علت اون حلقه داخل کلاس Receive رو نگرفتم.
به هر حال کد رو از اول بنویسید. این رو در نظر بگیرید که شما بعد از اینکه در سرور so.accept() جوابش رو گرفتید، اون راه ارتباطی شما با کلاینت مورد نظر هست. پس سعی کنید چندین بار رو این پورت که قبلا استفاده شده، یا در کلاینت کار تکراری در این زمینه انجام ندید (مثل اون حلقه ای که نوشته بودید).
ضمنا در بخش فیلدها، متغیرها رو مقدار دهی نکنید. در کانستراکتور بنویسید یا یه متد دیگه.
بعد که تونستید یکبار اینکار رو به خوبی انجام بدید، اونوقت سعی کنید برنامه سرور رو بهترش کنید و اینکه بتونه چندین کلاینت بهش وصل بشه و...
همچنین این رو اضافه کنید که اگر ارتباط قطع شد، کلاینت دوباره سعی کنه خودش رو به سرور متصل کنه (مثلا در فاصله های زمانی 5 ثانیه تست کنه مثلا ده مرتبه سعی کنه و اگر نشد خطای اشکال شبکه به کاربر بده).
ولی این دو مورد رو بعدا سعی کنید. نمیخواد همه چیز از اول وارد بشه.
ضمنا پیشنهاد میکنم اول اون بخش اول رو بدون رابط گرافیکی انجام بدید تا کدتون شلوغ نشه بدونید دارید چیکار میکنیید
kfaghih
سه شنبه 26 بهمن 1395, 18:08 عصر
بعضی وقتا مثل اینکه کد یک بار که اجرا میشه، اون پورت رو میگیره، برنامت تو یه لوپ همچین چیزی افتاده و یا در دفعات بعدی اون پورت چون از قبلا اشغال شده این اررور میده.
یکم دستکاریش کردم، اون اررور رو نمیده، ولی مشکلی که داره کلا کد رو بد نوشتی. من علت اون حلقه داخل کلاس Receive رو نگرفتم.
به هر حال کد رو از اول بنویسید. این رو در نظر بگیرید که شما بعد از اینکه در سرور so.accept() جوابش رو گرفتید، اون راه ارتباطی شما با کلاینت مورد نظر هست. پس سعی کنید چندین بار رو این پورت که قبلا استفاده شده، یا در کلاینت کار تکراری در این زمینه انجام ندید (مثل اون حلقه ای که نوشته بودید).
ضمنا در بخش فیلدها، متغیرها رو مقدار دهی نکنید. در کانستراکتور بنویسید یا یه متد دیگه.
بعد که تونستید یکبار اینکار رو به خوبی انجام بدید، اونوقت سعی کنید برنامه سرور رو بهترش کنید و اینکه بتونه چندین کلاینت بهش وصل بشه و...
همچنین این رو اضافه کنید که اگر ارتباط قطع شد، کلاینت دوباره سعی کنه خودش رو به سرور متصل کنه (مثلا در فاصله های زمانی 5 ثانیه تست کنه مثلا ده مرتبه سعی کنه و اگر نشد خطای اشکال شبکه به کاربر بده).
ولی این دو مورد رو بعدا سعی کنید. نمیخواد همه چیز از اول وارد بشه.
ضمنا پیشنهاد میکنم اول اون بخش اول رو بدون رابط گرافیکی انجام بدید تا کدتون شلوغ نشه بدونید دارید چیکار میکنیید
سلام ممنون از راهنماییتون ولی من درست متوجه نشدم می شه بیشتر توضیح بدید ؟ در ضمن اون حلقه مال اینه که برنامه مدام چک کنه که اگر پیعامی از طرف مقابل داشت اون رو به کاربر نشون بده.
vahid-p
سه شنبه 26 بهمن 1395, 22:26 عصر
سلام ممنون از راهنماییتون ولی من درست متوجه نشدم می شه بیشتر توضیح بدید ؟ در ضمن اون حلقه مال اینه که برنامه مدام چک کنه که اگر پیعامی از طرف مقابل داشت اون رو به کاربر نشون بده.
خیر مشکل برنامه شما اینه که دقیقا اون حلقه باعث میشه هر بار new Server_Side() بشه ودرنتیجه دفعه دوم بخواد روی پورت قبلی که سوکت زده شده دوباره سوکت بزنه. در نتیجه از قبل رزرو شده.
برای خوندن پیامها نیاز به سوکت جدید نیست، بلکه فقط باید ورودی رو بخونید.
بگذریم. منظور من این بود برنامتو از اول بنویس. فرض کن این برنامه نیست. برای اینکه درست بنویسید، از نمونه های فراوونی که تو نت هست استفاده کنید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.