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);
}
}
}
}