Антиплагиат (1231616), страница 8
Текст из файла (страница 8)
Вместо него отображ ается диалоговое облако, котороеприглашает клиента предприятия открыть чат с оператором.После наж атия на диалоговое облако, оно скрывается и вместо него появляется модуль. Web-модуль мож но скрыть наж ав насоответствующ ую клавишу слева от чата.При загрузке страниц ы, модуль автоматически подключается к серверу по технологии WebSocket. Клиент з��писывается в базусервера, а от сервера приходят данные об имени консультанта и его сообщ ения.Реализац ия проводится на языке JavaScript и представлена ниж е:var socket;window.onload = function() {socket = new WebSocket("ws://192.168.1.141:5555");socket.onmessage = get_massage;};function get_massage(event){var str = event.data;if(str.substring(0,15)=="&NameConsulter&"){document.getElementyId('cons_name').innerHTML=str.substring(16);} else if(str.substring(0,15)=="&PostConsulter&"){document.getElementyId('cons_post').innerHTML=str.substring(16);} else{var outiv = document.createElement('div');outiv.className = 'from';outiv.innerHTML = "<div></div><div>"+ str+"</div>";document.getElementyId('dialog').appendChild(outiv);}};function send_massage(){var str = document.getElementyId('massageToSend').value;if(str!=""){socket.send(str);var outiv = document.createElement('div');outiv.className = 'to';outiv.innerHTML = "<div></div><div>"+str+"</div>";document.getElementyId('dialog').appendChild(outiv);}document.getElementyId('massageToSend').value="&quo t;;};Функц ии выполняют следующ ие действия:– socket = new WebSocket("ws://192.168.1.141:5555").
Объявление переменной socket и создание подключения с сервером;– socket.onmessage = get_massage. Функц ия в первую очередь обновляет информац ию об имени консультанта и его долж ности, атакж е отображ ает поступление сообщ ений со стороны сервера;– function send_massage(). Данная функц ия позволяет отправить произвольное сообщ ение серверу. Сообщ ение от пользователяпоступает на сервер, а блок с перепиской обновляется. Такж е в э том блоке производится проверка на пустое сообщ ение, если такоеприсутствует, то данные не отправляются;4.3 Реализац ия сервера прилож енияКлиентское прилож ение и модуль для сайта не могут работать без ядра – серверного прилож ения.Серверный модуль онлайн-консультанта запускается либо на web-сервере предприятия, который имеет статический IP адрес,который выделяется провайдером в глобальной сети интернет, либо на любом компьютере с предварительной переадресац ией наего IP.Серверная программа, как и клиентская, имеет разделение графического пользовательского интерфейса и основного потокавыполнения и базу данных.
Порядок работы программы следующ ий:– запускается графическая оболочка программы (рисунок 21), которая представлена в виде значка в системном лотке операц ионнойсистемы;– происходит подключение к базе данных SQLite. В ней храниться информац ия об имени и паролях пользователей, их роли, а такж епереписка меж ду пользователями и клиентами и не отправленные сообщ ения;– создание сервера сокетного подключения с заранее предустановленным статическим IP адресом и номером порта;http://dvgups.antiplagiat.ru/ReportPage.aspx?docId=427.24088421&repNumb=118/2320.06.2016Антиплагиат– бесконечное ож идание подключения пользователей.Рисунок 21 – Иконка активного сервераБаза данных состоит из трех таблиц :– таблиц а «users» (рисунок 22), содерж ащ ая I, идентификатор, ФИО, долж ность и пароль сотрудника компании, его права доступа;Рисунок 22 – Таблиц а «users»– таблиц а «UsersMassages» (рисунок 23), содерж ащ ая чат сотрудников. Данная таблиц а содерж ит только дошедшие до пунктаназначения сообщ ения;Рисунок 23 – Таблиц а «UsersMassages»– таблиц а «NotSend» (рисунок 24), содерж ащ ая недошедшие до своих адресатов сообщ ения, вследствие таких причин, какотсутствия в сети пользователя или обрыв соединения;Рисунок 24 – Таблиц а «NotSend»– таблиц а «ClientsMassages» (рисунок 25), содерж ащ ая чат операторов и клиентов;Рисунок 25 – Таблиц а «ClientsMassages»Сервер распознают два вида пользователей: клиентов сайта и пользовательские прилож ения.
Это происходит благодаря тому, чтопри совершении соединения по технологии WebSocket, сервер получает от клиента набор заголовков, которые отсутствуют во времяподключения прилож ения при помощ и сокетов. Код программы мож но увидеть ниж е:private static int readInputHeaders(Socket socket) throwsThrowable {ufferedReader br = new ufferedReader(newInputStreamReader(socket.getInputStream()));int type = 0;while(true) {s = br.readLine();System.out.println(s);if(s.contains("Sec-WebSocket-Key")){type=2;s=s.split(":")[1].substring(1)+"258EAFA5-E914-47A-95CAC5A0C8511";Messageigest code = Messageigest.getInstance("sha");code.update(s.getytes());byte[] digest = code.digest();s=ase64.encode(digest);String response="HTTP/1.1 101 Switching Protocols\r\n" +"Upgrade: websocket\r\n"+"Connection: Upgrade\r\n"+"Sec-WebSocket-Accept: "+s+"\r\n\r\n";[43]socket.getOutputStream().write(response.getytes());WebSocketConnection WebSocket=newWebSocketConnection(socket);} else if(s.contains("$desktopClient$"))type=1;if(s == null || s.trim().length() == 0) {break;}}return type;}Все соединения заносятся в два списка клиентов сервера соответственно их типу, кроме пользовательских прилож ений.
Онипопадают в массив, только после успешной проц едуры авторизац ии на сервере.Авторизац ия пользователя происходит следующ им образом:– на сервер от клиента приходит ключевое слово с кодом «$toServer$ 100», после которого приходит имя пользователя и пароль.При помощ и SQL запроса совершается выборка данных по полям имя/пароль. Если результат запроса не пустой, то сервер отправляетклиенту информац ию о том, что авторизац ия прошла успешно (код «$accept$»), и добавляет в массив клиентов, иначе отправляетсясообщ ение об отклонении запроса на авторизац ию (код «$notaccept$»). Код проц едуры авторизац ии представлен ниж е:try{String input;while ((input = in.readLine())!=null) {if(input.contains("$toServer$")){switch (Integer.parseInt(input.split(" ")[1])){case 100: {sendAutorizeAnswer(in.readLine(),in.readLine());break;}}} else {System.out.println(":"+input);}}System.out.print("Closer\n");http://dvgups.antiplagiat.ru/ReportPage.aspx?docId=427.24088421&repNumb=119/2320.06.2016Антиплагиатin.close();} catch(Exception e){System.out.println("init error get1: "+e);};public void sendAutorizeAnswer(String log, String pass) throwsClassNotFoundException, SQLException{int id;if((id=db.autorisation(log, pass))!=-1){out.println("$accept$");out.println("I="+id);accept.setI(id);sendNewMassages();} elseout.println("$notaccept$");};public int autorisation(String log, String pass) throwsClassNotFoundException, SQLException {resSet=statmt.executeQuery("SELECT * FROM 'users' WHEREname='"+log+"' ANpassword='"+pass+"';");if(resSet.next())return Integer.parseInt(resSet.getString("id"));else return -1;};Основная задача, которую выполняет сервер – переадресац ия поступающ их сообщ ений меж ду клиентами и хранение их в базеданных.
Помимо э того сервер такж е по запросу клиентов отправляет весь список доступных пользователей, и ранее отправленныедиалоги.Для решения задачи переадресац ии выбран достаточно простой механизм, а именно:– сервер последовательно считывает всю информац ию, которая к нему поступает, и при получении ключевого слова «$toI$»считывает IP адрес пользователя, которому предназначено сообщ ение;– считываются все строки сообщ ения до тех пор, пока не встретится завершающ ее ключевое слово «$end$»;– происходит поиск в массиве подключенных пользователей необходимого клиента;– при нахож дении такого, сервер отправляет данному пользователю ключевое слово «$fromI$» и I номер клиента, от которогопереадресовано сообщ ение. Такж е отправляется весь текст сообщ ения и ключевое слово «$end$»;– если отсутствует в списке такой пользователь, то сообщ ение заносится в базу данных в таблиц у неотправленных сообщ ений.Код данного проц есса представлен ниж е:try{String input;while ((input = in.readLine())!=null) {if(input.contains("$toServer$")){switch (Integer.parseInt(input.split(" ")[1])){case 200:{sendClientsInfo();break;}}} else if (input.contains("$toI$")){Iterator<newAccept> itr = clients.iterator();newAccept to = null;int where=Integer.parseInt(input.split(" ")[1]);String what = "";while (!(input = in.readLine()).equals("$end$")) {what+=input+"\r\n";}what=what.substring(0, what.length()-2);boolean isSend=false;ate currentate = new ate();while (itr.hasNext()) {to=itr.next();if(where==to.getI()){isSend=true;PrintWriter out1=new PrintWriter(to.client.getOutputStream(),true);out1.println("$fromI$");out1.println(accept.idClient);out1.println(what);out1.println("$end$");System.out.println("to "+accept.idClient+" ("+to.getIP()+"):"+what);}http://dvgups.antiplagiat.ru/ReportPage.aspx?docId=427.24088421&repNumb=120/2320.06.2016Антиплагиатif(isSend)db.saveMassage("UsersMassages",what,accept.idClient, where, currentate.getTime());elsedb.saveMassage("NotSend",what, accept.idClient,where, currentate.getTime());}} else {System.out.println(":"+input); }}System.out.print("Closer\n");in.close();} catch(Exception e){System.out.println("init error get1: "+e);}}При авторизац ии нового пользователя на сервере вызывается функц ия, которая считывает из базы данных все сообщ ения, которыепредназначаются э тому пользователю и оправляются ему.
Отправленные сообщ ения удаляются из таблиц ы неотправленных изаписываются в таблиц у доставленных сообщ ений. Код программы представлен ниж е:public void sendNewMassages() throws ClassNotFoundException,SQLException{Map<String,String> Is=db.getMassage("NotSend",accept.idClient);Set set = Is.entrySet();Iterator i = set.iterator();while(i.hasNext()){Map.Entry me = (Map.Entry)i.next();out.println("$fromI$");out.println(me.getKey().toString().split(":")[1]);out.println(me.getValue());out.println("$end$");db.deleteMassage("NotSend",me.getKey().toString().split(":")[2]);db.saveMassage("UsersMassages",me.getValue().toString(),Integer.parseInt(me.getKey().toString().split(":")[1]),accept.idClient,Long.parseLong(me.getKey().toString().split(":")[0]));}};public Map<String,String> getMassage(String table, int id)throws ClassNotFoundException, SQLException {resSet=statmt.executeQuery("SELECT * FROM "+table+" WHERE ToUser="+id+";");Map<String,String> Is=new HashMap<String,String>();while(resSet.next()){String head=resSet.getString("Time")+":"+resSet.getString("FromUser")+":"+resSet.getString("I");Is.put(head, resSet.getString("Massage"));}return Is;}Таким образом, диалоги меж ду пользователями всегда хранятся в базе данных, доступ которой есть только у серверного прилож ения.Такж е исключена утеря сообщ ений ввиду отсутствия пользователя в сети.Важ ной особенностью серверного модуля является распределение клиентов компании меж ду операторами.