943,962 Members | Top Members by Rank

Ad:
  • Java Discussion Thread
  • Unsolved
  • Views: 2479
  • Java RSS
Nov 26th, 2005
0

Sockets problem

Expand Post »
Hi Everyone,

I'm trying to create an instant messaging program, but for some reason the client and server won't connect. My code is below. Thanks in advanced for helping me.

By the way, the client and server program are one in the same. A radio button gives you the option of which to use.

Java Syntax (Toggle Plain Text)
  1. import javax.swing.*;
  2. import javax.swing.event.*;
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. import java.net.*;
  6. import java.io.*;
  7. import java.lang.*;
  8.  
  9. /*
  10.  * CIM.java
  11.  *
  12.  */
  13.  
  14. /**
  15.  *
  16.  * @author CRD
  17.  */
  18. public class CIM extends JFrame {
  19.  
  20. public boolean server = false;
  21. public String name = "Anonymous";
  22. public String ipAd = "localhost";
  23. public String msgs = "";
  24. ObjectOutputStream out;
  25. ObjectInputStream in;
  26. Socket skt;
  27. ServerSocket srvr;
  28. public int serverCounter = 1;
  29.  
  30. /** Creates new form CIM */
  31. public CIM() {
  32. initComponents();
  33. buttonGroup1.add(jRadioButton1);
  34. buttonGroup1.add(jRadioButton2);
  35. }
  36.  
  37. public void runServer()
  38. {
  39.  
  40. try
  41. {
  42.  
  43. connection.setBackground(new java.awt.Color(255, 51, 51));
  44. srvr = new ServerSocket(12345, 50000);
  45. while(true)
  46. {
  47. try
  48. {
  49. waitForServerConnection();
  50. getServerStreams();
  51. processServerConnection();
  52. }
  53. catch(Exception ex2)
  54. {
  55. allMsgs_txtarea.setText("Error Connecting: Please Try Again.");
  56. }
  57. finally
  58. {
  59. closeServerConnection();
  60.  
  61. }
  62. }
  63. }
  64. catch(Exception ioex)
  65. {
  66. allMsgs_txtarea.setText("Error Connecting: Please Try Again.");
  67. }
  68. }
  69.  
  70. public void waitForServerConnection() throws Exception
  71. {
  72. skt = srvr.accept();
  73. displayMessage( "Connection recieved from: "+skt.getInetAddress().getHostName() );
  74. }
  75.  
  76. public void getServerStreams() throws Exception
  77. {
  78. connection.setBackground(new java.awt.Color(255, 255, 51));
  79. out = new ObjectOutputStream( skt.getOutputStream() );
  80. out.flush();
  81.  
  82. in = new ObjectInputStream(skt.getInputStream());
  83.  
  84. }
  85.  
  86. private void processServerConnection() throws IOException
  87. {
  88. String message = "Connection Successful";
  89. sendData(message);
  90. connection.setBackground(new java.awt.Color(51,255,51));
  91. do
  92. {
  93. try
  94. {
  95. message = (String) in.readObject();
  96. displayMessage("\n" + message);
  97. }
  98. catch(Exception e)
  99. {
  100. displayMessage("\n" + "error...");
  101. }
  102. }
  103. while (!message.equals("CLIENT>>> TERMINATE"));
  104. }
  105.  
  106. private void closeServerConnection()
  107. {
  108. displayMessage("\nTerminating connection\n");
  109. connection.setBackground(new java.awt.Color(255, 51, 51));
  110. try
  111. {
  112. out.close();
  113. in.close();
  114. skt.close();
  115. }
  116. catch(Exception ee)
  117. {
  118.  
  119. }
  120. }
  121.  
  122. public void sendData(String message)
  123. {
  124. try
  125. {
  126. if(server)
  127. {
  128. out.writeObject("SERVER>>> "+message);
  129. }
  130. else if (!server)
  131. {
  132. out.writeObject("CLIENT>>> "+message);
  133. }
  134. out.flush();
  135. displayMessage("\n"+name+">>> "+message);
  136. }
  137. catch(Exception se)
  138. {
  139.  
  140. }
  141. }
  142.  
  143. public void displayMessage (final String messageToDisplay)
  144. {
  145. SwingUtilities.invokeLater(
  146. new Runnable() {
  147. public void run()
  148. {
  149. allMsgs_txtarea.append(messageToDisplay);
  150. allMsgs_txtarea.setCaretPosition(allMsgs_txtarea.getText().length());
  151. }
  152. }
  153. );
  154. }
  155.  
  156. public void runClient()
  157. {
  158. try
  159. {
  160. connection.setBackground(new java.awt.Color(255, 51, 51));
  161. connectToServer();
  162. getClientStreams();
  163. processClientConnection();
  164. }
  165. catch(Exception CE)
  166. {
  167.  
  168. }
  169. finally
  170. {
  171. closeClientConnection();
  172. }
  173. }
  174.  
  175. public void connectToServer() throws IOException
  176. {
  177. skt = new Socket(ipAd,12345);
  178. }
  179.  
  180. private void getClientStreams() throws IOException
  181. {
  182. out = new ObjectOutputStream(skt.getOutputStream());
  183. out.flush();
  184. in = new ObjectInputStream(skt.getInputStream());
  185. connection.setBackground(new java.awt.Color(255, 255, 51));
  186. }
  187.  
  188. public void processClientConnection() throws IOException
  189. {
  190. String message = "";
  191. connection.setBackground(new java.awt.Color(51,255,51));
  192. do
  193. {
  194. try
  195. {
  196. message = (String) in.readObject();
  197. displayMessage("\n"+message);
  198. }
  199. catch(Exception cnfe)
  200. {
  201. displayMessage("\nERROR.");
  202. }
  203. }
  204. while(!message.equals("SERVER>>> TERMINATE"));
  205. }
  206.  
  207. private void closeClientConnection()
  208. {
  209. displayMessage("\nTerminating connection\n");
  210. connection.setBackground(new java.awt.Color(255, 51, 51));
  211. try
  212. {
  213. out.close();
  214. in.close();
  215. skt.close();
  216. }
  217. catch(Exception ee)
  218. {
  219.  
  220. }
  221. }
  222.  
  223. public void decide()
  224. {
  225. if(server)
  226. {
  227. runServer();
  228. }
  229. else if (!server)
  230. {
  231. runClient();
  232. }
  233. }
  234.  
  235.  
  236. /** This method is called from within the constructor to
  237.   * initialize the form.
  238.   * WARNING: Do NOT modify this code. The content of this method is
  239.   * always regenerated by the Form Editor.
  240.   */
  241. // <editor-fold defaultstate="collapsed" desc=" Generated Code ">
  242. private void initComponents() {
  243. panel4 = new java.awt.Panel();
  244. buttonGroup1 = new javax.swing.ButtonGroup();
  245. panel1 = new java.awt.Panel();
  246. panel7 = new java.awt.Panel();
  247. label3 = new java.awt.Label();
  248. panel8 = new java.awt.Panel();
  249. panel9 = new java.awt.Panel();
  250. label7 = new java.awt.Label();
  251. connection = new java.awt.Panel();
  252. jPanel1 = new javax.swing.JPanel();
  253. label4 = new java.awt.Label();
  254. name_field = new java.awt.TextField();
  255. button1 = new java.awt.Button();
  256. panel10 = new java.awt.Panel();
  257. label5 = new java.awt.Label();
  258. panel11 = new java.awt.Panel();
  259. panel12 = new java.awt.Panel();
  260. jRadioButton1 = new javax.swing.JRadioButton();
  261. jRadioButton2 = new javax.swing.JRadioButton();
  262. panel13 = new java.awt.Panel();
  263. label6 = new java.awt.Label();
  264. panel14 = new java.awt.Panel();
  265. ip = new java.awt.TextField();
  266. panel2 = new java.awt.Panel();
  267. panel3 = new java.awt.Panel();
  268. label1 = new java.awt.Label();
  269. allMsgs_txtarea = new java.awt.TextArea();
  270. panel5 = new java.awt.Panel();
  271. label2 = new java.awt.Label();
  272. panel6 = new java.awt.Panel();
  273. send_btn = new java.awt.Button();
  274. msg_txtarea = new java.awt.TextArea();
  275.  
  276. getContentPane().setLayout(new java.awt.GridLayout(1, 2));
  277.  
  278. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  279. setBackground(new java.awt.Color(204, 204, 204));
  280. setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
  281. setFont(new java.awt.Font("Times New Roman", 0, 10));
  282. panel1.setLayout(new java.awt.GridLayout(2, 1));
  283.  
  284. panel1.setBackground(new java.awt.Color(255, 255, 204));
  285. panel7.setLayout(new java.awt.BorderLayout());
  286.  
  287. panel7.setBackground(new java.awt.Color(226, 222, 222));
  288. label3.setBackground(new java.awt.Color(102, 102, 255));
  289. label3.setFont(new java.awt.Font("Dialog", 1, 12));
  290. label3.setText("Simple Settings:");
  291. panel7.add(label3, java.awt.BorderLayout.NORTH);
  292.  
  293. panel8.setLayout(new java.awt.GridLayout(2, 1));
  294.  
  295. panel8.setBackground(new java.awt.Color(255, 255, 255));
  296. panel9.setLayout(new java.awt.BorderLayout());
  297.  
  298. label7.setBackground(new java.awt.Color(153, 153, 255));
  299. label7.setText("Connection Status:");
  300. panel9.add(label7, java.awt.BorderLayout.NORTH);
  301.  
  302. connection.setBackground(new java.awt.Color(255, 51, 51));
  303. panel9.add(connection, java.awt.BorderLayout.CENTER);
  304.  
  305. panel8.add(panel9);
  306.  
  307. jPanel1.setBackground(new java.awt.Color(204, 204, 255));
  308. label4.setAlignment(java.awt.Label.CENTER);
  309. label4.setText("Name:");
  310. jPanel1.add(label4);
  311.  
  312. name_field.setText("Anonymous");
  313. name_field.addActionListener(new java.awt.event.ActionListener() {
  314. public void actionPerformed(java.awt.event.ActionEvent evt) {
  315. name_fieldActionPerformed(evt);
  316. }
  317. });
  318.  
  319. jPanel1.add(name_field);
  320.  
  321. button1.setLabel("Start/Reset Connection");
  322. button1.addActionListener(new java.awt.event.ActionListener() {
  323. public void actionPerformed(java.awt.event.ActionEvent evt) {
  324. button1ActionPerformed(evt);
  325. }
  326. });
  327.  
  328. jPanel1.add(button1);
  329.  
  330. panel8.add(jPanel1);
  331.  
  332. panel7.add(panel8, java.awt.BorderLayout.CENTER);
  333.  
  334. panel1.add(panel7);
  335.  
  336. panel10.setLayout(new java.awt.BorderLayout());
  337.  
  338. panel10.setBackground(new java.awt.Color(226, 222, 222));
  339. label5.setBackground(new java.awt.Color(102, 102, 255));
  340. label5.setFont(new java.awt.Font("Dialog", 1, 12));
  341. label5.setText("Advanced Settings");
  342. panel10.add(label5, java.awt.BorderLayout.NORTH);
  343.  
  344. panel11.setLayout(new java.awt.GridLayout(2, 1));
  345.  
  346. panel11.setBackground(new java.awt.Color(255, 255, 255));
  347. panel12.setBackground(new java.awt.Color(204, 204, 255));
  348. jRadioButton1.setBackground(new java.awt.Color(204, 204, 255));
  349. buttonGroup1.add(jRadioButton1);
  350. jRadioButton1.setSelected(true);
  351. jRadioButton1.setText("Host (Server) ");
  352. jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
  353. public void actionPerformed(java.awt.event.ActionEvent evt) {
  354. jRadioButton1ActionPerformed(evt);
  355. }
  356. });
  357.  
  358. panel12.add(jRadioButton1);
  359.  
  360. jRadioButton2.setBackground(new java.awt.Color(204, 204, 255));
  361. buttonGroup1.add(jRadioButton2);
  362. jRadioButton2.setText("User (Client) ");
  363. jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
  364. public void actionPerformed(java.awt.event.ActionEvent evt) {
  365. jRadioButton2ActionPerformed(evt);
  366. }
  367. });
  368.  
  369. panel12.add(jRadioButton2);
  370.  
  371. panel11.add(panel12);
  372.  
  373. panel13.setLayout(new java.awt.BorderLayout());
  374.  
  375. label6.setBackground(new java.awt.Color(153, 153, 255));
  376. label6.setText("IP:");
  377. panel13.add(label6, java.awt.BorderLayout.NORTH);
  378.  
  379. panel14.setBackground(new java.awt.Color(204, 204, 255));
  380. ip.setEditable(false);
  381. ip.setText("localhost");
  382. ip.addActionListener(new java.awt.event.ActionListener() {
  383. public void actionPerformed(java.awt.event.ActionEvent evt) {
  384. ipActionPerformed(evt);
  385. }
  386. });
  387.  
  388. panel14.add(ip);
  389.  
  390. panel13.add(panel14, java.awt.BorderLayout.CENTER);
  391.  
  392. panel11.add(panel13);
  393.  
  394. panel10.add(panel11, java.awt.BorderLayout.CENTER);
  395.  
  396. panel1.add(panel10);
  397.  
  398. getContentPane().add(panel1);
  399.  
  400. panel2.setLayout(new java.awt.GridLayout(2, 1));
  401.  
  402. panel2.setBackground(new java.awt.Color(217, 212, 212));
  403. panel3.setLayout(new java.awt.BorderLayout());
  404.  
  405. panel3.setBackground(new java.awt.Color(204, 204, 204));
  406. label1.setFont(new java.awt.Font("Dialog", 1, 12));
  407. label1.setText("Incoming/Outgoing Messages:");
  408. panel3.add(label1, java.awt.BorderLayout.NORTH);
  409.  
  410. allMsgs_txtarea.setEditable(false);
  411. panel3.add(allMsgs_txtarea, java.awt.BorderLayout.CENTER);
  412.  
  413. panel2.add(panel3);
  414.  
  415. panel5.setLayout(new java.awt.BorderLayout());
  416.  
  417. panel5.setBackground(new java.awt.Color(204, 204, 204));
  418. label2.setFont(new java.awt.Font("Dialog", 1, 12));
  419. label2.setText("Your Outgoing Messages:");
  420. panel5.add(label2, java.awt.BorderLayout.NORTH);
  421.  
  422. panel6.setLayout(new java.awt.BorderLayout());
  423.  
  424. send_btn.setBackground(new java.awt.Color(102, 102, 102));
  425. send_btn.setForeground(new java.awt.Color(255, 255, 255));
  426. send_btn.setLabel("Send");
  427. send_btn.addActionListener(new java.awt.event.ActionListener() {
  428. public void actionPerformed(java.awt.event.ActionEvent evt) {
  429. send_btnActionPerformed(evt);
  430. }
  431. });
  432.  
  433. panel6.add(send_btn, java.awt.BorderLayout.SOUTH);
  434.  
  435. panel6.add(msg_txtarea, java.awt.BorderLayout.CENTER);
  436.  
  437. panel5.add(panel6, java.awt.BorderLayout.CENTER);
  438.  
  439. panel2.add(panel5);
  440.  
  441. getContentPane().add(panel2);
  442.  
  443. pack();
  444. }
  445. // </editor-fold>
  446.  
  447. private void button1ActionPerformed(java.awt.event.ActionEvent evt) {
  448. // TODO add your handling code here:
  449. decide();
  450. }
  451.  
  452. private void send_btnActionPerformed(java.awt.event.ActionEvent evt) {
  453. // TODO add your handling code here:
  454. sendData( msg_txtarea.getText() );
  455. msg_txtarea.setText("");
  456. }
  457.  
  458. private void ipActionPerformed(java.awt.event.ActionEvent evt) {
  459. // TODO add your handling code here:
  460. ipAd = ip.getText();
  461. }
  462.  
  463. private void name_fieldActionPerformed(java.awt.event.ActionEvent evt) {
  464. // TODO add your handling code here:
  465. name = name_field.getText();
  466. }
  467.  
  468. private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {
  469. // TODO add your handling code here:
  470. server = false;
  471. ip.setEditable(true);
  472. }
  473.  
  474. private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {
  475. // TODO add your handling code here:
  476. server = true;
  477. ip.setEditable(false);
  478. }
  479.  
  480. /**
  481.   * @param args the command line arguments
  482.   */
  483. public static void main(String args[]) {
  484. java.awt.EventQueue.invokeLater(new Runnable() {
  485. public void run() {
  486. CIM cim = new CIM();
  487. cim.setVisible(true);
  488. cim.setTitle("CIM - Cinnamon Instant Messaging");
  489. }
  490. });
  491. }
  492.  
  493. // Variables declaration - do not modify
  494. private java.awt.TextArea allMsgs_txtarea;
  495. private java.awt.Button button1;
  496. private javax.swing.ButtonGroup buttonGroup1;
  497. private java.awt.Panel connection;
  498. private java.awt.TextField ip;
  499. private javax.swing.JPanel jPanel1;
  500. private javax.swing.JRadioButton jRadioButton1;
  501. private javax.swing.JRadioButton jRadioButton2;
  502. private java.awt.Label label1;
  503. private java.awt.Label label2;
  504. private java.awt.Label label3;
  505. private java.awt.Label label4;
  506. private java.awt.Label label5;
  507. private java.awt.Label label6;
  508. private java.awt.Label label7;
  509. private java.awt.TextArea msg_txtarea;
  510. private java.awt.TextField name_field;
  511. private java.awt.Panel panel1;
  512. private java.awt.Panel panel10;
  513. private java.awt.Panel panel11;
  514. private java.awt.Panel panel12;
  515. private java.awt.Panel panel13;
  516. private java.awt.Panel panel14;
  517. private java.awt.Panel panel2;
  518. private java.awt.Panel panel3;
  519. private java.awt.Panel panel4;
  520. private java.awt.Panel panel5;
  521. private java.awt.Panel panel6;
  522. private java.awt.Panel panel7;
  523. private java.awt.Panel panel8;
  524. private java.awt.Panel panel9;
  525. private java.awt.Button send_btn;
  526. // End of variables declaration
  527.  
  528. }
Reputation Points: 12
Solved Threads: 2
Posting Whiz
Ghost is offline Offline
352 posts
since Aug 2004
Dec 3rd, 2005
0

Re: Sockets problem

Can someone PLEASE help?

Thanks.
Reputation Points: 12
Solved Threads: 2
Posting Whiz
Ghost is offline Offline
352 posts
since Aug 2004
Dec 4th, 2005
0

Re: Sockets problem

Ghost,

First a rant, then I will help you and then maybe some more ranting.

You have not been forthcoming with the details of your problem and the things you have tried to solve it thus far. Yet very forthcoming with a large amount of code. This makes it hard for us to help you. I am experienced with using sockets but the approach of your question doesn't inspire me to trawl through your code looking for the problem when you haven't shown much effort in aiding us to assist you. “for some reason the client and server won't connect� is not very helpful! Remember you are the one who needs our help. It is your problem not ours! So show a bit more effort when asking for help, to do otherwise is disrespectful of our time. This, I suspect, is why nobody has responded. Read the below article and you will find this situation is fully explained.

http://www.catb.org/~esr/faqs/smart-questions.html

Having said that, I did say I was going to help you. So ....

Change the declaration of the boolean variable 'server' from:

Java Syntax (Toggle Plain Text)
  1. public boolean server = false;
to

Java Syntax (Toggle Plain Text)
  1. public boolean server = true;

As you can see below, the sockets now establish a connection.
Java Syntax (Toggle Plain Text)
  1. Proto Local Address Foreign Address State
  2. TCP 0.0.0.0:12345 0.0.0.0:0 LISTENING
  3. TCP 127.0.0.1:4185 127.0.0.1:12345 ESTABLISHED
  4. TCP 127.0.0.1:12345 127.0.0.1:4185 ESTABLISHED
OK, but now tell me WHY that worked! I will give you a clue, the problem is not even socket related, it is a logic flaw.

Your code could really do with just a few system.out.println's .... that is all it took to locate this problem!!!

Again, show a bit more effort in your requests for help or you will not receive assistance like this from me again. Besides when you see how simple this problem is I am sure (again with just a little effort) you could have found this for yourself.

Have Fun,

Kate
Reputation Points: 10
Solved Threads: 1
Junior Poster in Training
Kate Albany is offline Offline
71 posts
since Jun 2005
Dec 4th, 2005
0

Re: Sockets problem

Sorry I didn't specify the question and thank you very much for helping me.

The reason it didn't work is because the default value says the server is selected, but my server variable says otherwise.

Thanks again for your help.
Reputation Points: 12
Solved Threads: 2
Posting Whiz
Ghost is offline Offline
352 posts
since Aug 2004
Dec 4th, 2005
0

Re: Sockets problem

Hi,

It seems like it still doesn't work. All the buttons somehow become disabled after I click connect and they both connect.

Any suggestions? Thanks.
Reputation Points: 12
Solved Threads: 2
Posting Whiz
Ghost is offline Offline
352 posts
since Aug 2004
Dec 5th, 2005
0

Re: Sockets problem

Quote originally posted by Ghost ...
All the buttons somehow become disabled after I click connect and they both connect.
I know, I saw this problem myself. But it wasn't what you were asking for help with so I didn't address it, besides I wanted to see how far you could get with this by yourself. If you analyze the problem you will see that the whole interface becomes unresponsive, not just the buttons. Your whole application freezes.

Did you read that article, I suspected not. You have not said anything about what you have tried yourself to locate this problem. Just another 'somehow' something doesn't work statement. Have you put system.out.println's throughout your code to locate the problem?

You probably think I am being hard on you, but I am trying to get you to rely on your own abilities first before calling for help at the first problem. You will find it more satisfying if you locate and resolve the problems for yourself and you will become a more proficient programmer at the same time. If you cannot resolve a particular problem, then fine, post details about the problem and what you have achieved thus far.

Quote originally posted by Ghost ...
Any suggestions?
Admittedly, this one could be a little tricky to the newcomer and easily overlooked. So research the concept of 'blocking' in the InputStream and it's subclasses. 'blocking' is the cause of this.

If you put println's at the beginning and end of each function you will be able to see which function never returns. Then you can use more println's to further narrow down the 'problem' line of code. If you can tell me the line of the code which freezes the application, I will tell you why (if it doesn't become instantly clear).

Kate
Reputation Points: 10
Solved Threads: 1
Junior Poster in Training
Kate Albany is offline Offline
71 posts
since Jun 2005
Dec 5th, 2005
0

Re: Sockets problem

Quote originally posted by Ghost ...
Hi,

It seems like it still doesn't work. All the buttons somehow become disabled after I click connect and they both connect.
that should tell you a lot of what's happening.
Ever heard of multithreading? You're going to need it if you don't want your application to just block waiting for network traffic to process (which will never arrive because your application on the other end is also blocking while waiting for input).

Combine that with Kate's excellent advise and you should be on your way to the nearest O'Reilly book dealer to get yourself their excellent Java Threads and Java Network Programming books in the latest editions
Team Colleague
Reputation Points: 1658
Solved Threads: 331
duckman
jwenting is offline Offline
7,719 posts
since Nov 2004
Dec 10th, 2005
0

Re: Sockets problem

Hi Guys,

Sorry I haven't gotten back to you sooner. OK - I used the println function to narrow down the problem. It seems like in the process client/server connections the program freezes. The program never enters the do-while loop.

If I understand JWenting correctly, he is saying that the program is trying to send and recieve messages at the same time, so I need to use threads.

Thanks again for all your help.
Reputation Points: 12
Solved Threads: 2
Posting Whiz
Ghost is offline Offline
352 posts
since Aug 2004
Dec 23rd, 2005
0

Re: Sockets problem

Am I doing something wrong or have you guys just not seen this thread?
Reputation Points: 12
Solved Threads: 2
Posting Whiz
Ghost is offline Offline
352 posts
since Aug 2004
Dec 23rd, 2005
0

Re: Sockets problem

Your program is not responding because it's locked in a loop waiting for something to happen.
On the other side the exact same thing is happening, preventing that instance from sending a response.

Read up on network programming and multithreading.
Team Colleague
Reputation Points: 1658
Solved Threads: 331
duckman
jwenting is offline Offline
7,719 posts
since Nov 2004

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
Message:
Previous Thread in Java Forum Timeline: Random backgrounds
Next Thread in Java Forum Timeline: Request.getParameter()





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC