Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Problem with chat application

843805Oct 24 2006 — edited Oct 24 2006
Hello back again. I rewrote the code from the beginning. The scroll thing works properly but I have another problem now. Try to execute the code twice, set the server up and running and connect from the client. I get errors and I can't seem to find out why. Here is the new code
I think something is going wrong with the buildTextFieldPanel() method. Perhaps not sure.

Thanks a lot, any help is appreciated.
 
/*
 * Wahiki Chat version 0.1 by Dimitris Papastamos
 *
 *
*/


import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
import java.io.*;

public class WahikiGUI extends JFrame {
	protected JTextArea textArea;
	protected JTextField textField;
	protected ImageIcon image = new ImageIcon("wahiki.gif");
	protected JMenuBar wahikiMenuBar;
	protected Thread startServ;
	protected boolean isConnected = false;
	protected boolean ServerOn = false;
	
	/* class instances */
	protected startServer listen = new startServer();
	protected ServerHandler handler;
	protected ConnectClient connectCl;
	protected SendData Send;
	protected GetData get;
	
	public WahikiGUI() {
		super("Wahiki Chat version 0.1 ALPHA");
		buildGUI();
	}

	public void buildGUI() {
		JPanel mainPanel = (JPanel) getContentPane();
		mainPanel.setLayout(new BorderLayout());
		JPanel centerPanel = buildCenterPanel();
		mainPanel.add(centerPanel, BorderLayout.CENTER);
		JPanel textFieldPanel = buildTextFieldPanel();
		mainPanel.add(textFieldPanel, BorderLayout.SOUTH);
		addMenu();
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
		setIconImage(image.getImage());
	}

	protected JPanel buildTextFieldPanel() {
		JPanel retPanel = new JPanel();
		textField = new JTextField(50);
		
		textField.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JTextField source = (JTextField)e.getSource();
				if(ServerOn) {
					textArea.append("Server says ->" + source.getText());
				} else if (isConnected) {
					textArea.append("Client says -> " + source.getText()
								+ "\n");
				}
				if(isConnected) {
					get = new GetData();
					get.start();
					Send.send("Client says -> " + source.getText()
							+ "\n");
				} else if(ServerOn) {
					Send.send("Server says -> " + source.getText()
							+ "\n");
				} else {
					textArea.append("Not connected" + "\n");
				}
				textField.setText("");	
			}
		});
		retPanel.add(textField);
		
		return retPanel;
	}

	protected JPanel buildCenterPanel() {
		JPanel retPanel = new JPanel();
		textArea = new JTextArea(20,50);
		textArea.setWrapStyleWord(true);
		textArea.setLineWrap(true);
		textArea.setEditable(false);
		textArea.setFont(new Font("Comic Sans MS", Font.BOLD, 14));
		textArea.setBackground(new Color(16777171));
		JScrollPane jsp = new JScrollPane(textArea);
		retPanel.add(jsp);
		
		return retPanel;
	}

	protected void addMenu() {
		wahikiMenuBar = new JMenuBar();
		JMenu Client = new JMenu("Client");
		Client.setMnemonic(KeyEvent.VK_C);
		final JMenuItem Connect = new JMenuItem("Connect");
		Connect.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
				Event.CTRL_MASK));
		final JMenuItem Disconnect = new JMenuItem("Disconnect");
		Disconnect.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,
				Event.CTRL_MASK));
		Client.add(Connect);
		Client.add(Disconnect);
		
		Disconnect.setEnabled(false);
		
		
		Connect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					connectCl = new ConnectClient();
					connectCl.start();
					if(isConnected) { 
						Disconnect.setEnabled(true);
						Connect.setEnabled(false);
					} else {
						Disconnect.setEnabled(false);
						Connect.setEnabled(true);
					}
			}
		});
		
		Disconnect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
			}
		});
		
		
		JMenu Server = new JMenu("Server");
		Client.setMnemonic(KeyEvent.VK_S);
		final JMenuItem Start = new JMenuItem("Start");
		Start.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
				Event.CTRL_MASK));
		final JMenuItem Terminate = new JMenuItem("Terminate");
		Terminate.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,
				Event.CTRL_MASK));
		Server.add(Start);
		Server.add(Terminate);
		
		Terminate.setEnabled(false);
		
		Start.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					startServ = new Thread(listen);
					startServ.start();
					textArea.append("Server listening on port 3333" + "\n");
					Start.setEnabled(false);
					Terminate.setEnabled(true);
			}
		});
		
		Terminate.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					listen.serverSocket.close();
					Start.setEnabled(true);
					Terminate.setEnabled(false);
					ServerOn = false;
					textArea.append("Server terminated successfully");
				} catch(IOException ioe) {
					JOptionPane.showMessageDialog(null, "Error occured",
							"Error", JOptionPane.INFORMATION_MESSAGE);
				}
				
				Start.setEnabled(true);
				Terminate.setEnabled(false);
			}
		});
		
		wahikiMenuBar.add(Client);
		wahikiMenuBar.add(Server);
		add(wahikiMenuBar, BorderLayout.NORTH);
	}
	
	public static void main (String[] args) {
		new WahikiGUI();
	}

	class startServer implements Runnable  {
		
		int FINAL_PORT = 3333;
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		public void run() {
			boolean flag = false;
			try {
				serverSocket = new ServerSocket(FINAL_PORT);
				flag = true;
				while (true) {
					socket = serverSocket.accept();
					handler = new ServerHandler(socket);
					ServerOn = true;
					handler.start();
				}
			} catch (IOException e) {
			if (!flag) {
					JOptionPane.showMessageDialog(null, "Error occured",
							"Error", JOptionPane.INFORMATION_MESSAGE);
				}
			} finally {
				try {
					serverSocket.close();
				} catch (IOException e) {
					JOptionPane.showMessageDialog(null, "Error occured",
							"Error", JOptionPane.INFORMATION_MESSAGE);
				}
			}
		}
	}

    class ServerHandler extends Thread {
    	Vector handlers = new Vector(10);
		Vector connectedHandlers = new Vector(10);
		private Socket socket;
		private BufferedReader in;
		public PrintWriter out;
		
		ServerHandler(Socket socket) throws IOException {
			this.socket = socket;
			in = new BufferedReader(new InputStreamReader(socket.getInputStream(),
					"8859_1"));
			OutputStream outStream = socket.getOutputStream();
			out = new PrintWriter(new OutputStreamWriter(outStream, "8859_1"), true);
		}
	
		public String readFromClient() throws IOException {
			String message = "";
			int ch;
			while ((ch = in.read()) != '\n') {
				message += (char) ch;
			}
			return message;
		}
	
		public void run() {
			synchronized (handlers) {
				handlers.addElement(this);
			}

			boolean flag = false;
			try {
				textArea.append("Client Connected" + "\n");
				while (!false) {
					String message = readFromClient();
					textArea.append(message + "\n");
				}

			} catch (IOException e) {
				flag = true;
				JOptionPane.showMessageDialog(null, "Server terminated.", "Error",
						JOptionPane.INFORMATION_MESSAGE);
			}
		}
	}

	class ConnectClient extends Thread {
		Socket clientSock;

		public void run() {
			try {
				clientSock = new Socket("localhost", 3333);
				isConnected = true;
				textArea.append("Connected to server" + "\n");
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null,
						"Cannot establish connection to server.", "Error",
						JOptionPane.INFORMATION_MESSAGE);
			    isConnected = false;
			}
		}	
	}	
	
	class SendData {
		void send(String text) {
			try {
				if (!ServerOn) {
					DataOutputStream os = new DataOutputStream(
							connectCl.clientSock.getOutputStream());
					os.writeBytes(text);
					os.flush();
				} else {
					handler.out.print(text);
					handler.out.flush();
				}
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null, "Connection reset by peer.",
					"Error", JOptionPane.INFORMATION_MESSAGE);
			}
		}
	}

	class GetData extends Thread {
		private BufferedReader is;

		public void run() {
			try {
				boolean flag = false;
					is = new BufferedReader(new InputStreamReader(
						connectCl.clientSock.getInputStream(), "8859_1"));
				while (!flag) {
					String reply;
					while ((reply = is.readLine()) != null) {
						textArea.append(reply + "\n");
					}
				}
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null, "No data from server.",
						"Error", JOptionPane.INFORMATION_MESSAGE);
			}
		}
	}
}
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Nov 21 2006
Added on Oct 24 2006
2 comments
118 views