Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Macket messenger #130

Open
wants to merge 20 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
6fd4bdc
Added OWNER
Mar 7, 2017
08ff89c
Merge remote-tracking branch 'upstream/master'
Mar 14, 2017
99afbf5
Merge remote-tracking branch 'upstream/master'
Mar 15, 2017
b2b1083
Merge remote-tracking branch 'upstream/master'
Mar 21, 2017
994359d
Добавил код для дешифрования при помощи частотного анализа
Mar 22, 2017
cdc8609
Merge remote-tracking branch 'upstream/master'
Apr 5, 2017
ea09c19
Merge remote-tracking branch 'upstream/master'
Apr 8, 2017
17d957a
Merge remote-tracking branch 'upstream/master'
Apr 11, 2017
9cb2165
Просто коммит
Apr 18, 2017
caed98f
Подтянул мессенджер из upstream
Apr 18, 2017
ac6a11a
Сделал каркас многопоточного сервера
Apr 21, 2017
b5dc44e
Реализовал многопоточность через ThreadPool
May 4, 2017
984655b
Передача сообщений посредством сериализации
May 7, 2017
9f08efb
Обновил мессенджер
Jun 20, 2017
e494ddb
Сохренение пользователей в БД
Jun 22, 2017
f74c1d3
Сделал чаты
Jun 23, 2017
d80dad5
Вход-выход из чатов, список чатов пользователя, история чата
Jul 5, 2017
ed1c774
Реализовал паттерн команда на сервере
Jul 6, 2017
719e233
Реализовал команду на клиенте и удалил лишнее
Jul 6, 2017
d24b67f
Доработал мелочи и удалил лишнее
Jul 8, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions OWNER.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Макеев Иван Алексеевич, СА-11
Binary file added example.db
Binary file not shown.
68 changes: 39 additions & 29 deletions src/main/java/track/lessons/lesson5generics/Cypher.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package track.lessons.lesson5generics;

import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.*;

import track.util.Util;

Expand All @@ -24,43 +20,60 @@ private Map<Character, Integer> readData(String data) {
ch += SYMBOL_DIST;
}
// Если это буква, то собираем частотную информацию



if (map.containsKey(ch)) {
map.put(ch, map.get(ch) + 1);
} else {
map.put(ch, 1);
}
}
}
return map;
}

/**
На вход приходит текст
1. Считываем readData() и получаем мапу {Символ -> Кол-во употреблений}
2. Далее нам нужно отсортировать пары ключ-значение по значению
(Называются{@code List<Map.Entry<Character, Integer>>})
(то есть по частоте употребления). Для этого можно создать список этих пар и отсортировать список.
У java.lang.List есть вспомогательный метод {@link List#sort(Comparator)}
Где Comparator - это логика сравнения объектов.

3. После того, как получен отсортированный список {@code List<Map.Entry<Character, Integer>>} нужно превратить его
обратно в Map для того, чтобы иметь быстрый доступ get().

/*
* На вход приходит текст
* 1. Считываем readData() и получаем мапу {Символ -> Кол-во употреблений}
* 2. Далее нам нужно отсортировать пары ключ-значение по значению
* (Называются{@code List<Map.Entry<Character, Integer>>})
* (то есть по частоте употребления). Для этого можно создать список этих пар и отсортировать список.
* У java.lang.List есть вспомогательный метод {@link List#sort(Comparator)}
* Где Comparator - это логика сравнения объектов.
* <p>
* 3. После того, как получен отсортированный список {@code List<Map.Entry<Character, Integer>>
* нужно превратить его
* обратно в Map для того, чтобы иметь быстрый доступ get().
*/
public Map<Character, Integer> buildHist(String data) {
Map<Character, Integer> map = readData(data);

return null;
List<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
LinkedHashMap<Character, Integer> hist = new LinkedHashMap<>();
for (Map.Entry<Character, Integer> entry : list) {
hist.put(entry.getKey(), entry.getValue());
}
System.out.println(hist);
return hist;
}

/**
* Заменяем символы зашифрованного текста по таблицам частот
*
* @param in - отсортированный по частоте алфавит для основного текста
* @param out - отсортированный по частоте алфавит для шифрованного текста
* @param in - отсортированный по частоте алфавит для основного текста
* @param out - отсортированный по частоте алфавит для шифрованного текста
* @param encrypted - зашифрованный текст
* @return расшифрованный текст
*/
public String merge(List<Character> in, List<Character> out, String encrypted) {
return null;
StringBuilder decrypted = new StringBuilder();
for (int i = 0; i < encrypted.length(); i++) {
int idx = out.indexOf(encrypted.charAt(i));
if (idx >= 0) {
decrypted.append(in.get(idx));
} else {
decrypted.append(" ");
}
}
return decrypted.toString();
}

public static void main(String[] args) {
Expand All @@ -79,7 +92,4 @@ public static void main(String[] args) {

}

}



}
1 change: 0 additions & 1 deletion src/main/java/track/lessons/lesson9/orm/UserDao.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package track.lessons.lesson9.orm;


import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package track.msgtest.messenger.mymessenger;

import java.util.Iterator;
import java.util.LinkedList;

public class BlockingQueue<E> {

private static final Object monitor = new Object();

private LinkedList<E> list = new LinkedList<>();

public synchronized void put(E elem) throws InterruptedException {
if (this.isEmpty()) {
notifyAll();
}
list.addLast(elem);
}

public synchronized E take() throws InterruptedException {
while (this.isEmpty()) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return list.removeFirst();
}

public boolean isEmpty() {
return list.size() == 0;
}

public int getSize() {
return list.size();
}

@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
Iterator<E> iterator = list.iterator();
while (iterator.hasNext()) {
stringBuilder.append(iterator.next());
}
return new String(stringBuilder);
}
}
56 changes: 56 additions & 0 deletions src/main/java/track/msgtest/messenger/mymessenger/MyClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package track.msgtest.messenger.mymessenger;

/**
* Created by ivan on 18.04.17.
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;

public class MyClient {
private static final int BUFSIZE = 10;

public static void main(String[] args) throws IOException {
if (args.length < 1 || args.length > 2) {
throw new IllegalArgumentException("Parameters: <Server> <word> [<Port>]");
}

String server = args[0];

int servPort = (args.length == 2) ? Integer.parseInt(args[1]) : 7;

Socket socket = new Socket(server, servPort);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

Thread outThread = new Thread() {
@Override
public void run() {
while (true) {
// Считываем сообщение с консоли
Scanner scanner = new Scanner(System.in);
byte[] data = scanner.nextLine().getBytes();
try {
out.write(data);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
};

outThread.start();

byte[] data = new byte[1024];
int bytesRcvd;

while ((bytesRcvd = in.read(data)) != -1) {
System.out.println("Received:" + new String(data).trim());
data = new byte[1024];
}
//socket.close();
}
}
57 changes: 57 additions & 0 deletions src/main/java/track/msgtest/messenger/mymessenger/MyServer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package track.msgtest.messenger.mymessenger;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.Iterator;
import java.util.LinkedList;

public class MyServer {
private static final int BUFSIZE = 100;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

не жмитесь, сделайте буфер 2048 чтобы не иметь проблем с размером сообщения

private static LinkedList<OutputStream> outs = new LinkedList<>();
private static BlockingQueue<byte[]> recieveBufs = new BlockingQueue<>();

public static void main(String[] args) throws IOException {
if (args.length != 1) {
throw new IllegalArgumentException("Parameter: <Port>");
}
LinkedList<Integer> list = new LinkedList<>();
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

название ни о чем


int servPort = Integer.parseInt(args[0]);

ServerSocket serverSocket = new ServerSocket(servPort);

while (true) {
Socket clntSock = serverSocket.accept();
outs.addLast(clntSock.getOutputStream());

Thread inThread = new Thread() {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Эти треды стоит где-то сохранять, чтобы потом можно было ими управлять.
Например список

@Override
public void run() {
try {
int recvMsgSize;
byte[] recieveBuf = new byte[BUFSIZE];

SocketAddress clientAddress = clntSock.getRemoteSocketAddress();
System.out.println("Handling client at " + clientAddress);

InputStream in = clntSock.getInputStream();

while ((recvMsgSize = in.read(recieveBuf)) != -1) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У вас работа с клиентом уже вынесена в поток. Вы же на каждое чтение заводите еще один новый поток на запись.

Либо оставьте запись в основном потоке либо заведите отдельный, но 1 и передавайте ткда данные через очередь

OutThread outThread = new OutThread(recvMsgSize, recieveBuf, outs);
outThread.start();
}
clntSock.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
};

inThread.start();
}
}
}
33 changes: 33 additions & 0 deletions src/main/java/track/msgtest/messenger/mymessenger/OutThread.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package track.msgtest.messenger.mymessenger;

import java.io.IOException;
import java.io.OutputStream;
import java.util.LinkedList;

/**
* Created by ivan on 22.04.17.
*/
public class OutThread extends Thread {

int recvMsgSize;
byte[] recieveBuf;
LinkedList<OutputStream> outs;

public OutThread( int recvMsgSize, byte[] recieveBuf, LinkedList<OutputStream> outs ) {
this.recvMsgSize = recvMsgSize;
this.recieveBuf = recieveBuf;
this.outs = outs;
}

@Override
public void run() {
try {
for (OutputStream out : outs) {
out.write(recieveBuf, 0, recvMsgSize );
out.flush();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}