private void connectToServerButton_Click(object sender, EventArgs e) { localipAddr = localIPHost.AddressList[localIPcomboBox.SelectedIndex]; remoteipAddr = IPAddress.Parse(serverIpTextBox.Text); MessageClass mess = new MessageClass(); mess.User = userNameTextBox.Text.Trim(); mess.Password = passTextBox.Text.Trim(); mess.Command = "Connect"; mess.Data = localipAddr.ToString(); MessageClass ansmessage = SendCommandToServer(mess); if (ansmessage.Command.Equals("Connect") == true) { userListListBox.Items.Add(ansmessage.Data); //Запускаем новый поток с новым сокетом, в котором будем дальше общаться с сервером } else { MessageBox.Show(ansmessage.Data, ansmessage.Command); } }
private void getUsersListButton_Click(object sender, EventArgs e) { MessageClass mess = new MessageClass(); mess.User = userNameTextBox.Text.Trim(); mess.Password = passTextBox.Text.Trim(); mess.Command = "GetUsersList"; mess.Data = localipAddr.ToString(); MessageClass ansmessage = SendCommandToServer(mess); if (ansmessage.Command.Equals("GetUsersList") == true) { userListListBox.Items.Add(ansmessage.Data); //Запускаем новый поток с новым сокетом, в котором будем дальше общаться с сервером } else { MessageBox.Show(ansmessage.Data, ansmessage.Command); } }
private void ControlCommandsFlow() { Socket handler = null; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11100); Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); MessageClass backmessage = new MessageClass(); try { sListener.Bind(ipEndPoint); sListener.Listen(10); this.Invoke(this.addLogDelegate, "Запускаем сервер"); while (true) { // Начинаем слушать соединения handler = sListener.Accept(); // Мы дождались клиента, пытающегося с нами соединиться byte[] bytes = new byte[65000]; int bytesRec = handler.Receive(bytes); if (bytesRec != 0) { MemoryStream mem_stream = new MemoryStream(bytes); BinaryFormatter formatter = new BinaryFormatter(); MessageClass message = (MessageClass)formatter.Deserialize(mem_stream); this.Invoke(this.addLogDelegate, "Подключился пользователь " + message.User.ToString()); this.Invoke(this.addLogDelegate, "С паролем " + message.Password.ToString()); this.Invoke(this.addLogDelegate, "С командой " + message.Command.ToString()); this.Invoke(this.addLogDelegate, "С адреса " + message.Data.ToString()); if (message.Command.Equals("Connect") == true) { int index = this.usersBindingSource.Find("username", message.User); if (index > -1) { if (skytalkDataSet.users.Rows[index]["password"].Equals(message.Password) == true) { backmessage.Command = "Connect"; UserTreadSettingsClass ut = new UserTreadSettingsClass(); ut.username = message.User; ut.ipadr = message.Data; ut.port = userslist.Count + 11101; userslist.Add(ut); backmessage.Data = ut.port.ToString(); //ThreadPool.QueueUserWorkItem(userthread, ut); //на каждого клента будет запускаться отдельный поток с отдельным новым сокетом на индивидуальном порту. //возможно я не прав, и есть другой путь. // номера портов 11101 - первый пользователь //11102 - второй пользователь и тд. // этот поток на порту 11100 только для подключения и авторизации новых клиентов //TODO пользователь может залогиниться несколько раз. Сделать проверку } else { backmessage.Command = "PasswordWrong"; backmessage.Data = "Плохой пароль"; this.Invoke(this.addLogDelegate, "Плохой пароль "); } } else { backmessage.Command = "ConnectWrong"; backmessage.Data = "Пользователь не найден"; this.Invoke(this.addLogDelegate, "Пользователь не найден "); } } if (message.Command.Equals("GetUsersList") == true) { backmessage.Command = "GetUsersList"; backmessage.Data = null; for (int i = 0; i < userslist.Count; i++) { backmessage.Data += userslist[i].username + ";"; } } if (message.Command.Equals("CallUser") == true) { backmessage.Data = userslist.Find(x => x.username.Equals(message.Data)).ipadr; } // logListBox.BeginInvoke((Action)delegate () { logListBox.Items.Add(message.User.ToString()); }); backmessage.User = message.User; backmessage.Password = ""; BinaryFormatter serializer = new BinaryFormatter(); MemoryStream ans_mem_stream = new MemoryStream(); serializer.Serialize(ans_mem_stream, backmessage); handler.Send(ans_mem_stream.GetBuffer()); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { handler.Shutdown(SocketShutdown.Both); handler.Close(); MessageBox.Show("Все пропало"); } }
private MessageClass SendCommandToServer(MessageClass msgToServer) { MessageClass msgFromSrerver = null; // Буфер для входящих данных byte[] bytes = new byte[65000]; // Соединяемся с удаленным устройством // Устанавливаем удаленную точку для сокета remoteipEndPoint = new IPEndPoint(remoteipAddr, 11100); try { //Создаем сокет Socket socketsender = new Socket(remoteipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Соединяем сокет с удаленной точкой socketsender.Connect(remoteipEndPoint); // MessageClass mess = new MessageClass(); // mess.User = userNameTextBox.Text.Trim(); // mess.Password = passTextBox.Text.Trim(); // mess.Command = "Connect"; // mess.Data = localipAddr.ToString(); BinaryFormatter serializer = new BinaryFormatter(); MemoryStream mem_stream = new MemoryStream(); serializer.Serialize(mem_stream, msgToServer); // Отправляем данные через сокет int bytesSent = socketsender.Send(mem_stream.GetBuffer()); Thread.Sleep(500); // Получаем ответ от сервера int bytesRec = socketsender.Receive(bytes); //MessageClass ansmessage = null; if (bytesRec > 0) { MemoryStream ans_mem_stream = new MemoryStream(bytes); BinaryFormatter formatter = new BinaryFormatter(); msgFromSrerver = (MessageClass)formatter.Deserialize(ans_mem_stream); } // if (ansmessage.Command.Equals("Connect") == true) // { // userListListBox.Items.Add(ansmessage.Data); //Запускаем новый поток с новым сокетом, в котором будем дальше общаться с сервером // } // else // { // MessageBox.Show(ansmessage.Data, ansmessage.Command); // } // Освобождаем сокет socketsender.Shutdown(SocketShutdown.Both); socketsender.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } return(msgFromSrerver); }