Commit a3b212ba authored by Trisha Gee's avatar Trisha Gee
Browse files

[Ch15] Yes, it works! Chat client and server works (for one connection). It...

[Ch15] Yes, it works! Chat client and server works (for one connection). It was down to the byte buffer of course, also it's about how you read the String from the byte buffer at the UI end.
parent 0cf041b8
Loading
Loading
Loading
Loading
+11 −6
Changes for src/main/java/ch15/SimpleChatClient.java: 11 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@@ -75,7 +76,6 @@ class ClientUI {
      ByteBuffer buffer = ByteBuffer.wrap(message);
      try {
        channel.write(buffer);
        buffer.clear();
      } catch (Exception ex) {
        ex.printStackTrace();
      }
@@ -99,16 +99,21 @@ class IncomingReader implements Runnable {
  }

  private void processMessages() {
    ByteBuffer buffer = ByteBuffer.allocate(256);
    ByteBuffer buffer = ByteBuffer.allocate(80);

    try {
      while (channel.isOpen()) {
        buffer.clear();
        channel.read(buffer);
        String message = new String(buffer.array()).trim();
      while (channel.read(buffer) != -1) {
        buffer.flip();
        byte[] bytes = new byte[buffer.remaining()];
        buffer.get(bytes);
        String message = new String(bytes, StandardCharsets.UTF_8);

        System.out.println("read " + message);
        incomingMessageArea.append(message + "\n");
        buffer.clear();
      }
      channel.close();
      System.out.println("Connection closed");
    } catch (Exception ex) {
      ex.printStackTrace();
    }
+18 −6
Changes for src/main/java/ch15/SimpleChatServer.java: 18 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -46,16 +46,24 @@ class ClientHandler implements Runnable {
  }

  public void run() {
    ByteBuffer buffer = ByteBuffer.allocate(32);
    ByteBuffer buffer = ByteBuffer.allocate(80);
    System.out.println("ClientHandler.run");
    try {
      while (clientSocket.isOpen()) {
        clientSocket.read(buffer);
        System.out.println("received: " + new String(buffer.array()).trim());
      int length;
      while ((length = clientSocket.read(buffer)) != -1) {
        System.out.println(length);
        System.out.println("buffer = " + buffer);
//        System.out.println("received: " + new String(buffer.array()).trim());
        buffer.flip();
        broadcaster.tellEveryone(buffer);
        buffer.clear();
        System.out.println("buffer = " + buffer);
        while (buffer.hasRemaining()) {
          clientSocket.write(buffer);
        }
        buffer.compact();
      }
      clientSocket.close();
      System.out.println("Closed: " + clientSocket);
      broadcaster.remove(clientSocket);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
@@ -80,4 +88,8 @@ class Broadcaster {
    }
    message.flip();
  }

  public void remove(SocketChannel clientSocket) {
    clientOutputStreams.remove(clientSocket);
  }
}
 No newline at end of file