Skip to content

Instantly share code, notes, and snippets.

@andraantariksa
Last active October 28, 2020 12:54
Show Gist options
  • Save andraantariksa/acb4b2df0f4a82f3163a5686473366c1 to your computer and use it in GitHub Desktop.
Save andraantariksa/acb4b2df0f4a82f3163a5686473366c1 to your computer and use it in GitHub Desktop.
Simple Java socket client
package io.github.andraantariksa;
import java.io.*;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Scanner;
public class MainClient {
public static void main(String[] args) {
SocketClient client = new SocketClient("localhost", 3657);
client.run();
System.exit(0);
}
}
class ClientReceiverThread extends Thread {
InputStream m_input;
ClientReceiverThread(InputStream input) {
m_input = input;
}
@Override
public void run() {
String receivedMessage;
do {
BufferedReader reader = new BufferedReader(new InputStreamReader(m_input));
try {
receivedMessage = reader.readLine();
if (receivedMessage == null) {
break;
}
System.out.println("[SERVER][" + new Date().toString() + "] " + receivedMessage);
} catch (SocketException e) {
// When socket is closed
break;
} catch (IOException e) {
e.printStackTrace();
break;
}
} while (!receivedMessage.equals("bye"));
}
}
class ClientSenderThread extends Thread {
OutputStream m_output;
PrintWriter m_writer;
Scanner m_scanner;
ClientSenderThread(OutputStream output) {
m_output = output;
m_writer = new PrintWriter(m_output, true);
m_scanner = new Scanner(System.in);
}
@Override
public void run() {
String toSendMessage;
do {
toSendMessage = m_scanner.nextLine();
if (toSendMessage == null) {
break;
}
m_writer.println(toSendMessage);
System.out.println("[CLIENT][" + new Date().toString() + "] " + toSendMessage);
} while (!toSendMessage.equals("bye"));
}
}
class SocketClient {
final String m_hostname;
final int m_port;
SocketClient(String hostname, int port) {
m_hostname = hostname;
m_port = port;
}
void run() {
try {
System.out.println("Trying to connect to the server socket...");
Socket socket = new Socket(m_hostname, m_port);
System.out.println("Connected to the server. You can now type your message");
OutputStream output = socket.getOutputStream();
InputStream input = socket.getInputStream();
// Start the thread
ClientSenderThread clientSenderThread = new ClientSenderThread(output);
ClientReceiverThread clientReceiverThread = new ClientReceiverThread(input);
clientSenderThread.start();
clientReceiverThread.start();
while (true) {
if (!clientSenderThread.isAlive() || !clientReceiverThread.isAlive()) {
System.out.println("Chat session ended");
break;
}
}
input.close();
output.close();
clientSenderThread.stop();
clientReceiverThread.stop();
socket.close();
} catch (UnknownHostException ex) {
System.out.println("Server not found: " + ex.getMessage());
} catch (IOException ex) {
System.out.println("I/O error: " + ex.getMessage());
}
}
}
package io.github.andraantariksa;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Date;
import java.util.Scanner;
public class MainServer {
public static void main(String[] args) {
SocketServer server = new SocketServer(3657);
server.run();
System.exit(0);
}
}
class ServerReceiverThread extends Thread {
InputStream m_input;
ServerReceiverThread(InputStream input) {
m_input = input;
}
@Override
public void run() {
String receivedMessage;
do {
BufferedReader reader = new BufferedReader(new InputStreamReader(m_input));
try {
receivedMessage = reader.readLine();
if (receivedMessage == null) {
break;
}
System.out.println("[CLIENT][" + new Date().toString() + "] " + receivedMessage);
} catch (SocketException e) {
// When socket is closed
break;
} catch (IOException e) {
e.printStackTrace();
break;
}
} while (!receivedMessage.equals("bye"));
}
}
class ServerSenderThread extends Thread {
OutputStream m_output;
PrintWriter m_writer;
Scanner m_scanner;
ServerSenderThread(OutputStream output) {
m_output = output;
m_writer = new PrintWriter(m_output, true);
m_scanner = new Scanner(System.in);
}
@Override
public void run() {
String toSendMessage;
do {
toSendMessage = m_scanner.nextLine();
if (toSendMessage == null) {
break;
}
m_writer.println(toSendMessage);
System.out.println("[SERVER][" + new Date().toString() + "] " + toSendMessage);
} while (!toSendMessage.equals("bye"));
}
}
class SocketServer {
private final int m_port;
SocketServer(int port) {
m_port = port;
}
void run() {
try {
System.out.println("Starting up the socket server...");
ServerSocket serverSocket = new ServerSocket(m_port);
System.out.println("Server is listening on port " + m_port);
System.out.println("Waiting for a client to connect...");
Socket socket = serverSocket.accept();
System.out.println("A client has been connected. You can now type your message");
OutputStream output = socket.getOutputStream();
InputStream input = socket.getInputStream();
// Start the thread
ServerSenderThread serverSenderThread = new ServerSenderThread(output);
ServerReceiverThread serverReceiverThread = new ServerReceiverThread(input);
serverSenderThread.start();
serverReceiverThread.start();
while (true) {
if (!serverSenderThread.isAlive() || !serverReceiverThread.isAlive()) {
System.out.println("Chat session ended");
break;
}
}
input.close();
output.close();
serverSenderThread.stop();
serverReceiverThread.stop();
socket.close();
} catch (IOException ex) {
System.out.println("Server exception: " + ex.getMessage());
ex.printStackTrace();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment