Created
March 26, 2018 20:16
-
-
Save Brutt/8ed53a4dbe4b2ba098809747cdb782a5 to your computer and use it in GitHub Desktop.
chat
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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