Here the quick and dirty of multi-user chat bro.
Classes
* Main server socket -- creates client socket, client thread, and holds the maps of the chatter
* Client thread Runnable - prompt you to welcome, broadcast message to chatters
Usage:
1) Complie and run it
2) run 'telnet localhost 5000' at least 2 instances
I know there are problems but i think it's good enough for you to start. Let me know if you have more question.
Code:
package chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
*
* @author kamsky
*
*/
public class ChatServer {
private ServerSocket serverSocket;
final int PORT = 5000;
// holds the value of the chatters
private Map<String, Client> clients = new HashMap<String, Client>();
public ChatServer() {
try {
System.out.println("Starting server listening at port: " + PORT);
serverSocket = new ServerSocket(PORT);
Socket socket = null;
while ((socket = serverSocket.accept()) != null) {
// creates a thread for every client
Client client = new Client(socket, clients);
Thread clientThread = new Thread(client);
clientThread.start();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new ChatServer();
Thread.currentThread().setDaemon(true);
}
}
/**
*
* @author kamsky
*
*/
class Client implements Runnable {
private Socket socket;
private String name;
private Map<String, Client> clients;
/*
* Client's socket and the party
*/
public Client(Socket socket, Map<String, Client> clients) {
this.socket = socket;
this.clients = clients;
}
/**
*
* @return
*/
public Socket getSocket() {
return this.socket;
}
@Override
public void run() {
try {
// welcome message or authentication
System.out.println("Conneting " + socket);
OutputStreamWriter writer;
try {
writer = new OutputStreamWriter(socket.getOutputStream());
writer.write("Welcome! Enter your name: ");
writer.flush();
InputStreamReader isReader = new InputStreamReader(
socket.getInputStream());
BufferedReader reader = new BufferedReader(isReader);
String name = reader.readLine();
if (clients.get(name) == null) {
this.name = name;
clients.put(name, this);
broadcastMessage(name + " has joined ");
} else {
writer.write("Name " + name
+ " is taken. Please try again. Goodbye!");
writer.flush();
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// the exchanging of messages here
InputStreamReader isReader = new InputStreamReader(
socket.getInputStream());
BufferedReader reader = new BufferedReader(isReader);
String line = null;
while ((line = reader.readLine()) != null) {
// name : <message>
broadcastMessage("<" + this.name + "> : " + line);
}
} catch (IOException e) {
System.out.println("Connection closed ...");
}
}
/**
* simplified message
*/
private void broadcastMessage(String message) throws IOException {
System.out.println("Message: " + message);
Set<String> clientsName = clients.keySet();
for (String name : clientsName) {
if (!this.name.equals(name)) {
// get the reader
Socket clientSocket = clients.get(name).getSocket();
OutputStreamWriter writer = new OutputStreamWriter(
clientSocket.getOutputStream());
writer.write(message);
writer.write("\r\n");
writer.flush();
}
}
// add prompt
OutputStreamWriter writer = new OutputStreamWriter(
socket.getOutputStream());
writer.write(">>");
writer.flush();
}
}