I wanted to practice using sockets and multithreading. This is simple code where I start a Server
and connect to it via Client
and chat between them.
Server
class:
public class Server {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(4545);
SocketEnhancer socketEnhancer = new SocketEnhancer(serverSocket.accept());
}
}
Client
class:
public class Client {
public static void main(String[] args) throws Exception{
SocketEnhancer socketEnhancer = new SocketEnhancer(new Socket("localhost",4545));
}
}
SocketEnchancer
:
public class SocketEnhancer {
DataReceiver dataReceiver;
DataSender dataSender;
Socket socket;
public SocketEnhancer(Socket socket){
this.socket = socket;
dataReceiver = new DataReceiver(this);
dataSender = new DataSender(this);
new Thread(dataSender).start();
new Thread(dataReceiver).start();
}
public Socket getSocket() {
return socket;
}
}
DataReceiver
:
public class DataReceiver implements Runnable {
SocketEnhancer socketEnhancer;
public DataReceiver(SocketEnhancer socketEnhancer) {
this.socketEnhancer = socketEnhancer;
}
@Override
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socketEnhancer.getSocket().getInputStream()));
while (true) {
String readLine = bufferedReader.readLine();
if(readLine != null){
System.out.println("Data received: " + readLine);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
DataSender
:
public class DataSender implements Runnable {
SocketEnhancer socketEnhancer;
Scanner scanner = new Scanner(System.in);
public DataSender(SocketEnhancer socketEnhancer) {
this.socketEnhancer = socketEnhancer;
}
@Override
public void run() {
try {
PrintWriter printWriter = new PrintWriter(socketEnhancer.getSocket().getOutputStream());
while(true) {
String readLine = scanner.nextLine();
printWriter.write(readLine + System.lineSeparator());
printWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Any comments and criticism is appreciated.