Skip to content

Instantly share code, notes, and snippets.

@ishanExtreme
Last active April 13, 2021 17:59
Show Gist options
  • Save ishanExtreme/287e700535c4a39db5a29c9584368076 to your computer and use it in GitHub Desktop.
Save ishanExtreme/287e700535c4a39db5a29c9584368076 to your computer and use it in GitHub Desktop.
UserThread
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* For making seperate thread for each user
*/
public class UserThread extends Thread {
// User Socket
private Socket socket;
// Main Server
private Server server;
private PrintWriter writer;
private String userName;
/**
* Parametrized Constructor
*
* @param socket: User Socket
* @param server: Main Server
*/
public UserThread(Socket socket, Server server) {
this.socket = socket;
this.server = server;
this.userName = "Anonymous";
}
/**
* Overriding run() method of Thread Class
*/
@Override
public void run() {
try (
// autoclosable
// used to read from socket's InputStream, data is fed using WriteThread.java
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));) {
// write to socket's output stream
this.writer = new PrintWriter(socket.getOutputStream(), true);
// prints connected users
printUsers();
// First line given by client is user name(See WriteThread.java)
this.userName = reader.readLine();
server.addUserName(userName);
// message send by server to all user, exept current one
String serverMessage = "New user connected: " + userName;
server.broadcast(serverMessage, this);
// client messages
String clientMessage;
// rest msgs send by current client
while (socket.isConnected() && !socket.isClosed()) {
clientMessage = reader.readLine();
serverMessage = "[" + userName + "]: " + clientMessage;
server.broadcast(serverMessage, this);
}
} catch (IOException ex) {
System.out.println("Error in UserThread: " + ex.getMessage());
ex.printStackTrace();
} finally {
server.removeUser(userName, this);
try {
socket.close();
} catch (IOException e) {
System.out.println(e.toString());
}
String serverMessage = userName + " has quitted.";
server.broadcast(serverMessage, this);
}
}
/**
* Sends a list of online users to the newly connected user.
*/
void printUsers() {
if (server.hasUsers()) {
writer.println("Connected users: " + server.getUserNames());
} else {
writer.println("No other users connected");
}
}
/**
* Sends a message to the client. Used in Server class's broadcasting method
*/
void sendMessage(String message) {
writer.println(message);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment