Skip to content

Instantly share code, notes, and snippets.

@Brutt
Created March 26, 2018 20:16
Show Gist options
  • Save Brutt/8ed53a4dbe4b2ba098809747cdb782a5 to your computer and use it in GitHub Desktop.
Save Brutt/8ed53a4dbe4b2ba098809747cdb782a5 to your computer and use it in GitHub Desktop.
chat
package Chat;
import java.io.*;
import java.net.Socket;
public class Client implements Runnable {
BufferedReader consoleBufferedReader;
BufferedWriter socketBufferedWriter;
BufferedReader socketBufferedReader;
public Client(Socket socket) throws IOException {
// console
consoleBufferedReader = new BufferedReader(new InputStreamReader(System.in));
// server
socketBufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
socketBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 3000);
Client client = new Client(socket);
new Thread(client).start();
client.sender();
}
private void sender(){
try {
while (true) {
String messageFromConsole = consoleBufferedReader.readLine();
socketBufferedWriter.write(messageFromConsole);
socketBufferedWriter.newLine();
socketBufferedWriter.flush();
//System.out.println(socketBufferedReader.readLine());
}
}catch (IOException e){
throw new RuntimeException(e);
}
}
@Override
public void run() {
try {
while (true) {
/*String messageFromConsole = consoleBufferedReader.readLine();
socketBufferedWriter.write(messageFromConsole);
socketBufferedWriter.newLine();
socketBufferedWriter.flush();*/
System.out.println(socketBufferedReader.readLine());
}
}catch (IOException e){
throw new RuntimeException(e);
}
}
}
package Chat;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
public class Initializer {
private HashSet<String> allNicks = new HashSet<>();
private HashMap<Thread,String> threadNickMap = new HashMap<>();
List<Socket> socketList = new ArrayList<>();
public static void main(String[] args) {
try {
Initializer initializer = new Initializer();
ServerSocket serverSocket = new ServerSocket(3000);
while (true) {
Socket socketNew = serverSocket.accept();
initializer.socketList.add(socketNew);
Server server = new Server(socketNew, initializer.allNicks, initializer.threadNickMap);
server.setSocketList(initializer.socketList);
Thread thread = new Thread(server);
thread.start();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
package Chat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Message {
private LocalDateTime datetime;
private String nick;
private String text;
public Message(String nick, String text) {
datetime = LocalDateTime.now();
this.nick = nick;
this.text = text;
}
@Override
public String toString() {
return datetime.format(DateTimeFormatter.ofPattern("dd/MMM/yyyy HH:mm:ss")) +
"("+nick+")"+
": " + text;
}
}
package Chat;
import java.io.*;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
public class Server implements Runnable{
private HashMap<Thread,String> threadNickMap;
private Socket socket;
private HashSet<String> allNicks;
private List<Socket> socketList;
public void setSocketList(List<Socket> socketList) {
this.socketList = socketList;
}
public Server(Socket socket, HashSet<String> allNicks, HashMap<Thread,String> threadNickMap) {
this.socket = socket;
this.allNicks = allNicks;
this.threadNickMap = threadNickMap;
}
@Override
public void run() {
try {
threadNickMap.put(Thread.currentThread(),null);
BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String incomeMessage = socketBufferedReader.readLine();
String responseAfterParse = parseMessage(incomeMessage);
if(responseAfterParse != null){
incomeMessage = responseAfterParse;
}
String nickname = threadNickMap.get(Thread.currentThread())==null ? "Unknown #"+Thread.currentThread().getId() : threadNickMap.get(Thread.currentThread());
Message message = new Message(nickname, incomeMessage);
//conversation.add(message);
System.out.println(message);
for (Socket socket1 : socketList) {
BufferedWriter socketBufferedWriter = new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream()));
if (responseAfterParse != null){
if (socket1.equals(socket)) {
socketBufferedWriter.write(message.toString());
socketBufferedWriter.newLine();
socketBufferedWriter.flush();
}
}else{
socketBufferedWriter.write(message.toString());
socketBufferedWriter.newLine();
socketBufferedWriter.flush();
}
}
}
}catch (IOException e){
throw new RuntimeException(e);
}
}
private String parseMessage(String message){
String[] messageArray = message.split(" ");
if(messageArray.length >= 2) {
String name = messageArray[1];
if (messageArray[0].equals("add") && !name.isEmpty()) {
if (allNicks.contains(name)){
return "Nick is currently used";
}
allNicks.add(name);
threadNickMap.put(Thread.currentThread(), name);
return "Now your nick is " + name;
}else if((messageArray[0] + " " + messageArray[1]).equals("show users")){
return "users:" + allNicks.toString();
}
}
return null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment