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.

Recommended Answers

All 3 Replies

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.