PDA

View Full Version : مشکل در ساختن برنامه چت ساده



combo_ci
شنبه 23 دی 1385, 22:21 عصر
من یک برنامه ساده چت برای درس مهندسی اینترنت نوشتم...این برنامه رو وقتی تو نت بین اجرا میکنم خطای IOExption میده .....میتونین کمکم کنید ؟

برنامه سرور :


package server;

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

class MTServer implements Runnable{
Socket c;
MTServer(Socket c){
Thread t = new Thread(this);
this.c = c;
t.start();
}
public void run(){
try{
for(;;){
DataInputStream din = new DataInputStream(c.getInputStream());
DataOutputStream dout = new DataOutputStream(c.getOutputStream());
// BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
String temp = din.readUTF();
dout.writeUTF(temp.toString());
dout.flush();

}
}
catch(Exception e){
System.out.println(e);
}
}

}

public class Main {

public Main() {
}

public static void main(String[] args) {
try{
ServerSocket s = new ServerSocket(5000);
for(;;){
new MTServer(s.accept());
}
}
catch(Exception e1){
System.out.println(e1);
}

}

}


برنامه کلاینت :

package client1;

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

public class Main {

public Main() {
}

public static void main(String[] args) {
try{
for(;;){
Socket c = new Socket("127.0.0.1",5000);
DataInputStream din = new DataInputStream(c.getInputStream());
DataOutputStream dout = new DataOutputStream(c.getOutputStream());
BufferedReader b= new BufferedReader(new InputStreamReader(System.in));
String temp = b.readLine();
if(temp == "para") break;
dout.writeUTF(temp.toString());
dout.flush();
String chat = din.readUTF();
//System.out.println(temp);
System.out.println(chat);
din.close();
c.close();

}
}
catch(Exception e){
System.out.println(e);
}
}
}

combo_ci
سه شنبه 26 دی 1385, 21:38 عصر
ای بابا کسی نمیتونه کمک کنه......باز بگید جاوا از دات نت بهتره......

Mamdos
چهارشنبه 27 دی 1385, 00:18 صبح
ای بابا کسی نمیتونه کمک کنه......باز بگید جاوا از دات نت بهتره......

واقعا به نظر شما این که کسی در این جا نتونسته یا نخواسته به سؤالتون جواب بده به بهتر بودن یا بدتر بودن جاوا ربطی داره؟!


و اما برنامه‌ی شما:
اتفاقی که می‌افتد این است که شما در سمت کارخواه(1) اتصال را می‌بندید ( c.close() )؛ در حالیکه کارساز(2) بیچاره در یک حلقه‌ی for قرار دارد و سعی می‌کند که بازهم از c ورودی بگیرد (و چون c بسته است EOFException می‌اندازد)، درحالیکه کارخواه، c را بسته و به جایش یک اتصال جدید برقرار می‌کند (Socket c = new Socket("127.0.0.1",5000);) که باعث به وجود آمدن یک شیئ MTServer جدید می‌شود. شما نباید برای هر پیغامی که کارخواه به کارساز می‌فرستد یک سوکت(3) جدید درست کنید. فقط یک جریان(4) جدید از سوکت حاضر بگیرید و آن را بعد از فرستادن پیغام ببندید. سوکت را بعد از این که کلا دیگر نیازی به اتصال نیست ببندید.

البته بستن سوکت هم احتمالا مزیت دارد (چون تا جایی که می‌دانم هر سوکت باز روی شبکه سربار دارد) که در این صورت یک کم باید طراحیتان را تغییر بدهید تا به ازای هر پیغام یک ریسمان(5) جدید ایجاد نشود.

(1) معادل فارسی client
(2) معادل فارسی server
(3) برای این یکی معادل فارسی پیدا نکردم. «سرْاتصال» چطور است؟
(4) stream
thread (5)

combo_ci
چهارشنبه 16 دی 1388, 08:32 صبح
ببین کارتو راه میندازه

manvaputra
چهارشنبه 16 دی 1388, 08:56 صبح
ای بابا کسی نمیتونه کمک کنه......باز بگید جاوا از دات نت بهتره...... دوست عزيز اگه كمي وقت بذاريد و جستجو كنيد توي همن تالار بنده خودم شخصا آموزش كامل نوشتن چت مبتني بر TCP و UDP با مالتي تردينگ رو گذاشتم

Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد) ‏ (http://barnamenevis.org/forum/showthread.php?t=124632)