Chat client and server, save and delete messages - Programmers Heaven

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

Chat client and server, save and delete messages

pjpropjpro Posts: 1Member
I have tried to make a chat application that only saves the recieved messages which can then be deleted. I'm having some major problems with it.

Can anyone please point out or correct my coding. I have tried for ages to get this working but with no joy.

Client Code
[code]import java.awt.*;
import java.awt.event.*;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

import javax.swing.*;
import javax.swing.event.*;

public class Client extends JPanel
implements ListSelectionListener {
private JList save;
private DefaultListModel saveList;

private static final String sendString = "Send";
private static final String deleteString = "Delete";
private JButton deleteBtn;
private JTextField enterMsg;
private static InetAddress host;
ObjectOutputStream output;
ObjectInputStream input;
String message = "";


public Client() {
super(new BorderLayout());

saveList = new DefaultListModel();
saveList.addElement("Hi How are you?");
saveList.addElement("I'm ok. How are the kids?");
saveList.addElement("Thats good to hear. I will have to give you a call for a meeting soon.");

//Create the list and put it in a scroll pane.
save = new JList(saveList);
save.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
save.setSelectedIndex(0);
save.addListSelectionListener(this);
save.setVisibleRowCount(5);
JScrollPane listScrollPane = new JScrollPane(save);

JButton sendBtn = new JButton(sendString);
SendListener sendListener = new SendListener(sendBtn);
sendBtn.setActionCommand(sendString);
sendBtn.addActionListener(sendListener);
sendBtn.setEnabled(false);

deleteBtn = new JButton(deleteString);
deleteBtn.setActionCommand(deleteString);
deleteBtn.addActionListener(new DeleteListener());

enterMsg = new JTextField(100);
enterMsg.addActionListener(sendListener);
enterMsg.getDocument().addDocumentListener(sendListener);
String name = saveList.getElementAt(
save.getSelectedIndex()).toString();

//Create a panel that uses BoxLayout.
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new BoxLayout(buttonPane,
BoxLayout.LINE_AXIS));
buttonPane.add(deleteBtn);
buttonPane.add(Box.createHorizontalStrut(5));
buttonPane.add(new JSeparator(SwingConstants.VERTICAL));
buttonPane.add(Box.createHorizontalStrut(5));
buttonPane.add(enterMsg);
buttonPane.add(sendBtn);
buttonPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));

add(listScrollPane, BorderLayout.CENTER);
add(buttonPane, BorderLayout.PAGE_END);

}

class DeleteListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
//This method can be called only if
//there's a valid selection
//so go ahead and remove whatever's selected.
int index = save.getSelectedIndex();
saveList.remove(index);

int size = saveList.getSize();

if (size == 0) { //Nobody's left, disable firing.
deleteBtn.setEnabled(false);

} else { //Select an index.
if (index == saveList.getSize()) {
//removed item in last position
index--;
}

save.setSelectedIndex(index);
save.ensureIndexIsVisible(index);
}
}
}

//This listener is shared by the text field and the send button.
class SendListener implements ActionListener, DocumentListener {
private boolean alreadyEnabled = false;
private JButton sendBtn;

public SendListener(JButton button) {
this.sendBtn = button;
}

//Required by ActionListener.
public void actionPerformed(ActionEvent e) {
String message = enterMsg.getText();

//User didn't type in a unique name...
if (message.equals("") || alreadyInList(message)) {
Toolkit.getDefaultToolkit().beep();
enterMsg.requestFocusInWindow();
enterMsg.selectAll();
return;
}

int index = save.getSelectedIndex(); //get selected index
if (index == -1) { //no selection, so insert at beginning
index = 0;
} else { //add after the selected item
index++;
}

saveList.insertElementAt(enterMsg.getText(), index);
//If we just wanted to add to the end, we'd do this:
//listModel.addElement(employeeName.getText());

//Reset the text field.
enterMsg.requestFocusInWindow();
enterMsg.setText("");

//Select the new item and make it visible.
save.setSelectedIndex(index);
save.ensureIndexIsVisible(index);
}

protected boolean alreadyInList(String name) {
return saveList.contains(name);
}

//Required by DocumentListener.
public void insertUpdate(DocumentEvent e) {
enableButton();
}

//Required by DocumentListener.
public void removeUpdate(DocumentEvent e) {
handleEmptyTextField(e);
}

//Required by DocumentListener.
public void changedUpdate(DocumentEvent e) {
if (!handleEmptyTextField(e)) {
enableButton();
}
}

private void enableButton() {
if (!alreadyEnabled) {
sendBtn.setEnabled(true);
}
}

private boolean handleEmptyTextField(DocumentEvent e) {
if (e.getDocument().getLength() <= 0) {
sendBtn.setEnabled(false);
alreadyEnabled = false;
return true;
}
return false;
}
}

