سلام
من یه برنامهٔ chatroom بر اساس rmi دارم که میخوام یون رو با eclipse اجراش کنم
اگه کسی راهنمایی در این خصوص بکنه خیلی ممنون میشم
با تشکر
سلام
من یه برنامهٔ chatroom بر اساس rmi دارم که میخوام یون رو با eclipse اجراش کنم
اگه کسی راهنمایی در این خصوص بکنه خیلی ممنون میشم
با تشکر
آخرین ویرایش به وسیله javarmi : پنج شنبه 27 بهمن 1390 در 22:11 عصر
سلام
دقیقا مشکل شما چیه؟
اجرا نمیشه (Exception میده؟) یا هنوز نتونستید پروژه رو ایمپورت کنید؟
سلام،
ممنون از پاسختون،
مشکل اینجاست که من برنامهرو هم با cmd و هم با eclipse اجرا کردم و در هر ۲ مورد با errorِ کانکشن مواجه شدم
من متن error رو براتون میذارم
فکر میکنم rmiregistry اجرا نمیشه ولی مطمئن نیستم در ضمن دایرکتوریِ jdk رو هم به path envirnment اضافه کردم
من میتونم اگه بخواین فایلهای برنامهرو براتون بفرستم (اگه میخواید لفطا آدرس ایمیلتون رو بدید من میفرستم به آدرس ایمیلتون)
با تشکر از شما
java.rmi.ConnectException: Connection refused to host: 192.168.251.238; nested e
xception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknow n Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection( Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unk nown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind(Unknown Source)
at Server.main(Server.java:82)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.cre ateSocket(Unknown S
ource)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.cre ateSocket(Unknown S
ource)
... 7 more
سلام دوست عزیز
ببخشید دیر جواب دادم مشکل JDK داشتم مراحل زیر رو انجام بده ببین مشکلت حل میشه
برید به مسیر src و دستورات زیر رو بزنید (تو cmd یا terminal)
1.javac ClientInterface.java
2.javac Client.java
3.javac ServerInterface.java
4.javac Server.java
5.rmic Server
6.start rmiregistry
7.java Server
با این کار سرور start میشه بقیه تست ها تون رو انجام بدین اگه مشکلی بود در خدمتم
سلام،
ممنونم من دقیقا همین commandها رو توی cmd اجرا کردم و همون error که متنش رو گذشتم رو گرفتم
دقیقا دستوراتی که میزنم اینها هست :
javac *
rmic client
rmic server
start rmiregistry
start java server
start java GUI
بعد از start rmiregisty یک پنجرهٔ جدید باز میشه و هیچ اتفاقی نمیفته فکر میکنم rmiregistry اجرا نمیشه ولی نمیدونم علتش چی هست
شما تونستید برنامهرو اجرا کنید؟
در ضمن اگر منبعِ فارسیِ خوب در بارهٔ rmi داشته باشید خیلی ممنون میشم
(تعجب میکنم توی کل اینترنت فقط چند خط اون هم یک مقایسه بینِ rmi و corba بود!)
کلاس های کامپایل شده رو پاک کنید (اونایی که stub دارن)
rmic client رو نباید بزنید فقط server
start rmiregisty هم طبیعی هست فقط window رو نبندید
وبعد سرور رو استارت کنید(java Server) (اول باید سرور اجرا بشه بعد کلاینت ها)
من از این مرحله به بعد رو نرفتم (تست کلاینت ها رو انجام ندادم) ولی شما تست کنید اگه مشکلی بود در خدمتم
یه نکته دیگه این که مشکل او اکسپشن بخاطر rmiregisty هست اگر درست انجام بشه اررور میره (حتما وقتی تو دایرکتری کلاس های کامپایل شدخ هستید rmiregistrty رو انجام بدید )
rmitest.jpg
دقیقا همون error رو داد
یه فرقی که من دیدم سر 192.168.251.238:host هست
برای من زده 127.0.0.1
بزارید یکم سزچ می کنم ببینم میتونم بفهم مشکل کجاست
بله می دونم ولی rmiregistry رو 127.0.0.1 هست
کدی که گذاشتم رو جایگزین Server.java کنید و مراحل رو تکرار کنید امیدوارم مشکلتون حل بشه
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
/**
* This class implements the interface ServerInterface and extends the class
* UnicastRemoteObject. Its constructor and member functions login and
* broadcast can be accessed remotely.
* @autor Matthias Braunhofer
*/
public class Server extends UnicastRemoteObject implements ServerInterface {
/**
* This ArrayList stores a remote reference for each currently logged in client as
* well as its nickname and is used for broadcasting a message, when a client
* invokes the remotely accessible method login.
*/
protected ArrayList<ClientInterface> clients = new ArrayList<ClientInterface>();
/**
* This constructor is used for creating a remote object of type Server. It
* throws a RemoteException if the object handle cannot be constructed.
*/
public Server() throws RemoteException {
}
/**
* Implementation of the remotely invocable method. If a client invokes this
* method then all other currently logged in clients get a notification
* that a new user has joined the chat. This is done by a remote call of the
* method getMessage which is defined for the Client object. A remote reference
* to the new client is added to the ArrayList.
*/
public void login(ClientInterface client, String nickname) throws RemoteException {
broadcastMessage("--> " + nickname + " is entering the chatroom", "");
clients.add(client);
}
/**
* This method is a remote method which is used for broadcasting an incoming message
* and the nickname of its sender to all currently logged in clients. This
* broadcasting is done by a remote call of the method getMessage which is
* defined for a client object. The references to such clients are obtained from
* the ArrayList which stores a remote reference to each currently logged in client.
*/
public void broadcastMessage(String message, String nickname) throws RemoteException {
for (int i = 0; i < clients.size(); i++) {
ClientInterface c = clients.get(i);
try {
c.getMessage(message, nickname);
} catch (RemoteException e) {
/**
* If a client is not accessible, then it is removed from
* the ArrayList and the index i is decremented because
* all other clients go down one place
*/
logout(c);
i = i - 1;
}
}
}
/**
* This method is a local method which is used for removing a connection
* from the ArrayList of all connections.
*/
public void logout(ClientInterface client) {
clients.remove(client);
}
/**
* This main method registers a remote accessible Server object by invoking the
* rebind method on the class Naming. The name of this object is "Server". This
* means that all clients which want to get a reference to this object have to
* specify this name in the lookup method.
*/
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.getRegistry("127.0.0.1");
registry.bind("Server", new Server());
System.out.println("Server is ready");
} catch (Exception e) {
e.printStackTrace();
}
}
}
ممنونم این دفعه مشکل حل شد فقط اگه ممکن بگید دقیقا چی کار کردید و در ضمن بعد از این مرحله دقیقا باید چی کار کنم آیا باید بقیهٔ مراحل رو در یک cmd دیگه ادامه بدم؟
با تشکر فراوان
rmitest2.jpg
خواهش میکنم
rmiregistry روی 127.0.0.1 بایند شده ولی سرور (نمیدونم چرا) به یه ip دیگه (جایی خوندم مربوط به تنظیمات هاست در سیستم عامل میشه)
و من با اضافه کردن
Registry registry = LocateRegistry.getRegistry("127.0.0.1");
مجبورش کردم از 127.0.0.1 استفاده کنه
بله تست کنید اگه مشکلی بود در خدمتم (خودم تست نکردم مرحله بعد رو)مرحله دقیقا باید چی کار کنم آیا باید بقیهٔ مراحل رو در یک cmd دیگه ادامه بدم؟
ممنون
من یک cmd دیگه باز کردم و این command رو توش نوشتم
rmic Client
java GUI
ولی باز هم همون error قبلی رو میده!
فکر کنم Registry registry = LocateRegistry.getRegistry("127.0.0.1"); رو باید جای دیگه هم اضافه کرد
ممنون میشم اگه راهنمایی کنید
rmitest4.jpg
خوب اینم از GUI.java
فقط دوست عزیز این نکته رو بخاطر داشته باش که تنظیمات host رو مستقیم تو کد گفتیم بهتره تو کانفیگ باشه یا از فرم بگیره (یعنی اون تکست فیلدی که هاست رو میپرسه کاری نمی کنه الان!)
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
* @autor Matthias Braunhofer
*/
public class GUI extends javax.swing.JFrame {
private Client client; //reference to the local Client object
private ServerInterface server; //reference to the remote Server object
private static String nickname;
private static String host;
private static JTextArea History;
private JTextField Message;
private JScrollPane jScrollPaneHistory;
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
host = JOptionPane.showInputDialog("Enter the host of the chatserver", "localhost");
nickname = JOptionPane.showInputDialog("Enter your nickname");
if (host != null && nickname != null && !nickname.equals("")) {
try {
GUI inst = new GUI();
inst.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
else System.exit(0);
}
/**
* Inside this constructor we invoke the lookup method on the class Naming for
* receiving a reference to a remote Server object. This remote reference
* is used for invoking the remote method login, which adds a reference to this
* Client object to an existing list of other clients. The remote Server object
* is also used for broadcasting messages.
*/
public GUI() throws MalformedURLException, RemoteException, NotBoundException {
super();
Registry registry = LocateRegistry.getRegistry("127.0.0.1");
server = (ServerInterface)registry.lookup("Server");
client = new Client();
server.login(client, nickname);
initGUI();
}
private void initGUI() {
try {
{
jScrollPaneHistory = new JScrollPane();
getContentPane().add(jScrollPaneHistory);
jScrollPaneHistory.setBounds(7, 7, 378, 203);
jScrollPaneHistory.setHorizontalScrollBarPolicy(JS crollPane.HORIZONTAL_SCROLLBAR_NEVER);
{
History = new JTextArea();
History.setLineWrap(true);
History.setEditable(false);
jScrollPaneHistory.setViewportView(History);
}
}
{
Message = new JTextField();
getContentPane().add(Message);
Message.setBounds(7, 217, 378, 42);
Message.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent evt) {
MessageKeyPressed(evt);
}
});
}
setDefaultCloseOperation(WindowConstants.DISPOSE_O N_CLOSE);
getContentPane().setLayout(null);
this.setTitle("MyRMIChat - " + nickname);
this.setResizable(false);
pack();
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This method is called by the getMessage method which is defined inside the
* Client class. It simply writes a message and its sender to the TextArea field.
* If the nickname is empty, then it means that a new client has joined the chat.
*/
public static void showMessage(String message, String nickname) {
if (!nickname.equals(""))
History.append(nickname + ": " + message + "\n");
else History.append(message + "\n");
}
/**
* This method is called whenever the user presses the enter key. If the text field
* is not empty, then we invoke the remote method broadcastMessage on the remote
* Server object, which broadcasts the entered message to all other clients.
*/
private void MessageKeyPressed(KeyEvent evt) {
if (evt.getKeyCode() == KeyEvent.VK_ENTER && !Message.getText().equals("")) {
try {
server.broadcastMessage(Message.getText(), nickname);
Message.setText("");
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
تست کن ببین مشکت حل میشه؟
موفق باشی
الان موقع کامپایل GUI.java این error رو میده
rmitest5.jpg
شرمنده موقع کپی کردن دستم خورده به space گویا
این فایل رو بگیرید
ممنون
ولی متأسفانه باز هم همون error رو میده
rmitest6.jpg
دوست عزیز فک می کنم شما Client.java رو دو باره کامپایل کردید
باید GUI.java رو کامپایل کنید
البته من یه عذر خواهی بکنم چون پست دوم GUI.java رو کامپایل نکرده بودم (اگر بر اساس اون عمل کردید)
و یک نکته دیگه من تست کردم کد رو اگه 127.0.0.1 رو عوض کنم (GUI.java) اکسپشن شما رو می گیرم
امیدوارم مشکلتون حل بشه
ممنونم
حقیقتش من یه مقدار گیج شدم میشه دقیقا بگید بعد از run شدن سرور باید به ترتیب چه command هایی رو بنویسم
من به این ترتیب میرم
1)javac clientinterface.java
2)javac client.java
3)javac serverinterface.java
4)javac server.java
5)rmic server
6)start rmiregistry
7)java server
بعد یک cmd دیگه باز میکنیم و در cmd جدید این cammandها رو مینویسیم
8)rmic client
9)java GUI
و تمام
آیا این روال درسته؟
ممنون از رهنماییتون
خیلی حساسیت روی ترتیب اینها نیست فقط چند مرحله مهمه حالا شما به این ترتیب برید امیدوارم مشکلتون حل شه
1)javac ClientInterface.java
2)javac Client.java
3)javac ServerInterface.java
4)javac Server.java
5)javac GUI.java
6)rmic Server
7)start rmiregistry
8)java Server
بعد یک cmd دیگه باز کنید
9)java GUI
اینکه دو تا فایله چیز مهمی نیست بخاطر innerclass هست
این قسمت
Message.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent evt) {
MessageKeyPressed(evt);
}
});
}
دقیقا اینجا
new KeyAdapter()
ولی راجب اینکه چرا درست نشده ایده ای ندارم دوتا فایل کامپایل شده میذارم (GUI.class با دو host d یک 127.0.0.1 و دیگری 192.168.20.1) یکی باید اکسپشن بده
فقط ممکنه یکم طول بکشه تا اکسپشن بده!
اگه هر دو اکسپشن داد دقت کنید host رو چی زده (نباید یکی باشه)
واینکه فایل ها رو تو فولدر برنامه کپی کنید و فقط مراحل 7 به بعد رو انجام بدید
ممنون
متأسفانه در هر دو مورد error داد
برای gui1
rmi7.jpg
برای gui2
rmitest8.jpg
اگه اشتباه نکنم 127.0.01 برای GUI عمل نمیکنه
بعد از java GUI یک پنجره باز میشه که در اون هم به جای localhost مینویسم 127.0.01 ولی اون هم تأثیری نداره یعنی از 127.0.01 برای استفاده نمیکنه
عجیبه !
دقیقا ولی چرا؟اگه اشتباه نکنم 127.0.01 برای GUI عمل نمیکنه
اون هیچ تاثیری نداره بخاطر کاریه که من کردم !بعد از java GUI یک پنجره باز میشه که در اون هم به جای localhost مینویسم 127.0.01 ولی اون هم تأثیری نداره
اگه میشه تنظیمات host سیستم عاملتون رو بزاید اینجا یه نگاهی بندازم
x:\windows\system32\drivers\etc\hosts
با text editor بازش کنید محتویاتش رو بزارید اینجا
البته این فایل hidden هست
ممنون موفق باشید
rmilocalhost.jpg
ممنون
localhost که ظاهراً 127.0.01 هست
خیلی دوست دارم بدونم علتش چیه؟!
البته گویا textای که من گذشتم توی comment هست نه؟
بله علامت (#) توی این فایل کامنت هست
شما کامنت 2 خط آخر رو بردارید یه بار دیگه امتحان کنید شاید اتفاقی بیفته (البته من فقط امیدوارم مطمئن نیستم)
آخرین ویرایش به وسیله buggen : دوشنبه 01 اسفند 1390 در 23:00 عصر
PING TO 192.168.251.238!
یک بار و برای همیشه می خواهم چیزهای زیادی ندانم.فرزانگی نیز برای شناخت , محدودیت می آفریند .(پندها وپیکان ها – فردریش نیچه)
باز هم ممنونم
متأسفانه من بعد از تغییر فایل hosts وقتی میخوام save ش کنم این error رو میگیرم
rmitest9.jpg
شما تونستید برنامهرو اجرا کنید؟ میخوام مطمئن بشم که برنامه هیچ مشکلی نداره
باز هم ازتون ممنونم
من به 192.168.251.238 ping کردم و این هم تصویرش هست
ممنونم اگر راهنمائی کنید
rmitest91.jpg
یک بار text editor رو با run as administrator باز کنید (اگه این کار رو نکردید)
اگه نشد روش زیر رو چک کنید
c:
cd \windows\system32\drivers\etc
attrib -r hosts
notepad hosts
attrib +r hosts
من تست کردم مشکلی نداشت (windows و linux) ولی با یه user حالا با چند تا یوزر تست می کنم تا خیالتون راحت بشهشما تونستید برنامهرو اجرا کنید؟ میخوام مطمئن بشم که برنامه هیچ مشکلی نداره
باز هم ازتون ممنونم
آخرین ویرایش به وسیله buggen : یک شنبه 07 اسفند 1390 در 02:57 صبح
rmic client لازم نیست انجام بشه
راجب اپن روش هم موقع past من اشتباه کرده بودم پست رو ویرایش کردم یه بار دیگه تست کنید (نقل قول رو هم اگه ویرایش کنید ممنون میشم)
یه خواهشی هم دارم از شما که id من رو add کنید تا توی چت بهتون کمک کنم چون کارمون داره تست های صحیح و خطا میشه
چون رو سیستم من این مشکل نیست نمی تونم راه قطعی برای حلش بگم شاید توی چت بتونیم مشکلو حل کنیم
موفق باشید
سلام
چطور run شد رو یه سیستم دیگه ؟ اگر نه چه طور حل کردید ؟
توی فایل یا دیتابیس مثلا ؟حالا فقط میخوام تمام messageها ذخیره بشند بنظرتون بهترین روش برای این کار چی هست؟
من هم زیاد کار نکردم بیشتر J2EE کار کردم ولی اگه بتونم کمکتون میکنملبته باید بگم که من در جاوا در این زمینه قبلا کار نکردم
من فقط دستور rmic client رو حذف کردم یعنی اول زدم rmiregistry بعد در یک cmd دیگه زدم java server و در یک cmd دیگه دستور java GUI رو نوشتم حالا نمیدونم دقیقا علتش این بود یا نه
در خصوص ذخیره messageها اگه توی یک فایل هم ذخیره شه کافیه
فقط این برنامه برای ذخیرهٔ موقت messageها از یک متغیر به نام History استفاده کرده که از نوع JTextArea هست که فکر میکنم باید محتویات این متغیر رو در یک فایل text ذخیره کرد
اما من در مورد نوع این متغیر (JTextArea ) و اینکه چه جوری میشه توی جاوا یک فایل text ساخت و توی اون نوشت و یا از اون خوند نمیدونم
ممنون میشم اگه در این مورد هم راهنمائی کنید
با تشکر
خوب من فایل Server.java رو تغییر دادم ویه متود برای history گذاشتم توی تست من که مشکلی نداشت
حالا خودتون هم تست کنید
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
/**
* This class implements the interface ServerInterface and extends the class
* UnicastRemoteObject. Its constructor and member functions login and
* broadcast can be accessed remotely.
* @autor Matthias Braunhofer
*/
public class Server extends UnicastRemoteObject implements ServerInterface {
/**
* This ArrayList stores a remote reference for each currently logged in client as
* well as its nickname and is used for broadcasting a message, when a client
* invokes the remotely accessible method login.
*/
protected ArrayList<ClientInterface> clients = new ArrayList<ClientInterface>();
/**
* This constructor is used for creating a remote object of type Server. It
* throws a RemoteException if the object handle cannot be constructed.
*/
public Server() throws RemoteException {
}
/**
* Implementation of the remotely invocable method. If a client invokes this
* method then all other currently logged in clients get a notification
* that a new user has joined the chat. This is done by a remote call of the
* method getMessage which is defined for the Client object. A remote reference
* to the new client is added to the ArrayList.
*/
public void login(ClientInterface client, String nickname) throws RemoteException {
broadcastMessage("--> " + nickname + " is entering the chatroom", "");
clients.add(client);
}
/**
* This method is a remote method which is used for broadcasting an incoming message
* and the nickname of its sender to all currently logged in clients. This
* broadcasting is done by a remote call of the method getMessage which is
* defined for a client object. The references to such clients are obtained from
* the ArrayList which stores a remote reference to each currently logged in client.
*/
public void broadcastMessage(String message, String nickname) throws RemoteException {
for (int i = 0; i < clients.size(); i++) {
ClientInterface c = clients.get(i);
try {
writeHistory(message, nickname);
c.getMessage(message, nickname);
} catch (RemoteException e) {
/**
* If a client is not accessible, then it is removed from
* the ArrayList and the index i is decremented because
* all other clients go down one place
*/
logout(c);
i = i - 1;
}
}
}
/**
* This method is a local method which is used for removing a connection
* from the ArrayList of all connections.
*/
public void logout(ClientInterface client) {
clients.remove(client);
}
/**
* This main method registers a remote accessible Server object by invoking the
* rebind method on the class Naming. The name of this object is "Server". This
* means that all clients which want to get a reference to this object have to
* specify this name in the lookup method.
*/
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.getRegistry("127.0.0.1");
registry.rebind("Server", new Server());
System.out.println("Server is ready");
} catch (Exception e) {
e.printStackTrace();
}
}
private void writeHistory(String message, String nickname) {
FileWriter writer = null;
try {
writer = new FileWriter("history.txt",true);
writer.write( nickname+" : " +message+"\n");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}