Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Программный код на с # в VIsualstudia.Содержание книги
Поиск на нашем сайте //-------------------------------------------------------// ChatController.cs //-------------------------------------------------------// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace serverChat { public static class ChatController { private const int _maxMessage = 100; public static List<message> Chat = new List<message>(); public struct message { public string userName; public string data; public message(string name, string msg) { userName = name; data = msg; } } public static void AddMessage(string userName, string msg) { try { if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(msg)) return; int countMessages = Chat.Count; if (countMessages > _maxMessage) ClearChat(); message newMessage = new message(userName, msg); Chat.Add(newMessage); Console.WriteLine("{0}: {1}", userName, msg); Server.UpdateAllChats(); } catch (Exception exp) { Console.WriteLine("Ошибка с доставкой: {0}.", exp.Message); } } public static void AddLsMessage(string userName, string msg, string au) { try { if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(msg) || string.IsNullOrEmpty(au)) return; int countMessages = Chat.Count; if (countMessages > _maxMessage) ClearChat(); message newMessage = new message(userName, msg); Console.WriteLine("{0}->{2}: {1}", userName, msg, au); Server.UpdateAllChatsLS(userName, msg, au); } catch (Exception exp) { Console.WriteLine("Ошибка с доставкой: {0}.", exp.Message); } } public static void ClearChat() { Chat.Clear(); } public static string GetChat() { try { string data = "#updatechat&"; data += String.Format("{0}~{1}", Chat[Chat.Count - 1].userName, Chat[Chat.Count - 1].data); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с отправкой: {0}", exp.Message); return string.Empty; } } public static string GetChatLS(string userName, string msg, string au) { try { string data = "#lss&"; data += String.Format("{0}~{1}|{2}", msg, userName, au); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с отправкой: {0}", exp.Message); return string.Empty; } } public static string GetSysMessage(string g) { try { string data = "#sys&"; data += String.Format(g); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с обновлением чата: {0}", exp.Message); return string.Empty; } } public static string GetPeople() { try { string data = "#people&"; int countMessages = Server.Clients.Count; if (countMessages <= 0) return string.Empty; for (int i = 0; i < countMessages; i++) { data += String.Format("{0}|", Server.Clients[i].UserName); } return data; } catch (Exception exp) { Console.WriteLine("Ошибка в передаче информации о людях: {0}", exp.Message); return string.Empty; } } } } //-------------------------------------------------------// Client.cs //-------------------------------------------------------// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace serverChat { public static class ChatController { private const int _maxMessage = 100; public static List<message> Chat = new List<message>(); public struct message { public string userName; public string data; public message(string name, string msg) { userName = name; data = msg; } } public static void AddMessage(string userName, string msg) { try { if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(msg)) return; int countMessages = Chat.Count; if (countMessages > _maxMessage) ClearChat(); message newMessage = new message(userName, msg); Chat.Add(newMessage); Console.WriteLine("{0}: {1}", userName, msg); Server.UpdateAllChats(); } catch (Exception exp) { Console.WriteLine("Ошибка с доставкой: {0}.", exp.Message); } } public static void AddLsMessage(string userName, string msg, string au) { try { if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(msg) || string.IsNullOrEmpty(au)) return; int countMessages = Chat.Count; if (countMessages > _maxMessage) ClearChat(); message newMessage = new message(userName, msg); Console.WriteLine("{0}->{2}: {1}", userName, msg, au); Server.UpdateAllChatsLS(userName, msg, au); } catch (Exception exp) { Console.WriteLine("Ошибка с доставкой: {0}.", exp.Message); } } public static void ClearChat() { Chat.Clear(); } public static string GetChat() { try { string data = "#updatechat&"; data += String.Format("{0}~{1}", Chat[Chat.Count - 1].userName, Chat[Chat.Count - 1].data); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с отправкой: {0}", exp.Message); return string.Empty; } } public static string GetChatLS(string userName, string msg, string au) { try { string data = "#lss&"; data += String.Format("{0}~{1}|{2}", msg, userName, au); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с отправкой: {0}", exp.Message); return string.Empty; } } public static string GetSysMessage(string g) { try { string data = "#sys&"; data += String.Format(g); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с обновлением чата: {0}", exp.Message); return string.Empty; } } public static string GetPeople() { try { string data = "#people&"; int countMessages = Server.Clients.Count; if (countMessages <= 0) return string.Empty; for (int i = 0; i < countMessages; i++) { data += String.Format("{0}|", Server.Clients[i].UserName); } return data; } catch (Exception exp) { Console.WriteLine("Ошибка в передаче информации о людях: {0}", exp.Message); return string.Empty; } }}} //-------------------------------------------------------// Program.cs //-------------------------------------------------------// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.Net.Sockets; using System.Threading; namespace serverChat { class Program { private const string _serverHost = "localhost"; private const int _serverPort = 9933; private static Thread _serverThread; static void Main(string[] args) { _serverThread = new Thread(startServer); _serverThread.IsBackground = true; _serverThread.Start(); while (true) handlerCommands(Console.ReadLine()); } private static void handlerCommands(string cmd) { cmd = cmd.ToLower(); if (cmd.Contains("/getusers")) { int countUsers = Server.Clients.Count; for (int i = 0; i < countUsers; i++) { Console.WriteLine("[{0}]: {1}", i, Server.Clients[i].UserName); } } else { }} private static void startServer() { IPHostEntry ipHost = Dns.GetHostEntry(_serverHost); IPAddress ipAddress = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, _serverPort); Socket socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.Bind(ipEndPoint); socket.Listen(1000); Console.WriteLine("Сервер запущен по IP: {0}.",ipEndPoint); while(true) { try { Socket user = socket.Accept(); Server.NewClient(user); } catch (Exception exp) { Console.WriteLine("Ошибка: {0}",exp.Message); } }}}} //-------------------------------------------------------// Server.cs //-------------------------------------------------------//
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; namespace serverChat { public static class Server { public static List<Client> Clients = new List<Client>(); public static void NewClient(Socket handle) { try { Client newClient = new Client(handle); Clients.Add(newClient); Console.WriteLine("Пользователь {0} присоединился", handle.RemoteEndPoint); int countUsers = Clients.Count; UpdateAllUsers(); } catch (Exception exp) { Console.WriteLine("Ошибка с подключением нового клиента: {0}.",exp.Message); } } public static void EndClient(Client client) { try { client.End(); Clients.Remove(client); Console.WriteLine("Пользователь {0} отсоединился.", client.UserName); int countUsers = Clients.Count; for (int i = 0; i < countUsers; i++) { Clients[i].PeopleChat(); } } catch (Exception exp) { Console.WriteLine("Ошибка с отключением: {0}.",exp.Message); } } public static void UpdateAllChats() { try { int countUsers = Clients.Count; for (int i = 0; i < countUsers; i++) { Clients[i].UpdateChat(); } } catch (Exception exp) { Console.WriteLine("Ошибка с обновлением чатов: {0}.", exp.Message); } } public static void UpdateAllChatsLS(string userName, string msg, string au) { try { int countUsers = Clients.Count; for (int i = 0; i < countUsers; i++) { Clients[i].UpdateChatLS(userName, msg, au); } } catch (Exception exp) { Console.WriteLine("Ошибка с обновлением чатов (ЛС): {0}.", exp.Message); } } public static void UpdateAllUsers() { try { int countUsers = Clients.Count; for (int i = 0; i < countUsers; i++) { Clients[i].PeopleChat(); }} catch (Exception exp) { Console.WriteLine("Ошибка с обновлением списка: {0}.", exp.Message); } }}} //-------------------------------------------------------// Клиенская часть //-------------------------------------------------------// using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading; using System.Data.SqlClient; using MySql.Data.MySqlClient; namespace chatClient { public partial class chatForm: Form { public class LS { public string chatls { get; set; } } List<LS> mesls = new List<LS>(); private delegate void printer(string data); private delegate void cleaner(); printer Printer; cleaner Cleaner; private Socket _serverSocket; private Thread _clientThread; private const string _serverHost = "localhost"; private const int _serverPort = 9933; int countls = 0; int sells = 0; string obh = ""; string[] ls = new string[999]; public chatForm() { InitializeComponent(); } private void listner() { while (_serverSocket.Connected) { byte[] buffer = new byte[8196]; int bytesRec = _serverSocket.Receive(buffer); string data = Encoding.UTF8.GetString(buffer, 0, bytesRec); if (data.Contains("#updatechat")) { UpdateChat(data); continue; } if (data.Contains("#sys")) { Sys(data); continue; } if (data.Contains("#people")) { People(data); continue; } if (data.Contains("#lss")) { Ls(data); continue; } } } private void connect() { try { IPHostEntry ipHost = Dns.GetHostEntry(_serverHost); IPAddress ipAddress = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, _serverPort); _serverSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); _serverSocket.Connect(ipEndPoint); } catch { print("Сервер недоступен!"); } } private void clearChat() { if (this.InvokeRequired) { this.Invoke(Cleaner); return; } chatBox.Clear(); } private void UpdateChat(string data) { string messages = data.Split('&')[1]; if (label5.Text == "Общий чат") { try { if (string.IsNullOrEmpty(messages)) { } print(String.Format("{0}: {1}", messages.Split('~')[0], messages.Split('~')[1])); } catch { } } obh += String.Format("{0}: {1}|", messages.Split('~')[0], messages.Split('~')[1]); } private void Ls(string data) { // #lss&mess~userme|useran if ((userName.Text == data.Split('~')[1].Split('|')[0]) || ((userName.Text == data.Split('|')[1]))) { if ((label5.Text == data.Split('~')[1].Split('|')[0]) || (label5.Text == data.Split('|')[1])) { try { if (string.IsNullOrEmpty(data.Split('&')[1].Split('~')[0])) { } print(String.Format("{0}: {1}", data.Split('~')[1].Split('|')[0], data.Split('&')[1].Split('~')[0])); } catch { } } if ((label5.Text!= data.Split('~')[1].Split('|')[0]) && (label5.Text!= data.Split('|')[1])) { print(String.Format("У вас новое личное сообщение от: {0}", data.Split('~')[1].Split('|')[0])); }
int ki = 0; foreach (LS p in mesls) { if (p.chatls.Split('&')[0] == data.Split('|')[1]) { ki = 1; p.chatls += String.Format("{0}: {1}|", data.Split('~')[1].Split('|')[0], data.Split('&')[1].Split('~')[0]); } } if (ki == 0) { countls++; mesls.Add(new LS() { chatls = data.Split('~')[1].Split('|')[0] + "&" + String.Format("{0}: {1}|", data.Split('~')[1].Split('|')[0], data.Split('&')[1].Split('~')[0]) }); } } } private void Sys(string data) { string messages = data.Split('&')[1]; try { if (string.IsNullOrEmpty(messages)) { } print(String.Format("{0}", messages.Split('|')[0])); } catch { } } private void People(string data) { System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; string[] peoples = data.Split('&')[1].Split('|'); listBox1.Items.Clear(); listBox1.Items.Add("Общий чат"); int countpeoples = peoples.Length; if (countpeoples <= 0) return; for (int i = 0; i < countpeoples; i++) { try { if (string.IsNullOrEmpty(peoples[i])) continue; if ((peoples[i]!= "#people") && (peoples[i]!= userName.Text)) listBox1.Items.Add(String.Format("{0}", peoples[i])); } catch { continue; } } } private void send(string data) { try { byte[] buffer = Encoding.UTF8.GetBytes(data); int bytesSent = _serverSocket.Send(buffer); } catch { print("Связь с сервером прервалась...");} }
private void print(string msg) { if (this.InvokeRequired) { this.Invoke(Printer, msg); return; } if (chatBox.Text.Length == 0) chatBox.AppendText(msg); else chatBox.AppendText(Environment.NewLine + msg); } private void enterChat_Click(object sender, EventArgs e) { string Connect = "server=localhost;uid=root;password=--123--123--fh;persistsecurityinfo=True;database=work"; string CommandText = "SELECT Count(*) FROM account WHERE name = '" + userName.Text + "' AND pass = '" + textBox1.Text + "' LIMIT 1"; MySqlConnection myConnection = new MySqlConnection(Connect); MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection); myConnection.Open(); myCommand.ExecuteNonQuery(); MySqlDataAdapter dataAdapter = new MySqlDataAdapter(myCommand); DataTable dt = new DataTable(); dataAdapter.Fill(dt); if (dt.Rows[0][0].ToString() == "1") { try { string Name = userName.Text; if (string.IsNullOrEmpty(Name)) { } else { Printer = new printer(print); Cleaner = new cleaner(clearChat); connect(); _clientThread = new Thread(listner); _clientThread.IsBackground = true; _clientThread.Start(); send("#setname&" + Name); chatBox.Enabled = true; chat_msg.Enabled = true; chat_send.Enabled = true; userName.Enabled = false; listBox1.Enabled = true; textBox1.Enabled = false; label4.Text = "Вы подключены: " + userName.Text; userName.Visible = false; textBox1.Visible = false; label5.Visible = true; gui_userName.Visible = false; label1.Visible = false; enterChat.Enabled = false; enterChat.Visible = false; button1.Enabled = false; button1.Visible = false; label2.Visible = false; listBox1.Height = 355; } } catch { MessageBox.Show("Ошибка при подключении! Возможно, сервер не отвечает"); } } else { label2.Visible = true; } myConnection.Close(); } private void chat_send_Click(object sender, EventArgs e) { sendMessage(); } private void sendMessage() { if (!chat_msg.Text.Contains("#") &&!chat_msg.Text.Contains("|") &&!chat_msg.Text.Contains("~") && (label5.Text == "Общий чат")) try { string data = chat_msg.Text; if (string.IsNullOrEmpty(data)) { } else { send("#newmsg&" + data); chat_msg.Text = string.Empty; } } catch { MessageBox.Show("Ошибка при отправке сообщения!"); } else if (!chat_msg.Text.Contains("#") &&!chat_msg.Text.Contains("|") &&!chat_msg.Text.Contains("~")) try { string data = chat_msg.Text; if (string.IsNullOrEmpty(data)) { } else { send("#newls&" + data + "~" + userName.Text + "|" + label5.Text); chat_msg.Text = string.Empty; } } catch { MessageBox.Show("Ошибка при отправке сообщения!"); } } private void chatBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) sendMessage(); } private void chat_msg_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) sendMessage(); } private void chatForm_Load(object sender, EventArgs e) { } private void userName_TextChanged(object sender, EventArgs e) { } private void textBox1_TextChanged(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { string Connect = "server=localhost;uid=root;password=--123--123--fh;persistsecurityinfo=True;database=work"; string CommandText = "SELECT Count(*) FROM account WHERE name = '" + userName.Text + "' LIMIT 1"; MySqlConnection myConnection = new MySqlConnection(Connect); MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection); myConnection.Open(); myCommand.ExecuteNonQuery(); MySqlDataAdapter dataAdapter = new MySqlDataAdapter(myCommand); DataTable dt = new DataTable(); dataAdapter.Fill(dt); if (dt.Rows[0][0].ToString() == "0") { CommandText = "INSERT INTO `work`.`account` (`name`, `pass`) VALUES ('" + userName.Text + "', '" + textBox1.Text + "');"; myCommand = new MySqlCommand(CommandText, myConnection); myCommand.ExecuteNonQuery(); } myConnection.Close(); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (Convert.ToString(listBox1.SelectedItem) == "Общий чат") { label5.Text = "Общий чат"; clearChat(); string[] messages = obh.Split('|'); int countMessages = obh.Length; if (countMessages <= 0) return; for (int i = 0; i < countMessages; i++) { try { if (string.IsNullOrEmpty(messages[i])) continue; print(String.Format(messages[i])); } catch { continue; } } } else { int k = 0; foreach (LS p in mesls) { if (p.chatls.Split('&')[0] == Convert.ToString(listBox1.SelectedItem)) { label5.Text = Convert.ToString(listBox1.SelectedItem); k = 1; clearChat(); string[] messages = p.chatls.Split('&')[1].Split('|'); int countMessages = p.chatls.Length; if (countMessages <= 0) return; for (int l = 0; l < countMessages; l++) { try { if (string.IsNullOrEmpty(messages[l])) continue; print(String.Format(messages[l])); } catch { continue; } } } } if (k == 0) { label5.Text = Convert.ToString(listBox1.SelectedItem); clearChat(); mesls.Add(new LS() { chatls = Convert.ToString(listBox1.SelectedItem) + "&" }); } }}}} ЗАКЛЮЧЕНИЕ Изучение способов виртуальной коммуникации показало, что наиболее востребованными в современном обществе являются формы и способы синхронной коммуникации. Одним из средств такой коммуникации являются мессенджеры, т.е. системы мгновенного обмена сообщениями, главной особенностью которых является общение в режиме реального времени, практически мгновенная передача сообщения и получение ответа на него. В то же время очевидно, что популярные мессенджеры, такие как WhatsApp, Viber, Telegram, Facebook Messenger, Skype и другие, разработанные, прежде всего, для повседневного общения и развлечений, имеют, наряду с множеством достоинств (разнообразие функций, возможность пользоваться списком контактов, шифрование сообщений и т.п.) и серьезные недостатки с точки зрения использования их в профессиональном виртуальном общении в рамках организации. Таким недостатками являются, с одной стороны, переполненность мессенджеров разнообразным контентом, который носит развлекательный характер и, с нашей точки зрения, отвлекает от рабочей атмосферы и обстановки, а с другой – отсутствие полной гарантии безопасности корпоративной информации, поскольку переписка хранится на серверах конкретного приложения. Написанный нами программный продукт реализует такие задачи, как: - отсутствие развлекательных функций и контента, что позволяет работнику полностью сосредоточится на процессе работы; - обеспечение безопасности корпоративной информации за счет хранения ее на сервере организации, к которому нет доступа посторонним лицам. - простота регистрации и пользования мессенджером, что актуально в условиях разного уровня пользовательских навыков сотрудников организации. Таким образом данный мессенджер можно использовать в организациях для выполнения быстрой связи сотрудников между собой, без отвлечения на посторонние ресурсы.
Доработка данного мессенджера в дальнейшем может идти по таким направлениям, как: возможность пересылать документы для ознакомления; разработка мобильного приложения для использования на смартфонах, возможность использовать приложение не только в стенах организации, но из других мест в случае выезда в командировку.
СПИСОК ЛИТЕРАТУРЫ 1. Апетян М. К. Особенности виртуальной коммуникации // Молодой ученый. — 2015. — №3. — С. 939-941. — URL https://moluch.ru/archive/83/15418/ (дата обращения: 17.05.2019). 2. Официальный сайт Facebook Messenger: https://www.messenger.com/ (дата обращения: 17.05.2019). 3. Официальный сайт Microsoft (Бесплатная версия Visual Studio): https://visualstudio.microsoft.com/ru/free-developer-offers/ (дата обращения: 17.05.2019). 4. Официальный сайт Skype: https://www.skype.com/ru/ (дата обращения: 17.05.2019). 5. Официальный сайт Viber: https://www.viber.com/ru/ (дата обращения: 17.05.2019). 6. Официальный сайт WhatsApp: https://www.whatsapp.com/?l=ru (дата обращения: 17.05.2019). 7. Официальный сайт Телеграм: https://tlgrm.ru/(дата обращения: 17.05.2019). 8. Руководство по языку C# /Официальный сайт Microsoft: https://docs.microsoft.com/ru-ru/dotnet/csharp/ (дата обращения: 17.05.2019). 9. Система мгновенного обмена сообщениями /https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BC%D0%B3%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8 (дата обращения: 17.05.2019). [1] Апетян М. К. Особенности виртуальной коммуникации // Молодой ученый. — 2015. — №3. — С. 939-941. — URL https://moluch.ru/archive/83/15418/ (дата обращения: 17.05.2019). [2] Там же. [3] Система мгновенного обмена сообщениями /https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BC%D0%B3%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8 (дата обращения: 17.05.2019). [4] Официальный сайт WhatsApp: https://www.whatsapp.com/?l=ru (дата обращения: 17.05.2019). [5] Официальный сайт Viber: https://www.viber.com/ru/ (дата обращения: 17.05.2019). [6] Официальный сайт Телеграм: https://tlgrm.ru/(дата обращения: 17.05.2019). [7] Официальный сайт Facebook Messenger: https://www.messenger.com/ (дата обращения: 17.05.2019). [8] Официальный сайт Skype: https://www.skype.com/ru/ (дата обращения: 17.05.2019).
|
||
|
Последнее изменение этой страницы: 2020-11-28; просмотров: 183; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.196 (0.007 с.) |