All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.pdx.cs410J.net.ChatSpeaker Maven / Gradle / Ivy

The newest version!
package edu.pdx.cs410J.net;

import java.io.*;
import java.util.*;
import java.net.*;

/**
 * A ChatSpeaker runs in the background and sends
 * ChatMessages over a Socket.
 */
public class ChatSpeaker implements Runnable {
  private static PrintStream err = System.err;

  private List outgoing;  // Outgoing messages
  private BufferedOutputStream bos;  // Send messages here

  /**
   * Creates a new ChatSpeaker
   */
  public ChatSpeaker() {
    this.outgoing = new ArrayList();
  }

  /**
   * Sets the socket to which this ChatSpeaker sends
   * messages.
   */
  public void setSocket(Socket socket) {
//      System.out.println("Making output stream");

    try {
      // Make streams for reading and writing
//        System.out.println("OutputStream");

      this.bos = new BufferedOutputStream(socket.getOutputStream());

    } catch (IOException ex) {
      err.println("** IOException: " + ex);
      System.exit(1);
    }
  }

  /** 
   * A ChatSpeaker uses wait/notify on its
   * incoming list to know when to send a message.  For
   * the sake of symmetry, we interrupt it to tell it to stop.
   */
  public void run() {
//      System.out.println("ChatSpeaker starting");

    while (true) {
      try {
	// Is there a message to send?
	synchronized(this.outgoing) {
	  if (!this.outgoing.isEmpty()) {
	    ChatMessage m = (ChatMessage) this.outgoing.remove(0);
	    
//  	    System.out.println("Sending: " + m);
	    
	    ObjectOutputStream out = new ObjectOutputStream(bos);
	    out.writeObject(m);
	    out.flush();

	    if (m.isLastMessage()) {
	      // Send the last message and then go home
	      break;
	    }

	  }

	  // Wait for a message
	  this.outgoing.wait();
	}

      } catch (IOException ex) {
	err.println("** IOException: " + ex);
	System.exit(1);
	break;
	
      } catch (InterruptedException ex) {
//  	System.out.println("Done sending messages");
	break;
      }
    }

//      System.out.println("ChatSpeaker stopping");
  }

  /**
   * Queues a message to be sent.  This method will be called by a
   * thread other than the one running run().
   */
  public void sendMessage(ChatMessage message) {
    synchronized(this.outgoing) {
//        System.out.println("Adding message: " + message);
      this.outgoing.add(message);
      this.outgoing.notify();
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy