I am reading the book Head First Java.
Reading the chapter 'networking and threads' I tried to run a project in my Eclipse IDE that consists of a chat server and chat clients.
The problem is that I am getting no feedback in the clients text area and debugging seems to have problem inside a running thread.
Here is the code:
VerySimpleChatServer.java :
package mypackage;
import java.io.*;
import java.net.*;
import java.util.*;
public class VerySimpleChatServer {
ArrayList clientOutputStreams;
//Inner class ClientHandler
public class ClientHandler implements Runnable
{
BufferedReader reader;
Socket sock;
public ClientHandler(Socket clientSocket)
{
try
{
sock = clientSocket;
InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(isReader);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}//close constructor
public void run()
{
String message;
try
{
while((message = reader.readLine()) != null)
{
System.out.println("read " + message);
tellEveryone(message);
}//close while
}
catch(Exception ex)
{
ex.printStackTrace();
}
}//close run
}//close inner class
public static void main(String[] args) {
// TODO Auto-generated method stub
new VerySimpleChatServer().go();
}
public void go()
{
clientOutputStreams = new ArrayList();
try
{
ServerSocket serverSock = new ServerSocket(5000);
while(true)
{
Socket clientSocket = serverSock.accept();
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clientOutputStreams.add(writer);
Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("got a connection");
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}//close go
public void tellEveryone(String message)
{
Iterator it = clientOutputStreams.iterator();
while(it.hasNext())
{
try
{
PrintWriter writer = (PrintWriter)it.next();
writer.println(message);
writer.flush();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}//end while
}//close tellEveryone
}//close class
SimpleChatClient.java :
package mypackage;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleChatClient {
JTextArea incoming;
JTextField outgoing;
BufferedReader reader;
PrintWriter writer;
Socket sock;
public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleChatClient client = new SimpleChatClient();
client.go();
}
public void go()
{
JFrame frame = new JFrame("Ludicrously Simple Chat Client");
JPanel mainPanel = new JPanel();
incoming = new JTextArea(15, 50);
incoming.setLineWrap(true);
incoming.setWrapStyleWord(true);
incoming.setEditable(false);
JScrollPane qScroller = new JScrollPane(incoming);
qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
outgoing = new JTextField(20);
JButton sendButton = new JButton("Send");
sendButton.addActionListener(new SendButtonListener());
mainPanel.add(qScroller);
mainPanel.add(outgoing);
mainPanel.add(sendButton);
setUpNetworking();
Thread readerThread = new Thread(new IncomingReader());
readerThread.start();
frame.add(mainPanel, BorderLayout.CENTER);
frame.setSize(400, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}//close go
private void setUpNetworking()
{
try
{
sock = new Socket("127.0.0.1", 5000);
InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(streamReader);
writer = new PrintWriter(sock.getOutputStream());
System.out.println("networking established");
}
catch(IOException ex)
{
ex.printStackTrace();
}
}//close setUpNetworking
//inner class
public class SendButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent ev)
{
try
{
writer.println(outgoing.getText());
writer.flush();
}
catch(Exception ex)
{
ex.printStackTrace();
}
outgoing.setText("");
outgoing.requestFocus();
}
}//close inner class
//inner class
public class IncomingReader implements Runnable
{
public void run()
{
String message;
try
{
while ( (message = reader.readLine()) != null)
{
System.out.println("read " + message);
incoming.append(message + "\n");
}//close while
}
catch(Exception ex)
{
ex.printStackTrace();
}
}//close run
}//close inner class
}
Any ideas?
Thank you very much.
all changes for Swing JComponents must be done in EventDispashTread, and you have issue with Concurency in Swing, because your method IncomingReader doesn't inkoke EDT,
short description ---> wrap incoming.append(message + "\n"); to the invokeLater()
long Concurency in Swing
Reduce the number of column from 50 to 30....
incoming = new JTextArea(15, 30);
Your Text is appearing but isnt adjusting over frame correctly...