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...

Majestics : Wow, what a strange error!
It worked with 30 columns!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.