//This method is required by ListSelectionListener.
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting() == false) {

if (save.getSelectedIndex() == -1) {
//No selection, disable delete button.
deleteBtn.setEnabled(false);

} else {
//Selection, enable the delete button.
deleteBtn.setEnabled(true);
}
}
}


private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("ListDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
JComponent newContentPane = new ListDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}

public void runClient()
{
Socket client;

try {
// Step 1: Create a Socket to make connection.

host = InetAddress.getLocalHost(); //...............
client = new Socket(host, 50000 );

// Step 2: Get the input and output streams.
output = new ObjectOutputStream(
client.getOutputStream() );
output.flush();
input = new ObjectInputStream(
client.getInputStream() );

// Step 3: Process connection.
enterMsg.setEnabled( true );
do {
try {
message = (String) input.readObject();

enterMsg.setCaretPosition(
enterMsg.getText().length() );
}
catch ( ClassNotFoundException cnfex ) {
}

} while ( !message.equals( "SERVER>>> TERMINATE" ) );

// Step 4: Close connection.
output.close();
input.close();
client.close();
}
catch ( EOFException eof ) {
System.out.println( "Server terminated connection" );
}
catch ( IOException e ) {
e.printStackTrace();
}
}

private void sendData( String s )
{
try {
message = s;
output.writeObject( "CLIENT1>>> " + s );
output.flush();
}
catch ( IOException cnfex ) {

}

}

class FireListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
//This method can be called only if
//there's a valid selection
//so go ahead and remove whatever's selected.
int index = save.getSelectedIndex();
saveList.remove(index);

int size = saveList.getSize();

if (size == 0) { //Nobody's left, disable firing.
deleteBtn.setEnabled(false);

} else { //Select an index.
if (index == saveList.getSize()) {
//removed item in last position
index--;
}

save.setSelectedIndex(index);
save.ensureIndexIsVisible(index);
}
}
}

public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}[/code]


Server Code
[code]import java.awt.*;
import java.awt.event.*;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.*;
import javax.swing.event.*;

public class Server extends JPanel
implements ListSelectionListener {
private JList save;
private DefaultListModel saveList;

private static final String sendString = "Send";
private static final String deleteString = "Delete";
private JButton deleteBtn;
private JTextField enterMsg;
private static InetAddress host;
ObjectOutputStream output;
ObjectInputStream input;
String message = "";


public Server() {
super(new BorderLayout());

saveList = new DefaultListModel();
saveList.addElement("Hi How are you?");
saveList.addElement("I'm ok. How are the kids?");
saveList.addElement("Thats good to hear. I will have to give you a call for a meeting soon.");

//Create the list and put it in a scroll pane.
save = new JList(saveList);
save.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
save.setSelectedIndex(0);
save.addListSelectionListener(this);
save.setVisibleRowCount(5);
JScrollPane listScrollPane = new JScrollPane(save);

JButton sendBtn = new JButton(sendString);
SendListener sendListener = new SendListener(sendBtn);
sendBtn.setActionCommand(sendString);
sendBtn.addActionListener(sendListener);
sendBtn.setEnabled(false);

deleteBtn = new JButton(deleteString);
deleteBtn.setActionCommand(deleteString);
deleteBtn.addActionListener(new DeleteListener());

enterMsg = new JTextField(100);
enterMsg.addActionListener(sendListener);
enterMsg.getDocument().addDocumentListener(sendListener);
String name = saveList.getElementAt(
save.getSelectedIndex()).toString();

//Create a panel that uses BoxLayout.
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new BoxLayout(buttonPane,
BoxLayout.LINE_AXIS));
buttonPane.add(deleteBtn);
buttonPane.add(Box.createHorizontalStrut(5));
buttonPane.add(new JSeparator(SwingConstants.VERTICAL));
buttonPane.add(Box.createHorizontalStrut(5));
buttonPane.add(enterMsg);
buttonPane.add(sendBtn);
buttonPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));

add(listScrollPane, BorderLayout.CENTER);
add(buttonPane, BorderLayout.PAGE_END);

}

class DeleteListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
//This method can be called only if
//there's a valid selection
//so go ahead and remove whatever's selected.
int index = save.getSelectedIndex();
saveList.remove(index);

int size = saveList.getSize();

if (size == 0) { //Nobody's left, disable firing.
deleteBtn.setEnabled(false);

} else { //Select an index.
if (index == saveList.getSize()) {
//removed item in last position
index--;
}

save.setSelectedIndex(index);
save.ensureIndexIsVisible(index);
}
}
}

//This listener is shared by the text field and the send button.
class SendListener implements ActionListener, DocumentListener {
private boolean alreadyEnabled = false;
private JButton sendBtn;

public SendListener(JButton button) {
this.sendBtn = button;
}

//Required by ActionListener.
public void actionPerformed(ActionEvent e) {
String message = enterMsg.getText();

//User didn't type in a unique name...
if (message.equals("") || alreadyInList(message)) {
Toolkit.getDefaultToolkit().beep();
enterMsg.requestFocusInWindow();
enterMsg.selectAll();
return;
}

int index = save.getSelectedIndex(); //get selected index
if (index == -1) { //no selection, so insert at beginning
index = 0;
} else { //add after the selected item
index++;
}

saveList.insertElementAt(enterMsg.getText(), index);
//If we just wanted to add to the end, we'd do this:
//listModel.addElement(employeeName.getText());

//Reset the text field.
enterMsg.requestFocusInWindow();
enterMsg.setText("");

//Select the new item and make it visible.
save.setSelectedIndex(index);
save.ensureIndexIsVisible(index);
}

protected boolean alreadyInList(String name) {
return saveList.contains(name);
}

//Required by DocumentListener.
public void insertUpdate(DocumentEvent e) {
enableButton();
}

//Required by DocumentListener.
public void removeUpdate(DocumentEvent e) {
handleEmptyTextField(e);
}

//Required by DocumentListener.
public void changedUpdate(DocumentEvent e) {
if (!handleEmptyTextField(e)) {
enableButton();
}
}

private void enableButton() {
if (!alreadyEnabled) {
sendBtn.setEnabled(true);
}
}

private boolean handleEmptyTextField(DocumentEvent e) {
if (e.getDocument().getLength() <= 0) {
sendBtn.setEnabled(false);
alreadyEnabled = false;
return true;
}
return false;
}
}

//This method is required by ListSelectionListener.
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting() == false) {

if (save.getSelectedIndex() == -1) {
//No selection, disable delete button.
deleteBtn.setEnabled(false);

} else {
//Selection, enable the delete button.
deleteBtn.setEnabled(true);
}
}
}


private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("ListDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
JComponent newContentPane = new ListDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);

}

public void runServer()
{
ServerSocket server;
Socket connection;
int counter = 1;

try {
// Step 1: Create a ServerSocket.
server = new ServerSocket(50000 );

while ( true ) {
// Step 2: Wait for a connection.
display.setText( "Waiting for connection
" );
connection = server.accept();

display.append( "Connection " + counter +
" received from: " +
connection.getInetAddress().getHostName() );

// Step 3: Get input and output streams.
output = new ObjectOutputStream(
connection.getOutputStream() );
output.flush();
input = new ObjectInputStream(
connection.getInputStream() );
display.append( "
Got I/O streams
" );

// Step 4: Process connection.
String message =
"SERVER>>> Connection successful";
output.writeObject( message );
output.flush();
enter.setEnabled( true );

do {
try {
message = (String) input.readObject();
display.append( "
" + message );
display.setCaretPosition(
display.getText().length() );
}
catch ( ClassNotFoundException cnfex ) {
display.append(
"
Unknown object type received" );
}
} while ( !message.equals( "CLIENT>>> TERMINATE" ) );

// Step 5: Close connection.
display.append( "
User terminated connection" );
enter.setEnabled( false );
output.close();
input.close();
connection.close();

++counter;
}
}
catch ( EOFException eof ) {
System.out.println( "Client terminated connection" );
}
catch ( IOException io ) {
io.printStackTrace();
}
}

private void sendData( String s )
{
try {
output.writeObject( "CLIENT2>>> " + s );
output.flush();
display.append( "
CLIENT2>>>" + s );
}
catch ( IOException cnfex ) {
display.append(
"
Error writing object" );
}
}

public static void main( String args[] )
{
Server app = new Server();

app.runServer();
}
}//end of Server[/code]

Thanks in advance

Comments

  • MartianMartian Posts: 9Member
    The Client.java code does not compile because javac cannot resolve ListDemo.
    The Server.java code does not compile because javac cannot resolve ListDemo.
    The Server.java code does not compile because javac cannot resolve the display variable.

    Please provide the complete (compilable) source code, and a description of the problem you're having would be helpful as well.

    Cheers.
Sign In or Register to comment.