Commit 76a982dd authored by Trisha Gee's avatar Trisha Gee
Browse files

[Ch15] Rolling back to 2nd ed code for chat app.

parent ed426dbc
Loading
Loading
Loading
Loading
+19 −18
Changes for src/main/java/ch15/SimpleChatClient.java: 19 added lines, 18 removed lines.
Original line number Diff line number Diff line
@@ -4,15 +4,17 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class SimpleChatClient {
  private JTextArea incoming;
  private JTextField outgoing;
  private SocketChannel socketChannel;
  private BufferedReader reader;
  private PrintWriter writer;

  public static void main(String[] args) {
    new SimpleChatClient().go();
@@ -44,10 +46,10 @@ public class SimpleChatClient {

  private void setUpNetworking() {
    try {
      InetSocketAddress address = new InetSocketAddress("localhost", 5000);
      this.socketChannel = SocketChannel.open(address);


      Socket 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();
@@ -57,10 +59,8 @@ public class SimpleChatClient {
  public class SendButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent ev) {
      try {
        String message = outgoing.getText();
        System.out.println(message);
        ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
        socketChannel.write(buffer);
        writer.println(outgoing.getText());
        writer.flush();
      } catch (Exception ex) {
        ex.printStackTrace();
      }
@@ -71,14 +71,15 @@ public class SimpleChatClient {

  public class IncomingReader implements Runnable {
    public void run() {
      ByteBuffer buffer = ByteBuffer.allocate(256);
      String message;
      try {
        socketChannel.read(buffer);
      } catch (IOException e) {
        e.printStackTrace();
        while ((message = reader.readLine()) != null) {
          System.out.println("read " + message);
          incoming.append(message + "\n");
        } // close while
      } catch (Exception ex) {
        ex.printStackTrace();
      }
      String result = new String(buffer.array()).trim();
      incoming.append(result);
    } // close run
  } // close inner class
} // close outer class
 No newline at end of file
+44 −46
Changes for src/main/java/ch15/SimpleChatServer.java: 44 added lines, 46 removed lines.
Original line number Diff line number Diff line
package ch15;

import java.io.BufferedReader;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

public class SimpleChatServer {
  private ArrayList<SocketChannel> clients;
  ArrayList<PrintWriter> clientOutputStreams;

  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) {
    new SimpleChatServer().go();
  }

  public void go() {
    clients = new ArrayList<>();
    clientOutputStreams = new ArrayList<>();
    try {
      ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
      InetSocketAddress address = new InetSocketAddress("127.0.0.1", 5000);
      serverSocketChannel.bind(address);

      while (serverSocketChannel.isOpen()) {
        SocketChannel socketChannel = serverSocketChannel.accept();

        clients.add(socketChannel);
        Thread t = new Thread(new ClientHandler(socketChannel));
      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");
      }
@@ -36,41 +59,16 @@ public class SimpleChatServer {
    }
  } // close go

  public class ClientHandler implements Runnable {
    SocketChannel socketChannel;

    public ClientHandler(SocketChannel socketChannel) {
      this.socketChannel = socketChannel;
    }

    public void run() {
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      buffer.clear();
      try {
        int read = socketChannel.read(buffer);
        System.out.println(read);
        ByteBuffer byteBuffer = buffer.flip();
        tellEveryone(byteBuffer);
        System.out.println("told");
      } catch (IOException e) {
        e.printStackTrace();
      }

    } // close run

    public void tellEveryone(ByteBuffer byteBuffer) {
      Iterator<SocketChannel> it = clients.iterator();
  public void tellEveryone(String message) {
    Iterator<PrintWriter> it = clientOutputStreams.iterator();
    while (it.hasNext()) {
      try {
          SocketChannel channel = it.next();
          while(byteBuffer.hasRemaining()) {
            channel.write(byteBuffer);
          }

        PrintWriter writer = it.next();
        writer.println(message);
        writer.flush();
      } catch (Exception ex) {
        ex.printStackTrace();
      }
    } // end while
  } // close tellEveryone
  } // close ClientHandler
} // close class
 No newline at end of file