Created
December 21, 2021 05:19
-
-
Save trishagee/8c368136681106d7eb6f7921885c3385 to your computer and use it in GitHub Desktop.
Simple chat server and client, HFJ 2nd Ed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package ch15; | |
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.io.InputStreamReader; | |
import java.io.PrintWriter; | |
import java.net.Socket; | |
public class SimpleChatClient { | |
JTextArea incoming; | |
JTextField outgoing; | |
BufferedReader reader; | |
PrintWriter writer; | |
Socket sock; | |
public static void main(String[] args) { | |
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.getContentPane().add(BorderLayout.CENTER, mainPanel); | |
frame.setSize(800, 500); | |
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 | |
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 | |
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 | |
} // close outer class |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package ch15; | |
import java.io.BufferedReader; | |
import java.io.InputStreamReader; | |
import java.io.PrintWriter; | |
import java.net.ServerSocket; | |
import java.net.Socket; | |
import java.util.ArrayList; | |
public class SimpleChatServer { | |
ArrayList<PrintWriter> clientOutputStreams; | |
public static void main(String[] args) { | |
new SimpleChatServer().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) { | |
for (PrintWriter writer : clientOutputStreams) { | |
try { | |
writer.println(message); | |
writer.flush(); | |
} catch (Exception ex) { | |
ex.printStackTrace(); | |
} | |
} // end while | |
} // close tellEveryone | |
public class ClientHandler implements Runnable { | |
BufferedReader reader; | |
Socket socket; | |
public ClientHandler(Socket clientSocket) { | |
try { | |
socket = clientSocket; | |
InputStreamReader isReader = new InputStreamReader(socket.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 | |
} // close class |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment