Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532

[Манул+Исходник]Клиент-сервер

09.06.2013, 17:09. Показов 4398. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.... Я хочу поднять извечную тему... Клиент-Сервер. Многие хотят создавать проекты маленькие и большие и что бы в них модно было авторизоваться, регистрироваться и т д. Я хочу создать гайд по моей идеи совмещения языка C# и PHP. C# - это всё для программиста ПО под ОС. А php это самый гибкий и самый удобный язык так как каждая страница это своя собственная программа которая может вызвать во внутрь себя другую или быть сразу 5 разными вариантами программы.

Что нам потребуется для сервера:
  1. Хостинг с php и mysql(Как вариант - Бесплатный хостнг zerver.ru)
  2. Движок - "php server" Который предоставлен в данной теме.


Как это работает:
Всё очень просто. В PHP сначало обрабатывается код, а уже после вам выдается сгенерированная страничка. В нашем же случае мы будем использовать адрес обращения как команду, тоесть мы обращаемся к сайту с опрелелённым адресом и получаем мгновенно ответ. А мы когда обращались.... Мы обращались уже за ответом - Поэтому ответ который выдаёт сайт мы уже используем в программе как угодно.



Немного о сервере:
Это php сайт без оформления. Все запросы страниц(Какую бы страницу не вызывали вы, если её не сущиствует по абсолютному пути в корне сайта.) будут братся из страници в inc/page/server/center по принцепу....
Code
1
2
DOMEN.RU/reg = inc/page/server/center/reg
DOMEN.RU/auth/soj324/qwerj3pj = inc/page/server/center/auth
Тоесть то название которое после первого слеша идёт - Это адрес к файлу с скриптом. Все последующие слеши с текстами - это переменные внутри $get[1] $get[2] и т д. Тоесть если мы будем авторизовать пользователя то мы можем поступить так... Написать php скрит в файл auth и положить в папку с скриптами(inc/page/server/center) Дальше мы делаем обращение за ответом к странице DOMEN.RU/auth/LOGIN/PASSWOD Страница внутри обработает полученные логин и пароль и выдаст вам то зачем вы обращались к странице - ОТВЕТ...

В данном случае страница ответа генерируется от 0.0001 до 0.2 В зависимости от сложности скрипта.



Как же всё происходит в клиенте:
Перейдём к обязательному классу - Messages
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public class Messages
    {
 
        public static Dictionary<string, string> kod_list = new Dictionary<string, string>()
        {
              {"error", "Неизвестная ошибка."},
              {"login-detect", "Такой логин существует, попробуйте другой или высстановите этот если вы являетесь его владельцем."},
              {"email-detect", "Такой email зарегестрирован, укажите другой пожалуста."},
              {"ok", "Вы успешно зарегестрированы."}
 
 
        };
        public static string GetText(string kods)
        {
            if (kod_list.ContainsKey(kods)) return kod_list[kods];
            return kod_list["error"];
        }
   }
Здесь происходит подбор текста к коду который мы получили в ответ от сайта.
Если мы обратились с регистрацией и страничка содержит код login-detect то при обращении к данному классу
А именно к GetText(KOD); мы получим "Такой логин существует, попробуйте другой или восстановите этот если вы являетесь его владельцем." Здесь не чего сложного. Просто пополняем базу ответов сами в зависимости что вам может ответить страничка.

Теперь класс Server:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class Server
    {
        public static string server = "http://msoma.ts6.ru/";
        public static string SH = "/";
        public static string Reg(string login, string password, string password2, string email)
        {
            if (password != password2) { otvet = "!=pass"; return otvet; }
            if (password == null || password2 == null || login == null || email == null) { otvet = "NoAllText"; return otvet; }
            string otvet = (new System.Net.WebClient()).DownloadString(server + "reg/" + login + SH + password + SH + email);
            return otvet;
 
        }
   }
Здесь класс принимает текстовые значения LOGIN, PASSWORD, PASSWORD2 и email.
Далее мы проверяем - совпадают ли пароли? Если нет то возвращаем результат когда "!=pass" В моём случае это ответ на то что набранные пароли не совпадают.
Далее мы проверяем - А часом не пустые ли поля нам прислал юзер... Если это так то возвращаем ответ "NoAllText" Что нефиг пустые нам поля предостовлять.
Ну можно и без выше перечисленных обойтись. Так как главное здесь это предпоследняя строка. Здесь мы записываем результат запроса в переменную otvet. Тоесть код ответа который мы получим от сайта обратившись по адресу - server + "reg/" + login + SH + password + SH + email





Как это происходит в самой программе(Для совсем не понятливых и новичков):

1.Создаем программу.
2.Жмём CTRL+SHIFT+A
3.Создаём класс по умолчанию.
4.Заменяем строки:
C#
1
2
3
4
     class Class1
           {
               
           }
на
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Messages
    {
 
        public static Dictionary<string, string> kod_list = new Dictionary<string, string>()
        {
              {"КОД ОТВЕТА", "ОТВЕТ В ВИДЕ ТЕКСТА КОТОРЫЙ ВЫ БУДЕТЕ ВЫДОВАТЬ."},
              {"WARNING", "ПОСЛЕДНИЙ ВАРИАНТ ОТВЕТА ДОЛЖЕН БЫТЬ БЕЗ ЗАПЯТОЙ ПОСЛЕ СКОБОК"}
 
 
        };
        public static string GetText(string kods)
        {
            if (kod_list.ContainsKey(kods)) return kod_list[kods];
            return kod_list["error"];
        }
   }
public class Server
    {
        public static string server = "ВАШ АДРЕС САЙТА";
        public static string SH = "/";
   }
5. Ищем в теме или пишим свой класс на действие и встовляем его в public class Server (Я приведу пример на регестрации)
C#
1
2
3
4
5
6
7
8
public static string Reg(string login, string password, string password2, string email)
        {
            if (password != password2) { otvet = "!=pass"; return otvet; }
            if (password == null || password2 == null || login == null || email == null) { otvet = "NoAllText"; return otvet; }
            string otvet = (new System.Net.WebClient()).DownloadString(server + "reg/" + login + SH + password + SH + email);
            return otvet;
 
        }
6. Делаем нужную нам форму и действие кнопки к ней:
C#
1
2
3
string otvet = Server.Reg(TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text); //Вызываем переменную и тут же записываем то что нам ответит класс.
// прицеп класса и взаимодействия LOGIN,PASS,PASS,EMAIL
MessageBox.Show(Messages.GetText(otvet)); // Вызываем сообщение с текстом который мы получим от класса отправив код ответа который мы получили выше.

Как на сайте данная регистрация происходит:
reg файл
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php if ($get[1] == null or $get[2] == null or $get[3] == null ) //Прверяем - не пустые ли поля запроса
{
include_once("./inc/page/$page/center/404"); // если хоть 1 поле пустое то мы посылаем на 404 ошбку
} else {
$login = $get[1]; //Записываем логин из адреса обращения
$password=$get[2]; // записываем пароль из адреса обращения
$email=$get[3]; // записываем мыло из адреса обращения
 
$login = stripslashes($login);//Удаляем скрипты из логина если они есть
$login = htmlspecialchars($login);//удаляем html скрипты из логина если они есть
 
$password = stripslashes($password); 
$password = htmlspecialchars($password);
 
$email = stripslashes($email);
$email = htmlspecialchars($email);
 
$result = mysql_query("SELECT id FROM account WHERE login='$login'",$db) or die(mysql_error()); // делаем запрос в базу MySQL к таблице 'account' в колонку login на наличие такогоже логина как и в $login
$myrow = mysql_fetch_array($result); // Преобразуем в массив и записываем в $myrow
if (!empty($myrow['id'])) { // Проверка - Если не пусто в $myrow[id]
echo "login-detect"; // то выводим ответ login-detect
} else { // иначе
$mysql = mysql_query("SELECT id FROM account WHERE email='$email'",$db) or die(mysql_error()); // запрашиваем - Есть ли в таблице account в колонке email таковаже мыла как и в $email
$myrow2 = mysql_fetch_array($mysql); // преобразуем в массив
if (!empty($myrow2['id'])) { // Если не пусто в $myrow2[id]
echo "email-detect"; // выдаём ответ email-detect
} else {
$result2 = mysql_query ("INSERT INTO account (username, sha_pass_hash, email) VALUES ('$login', SHA1(CONCAT(UPPER('$login'),':',UPPER('$password'))), '$email')") or die(mysql_error()); // записываем в базу в колонки (username, sha_pass_hash, email) содержимое из ('$login', SHA1(CONCAT(UPPER('$login'),':',UPPER('$password'))), '$email')
 
if ($result2=='TRUE')// Проверяем, если нету ошибок
{
echo "ok"; // выдаём результат ok
}
 
else {
echo "error";
     } } } }
?>
База:
SQL
1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS `account` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Identifier',
  `username` VARCHAR(32) NOT NULL DEFAULT '',
  `sha_pass_hash` VARCHAR(40) NOT NULL DEFAULT '',
  `email` VARCHAR(254) NOT NULL DEFAULT '',
   PRIMARY KEY (`id`),
   UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Account System' AUTO_INCREMENT=1 ;
заметье! операторы echo и print - это одно и тоже.


К теме прелажу php server с 2 скриптами - Авторизация и регистрация.
А также проект с авторизацией и регистрацией.

ps. Прошу данную тему закрепить.(А данную строчку стереть)
PS. В данной теме я буду выкладывать разные примеры, варианты и скрипты как php так и
Вложения
Тип файла: zip ClientServer.zip (44.6 Кб, 110 просмотров)
Тип файла: zip php server.zip (4.2 Кб, 76 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.06.2013, 17:09
Ответы с готовыми решениями:

Клиент-сервер: Как определить, что клиент отключился?
Привет. Есть клиент и сервер, при подключении клиента, на сервере создается класс, который содержит копию сокета и всякую инфу клиента, и...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что сервер(клиент) не отвечает в течении...

Клиент-сервер. Клиент не принимает данные
Здравствуйте о светлейшие умы сего мира! Я работаю над одним проектом, а именно написание многопользовательской онлайн игры, и собственно...

17
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
09.06.2013, 19:17  [ТС]
Там ещё в проекте есть система прав... Так что и о ней пару слов.


Вот скрипт системы прав:


Таблица
MySQL
1
2
3
4
5
CREATE TABLE IF NOT EXISTS `account_access` (
  `id` int(10) unsigned NOT NULL,
  `gmlevel` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY (`id`,`RealmID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
В классе Message к кода ответа и текстовым ответам добавить
C#
1
2
3
4
              {"access_0", "Пользователь"},
              {"access_1", "Модератор"},
              {"access_2", "Старший Модератор"},
              {"access_3", "Админ"},

и также в класс Message добавить метод
C#
1
2
3
4
5
6
        public static string GetAccess(string access)
        {
 
            if (kod_list.ContainsKey("access_" + access)) return kod_list["access_" + access];
            return kod_list["access_0"];
        }
В клиенте
C#
1
2
3
string[] user = otvet.Split(new Char[] { ';' });
string access = user[1];
access = Messages.GetAccess(access);
в user[0] в данном случае записан код ответа.
0
10.06.2013, 09:44

Не по теме:

SkoTi, идея писать учебный материал это хорошо. Может прогер с тебя и не плохой, но с русским у тебя явно проблемы. А когда учить пытается безграмотный, это выглядит как-то ... комично что ли, и всерьез не воспринимается. :)

0
10.06.2013, 09:56

Не по теме:

nio, это был не оффтоп...
Когда человек фанатик, с Самым Лучшим ЯП, то ничему хорошему он явно не научит...

0
10.06.2013, 10:53

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
nio, это был не оффтоп...
Когда человек фанатик, с Самым Лучшим ЯП, то ничему хорошему он явно не научит...
Согласен, но не нужно тут разводить холивар, для этого есть спецраздел.

0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
14.06.2013, 12:30
Цитата Сообщение от SkoTi Посмотреть сообщение
if (password != password2) { otvet = "!=pass"; return otvet; }
почему password, а не parol ? почему тогда не кириллица? что за дискриминация? что за англицизмы?
1
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
14.06.2013, 13:45
Jupiter, Верно подмечено!


SkoTi, Если решил учителем заделаться, то постарайся всё делать как положено. Не приучай новичков к говнокодингу.
0
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
14.06.2013, 14:34  [ТС]
Я вобще делал для себя... Создал теорию и развил... И уже этот пример выложил другим... Если вам что то в моих темах не нравится... Можете идти с этим в банк....
0
 Аватар для WizarД
53 / 56 / 10
Регистрация: 07.02.2011
Сообщений: 556
Записей в блоге: 1
14.06.2013, 17:21
Цитата Сообщение от SkoTi Посмотреть сообщение
Я вобще делал для себя... Создал теорию и развил... И уже этот пример выложил другим... Если вам что то в моих темах не нравится... Можете идти с этим в банк....
Не хорошо так относится к замечаниям.
Вам явно привели пример.
переменные password и otvet - говнокод, не иначе.
Хотите чтобы было понятно-называйте все на одном языке,желательно на английском.
0
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
14.06.2013, 17:46  [ТС]
А если я английский не оч знаю и вобще... Я это делаю для себя и сам я прекрасно понимаю свой код.... А данный пример выложил как демонстрация найденого выхода из ситуации в поиске способа сделать КлиентСервер...
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
14.06.2013, 17:51
А я вообще не понял ему помощь нужна или что это? Куча непонятных вещей написано, куча вопросов, товарищь SkoTi, вы зачем создали эту тему? Похвастаться, спросить что-то или что?

Добавлено через 55 секунд
Цитата Сообщение от SkoTi Посмотреть сообщение
А данный пример выложил как демонстрация найденого выхода из ситуации в поиске способа сделать КлиентСервер...
Может на php и есть с этим проблемы, но зачем было с .net то так извращаться? там уже все готово
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
14.06.2013, 19:37
Цитата Сообщение от SkoTi Посмотреть сообщение
Я вобще делал для себя... Создал теорию и развил... И уже этот пример выложил другим...
И кому это нужно? Я думаю каждый умеет отправлять запросы, и обрабатывать их скриптом php. Тут ничего сложного нет. Да и зачем писать "сервер" на php, а клиент на net?
А я вообще не понял ему помощь нужна или что это? Куча непонятных вещей написано, куча вопросов, товарищь SkoTi, вы зачем создали эту тему? Похвастаться, спросить что-то или что?
нет, он хочет нам помочь, если у нас будут с этим проблемы

P.S.: тема ниочем. Как и другие твои созданные темы, где ты пытаешься кого то "учить". Прежде, чем писать какие-то статьи и мануалы - прочти хоть пару книг, и научись программировать.
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
14.06.2013, 19:55
SkoTi,

https://translate.google.ru/?h... 0%B5%D1%82

ок?
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
14.06.2013, 20:44
Цитата Сообщение от LeniumSoft Посмотреть сообщение
а смысл? если он даже переведет, и будет писать так... сам же запутается потом. Называть переменные нужно как тебе удобно - если пишешь для себя... если пишешь не только для себя - тогда нужно давать норм. названия.
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
15.06.2013, 10:03
Цитата Сообщение от Winhttp22 Посмотреть сообщение
если пишешь не только для себя - тогда нужно давать норм. названия.
Ну не знаю, мне кажется нужно стараться всегда следовать хорошему тону, пусть вначале будет сложно, но потом привыкнешь
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.06.2013, 13:51
23Alex24, норм. названия это и подразумевают.
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
16.06.2013, 13:18
Я в курсе, я говорю, что в любом случае надо писать нормально, даже если " для себя "
0
17.06.2013, 09:34
 Комментарий модератора 
Закрыто в связи с непрекращающимся оффтопом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.06.2013, 09:34
Помогаю со студенческими работами здесь

Клиент-Сервер. Удалённый сервер
Всем здравствуйте. Я заинтересовался написать клиент-сервер приложение. Написал я отдельную консольную программу сервера и клиента. Вот...

TCP-сервер и TCP-клиент. Клиент не находит файл.
Всем привет! Решил изучать передачу данных по сети и начал с освоения примера, приведённого в книге &quot;Visual C# 2008. Базовый курс...

Нужен исходник самого простого чата (клиент+сервер)
Есть у кого нить исходник самого простого чата клиент+сервер(т.е. две проги), чтобы было лишь лишь строка для ввода сообщения, поле для...

Зависает сервер при создании приложения типа клиент/сервер
Зависает сервер при создании приложения типа клиент/сервер using System; using System.Collections.Generic; using...

Как отправить json с клиента на сервер (клиент - прога на C#, сервер - файл PHP)
На хостинге есть файл php, как мне отправить к этому файлу json c помощью C# и как получить его с помощью php? А также как мне отправить,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Закрытая тема Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru