Skip to content

Instantly share code, notes, and snippets.

@nikhil3000
Created June 9, 2025 18:58
Show Gist options
  • Select an option

  • Save nikhil3000/c2c555c58889b0a2de412873aba7b81c to your computer and use it in GitHub Desktop.

Select an option

Save nikhil3000/c2c555c58889b0a2de412873aba7b81c to your computer and use it in GitHub Desktop.
A simple java webserver using sockets api
// server.java
package org.example;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
List<PrintWriter> clientWriterList = new ArrayList<>();
public void go() {
try {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
System.out.println("I will now wait for a connection request");
Socket socket = serverSocket.accept();
System.out.println("Processing client request");
ClientHandler clientHandler = new ClientHandler(socket, this::broadcastMessage);
Thread clientThread = new Thread(clientHandler);
clientThread.start();
clientWriterList.add(new PrintWriter(socket.getOutputStream()));
}
}catch (Exception ex) {
System.out.println(ex);
}
}
private Boolean broadcastMessage(String message) {
for(int i=0;i<clientWriterList.size();i++) {
clientWriterList.get(i).println(message);
clientWriterList.get(i).flush();
}
return true;
}
public static void main(String[] args) {
Server server = new Server();
server.go();
}
}
// Client.java
package org.example;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
BufferedReader reader;
PrintWriter writer;
public void go() {
try {
System.out.println("Fetching data from server");
Socket s = new Socket("127.0.0.1", 8080);
InputStreamReader inputStreamReader = new InputStreamReader(s.getInputStream());
reader = new BufferedReader(inputStreamReader);
writer = new PrintWriter(s.getOutputStream());
System.out.println("Connection established");
// reader thread setup
Thread readerThread = new Thread(() -> {
System.out.println("client is waiting for messages from server");
try {
String message;
while ((message = reader.readLine()) != null) {
System.out.println("read message " + message);
}
} catch (Exception ex) {
System.out.println("error while reading from server" + ex);
}
System.out.println("killing listener");
});
readerThread.start();
// setting up writer to send messages to the backend chat server
// anything typed in the console will be pushed to the backend
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
String consoleMessage;
while ((consoleMessage = consoleReader.readLine()) != null) {
System.out.println("read from console " + consoleMessage);
writer.println(consoleMessage);
writer.flush();
}
} catch (Exception ex) {
System.out.println(ex);
}
}
// Run multiple instances of this client
public static void main(String[] args) {
Client client = new Client();
client.go();
}
}
// ClientHandler.java
package org.example;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.function.Function;
public class ClientHandler implements Runnable{
Socket socket;
Function<String, Boolean> broadcastMessage;
public ClientHandler(Socket socket, Function<String, Boolean> broadcastMessage) {
this.broadcastMessage = broadcastMessage;
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message;
while((message = bufferedReader.readLine()) != null) {
System.out.println("Recieved message from client " + message);
broadcastMessage.apply(message);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@nikhil3000
Copy link
Author

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment