Розробка програмного забезпечення для клієнт-серверних додатків

Робота з клієнт-серверними додатками на основі сокетів. Розробка програм сервера та клієнта для обробки запитів клієнта сервером. Можливості програм сервера та клієнта. Створення гри "хрестики-нулики" на основі сокетів. Програмне забезпечення сервера.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык украинский
Дата добавления 23.05.2015
Размер файла 181,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

25

Зміст

  • Лабораторна робота 1. Робота з клієнт-серверними додатками на основі сокетів
  • Лабораторна робота 2. Створення гри хрестики-нулики на основі сокетів

Лабораторна робота 1. Робота з клієнт-серверними додатками на основі сокетів

Мета роботи: Розробити програму сервер та програму клієнт, де будуть оброблятися запити клієнта сервером.

Завдання:

Розробити програмне забезпечення сервера (прослуховувача сокетів - SockListener) та клієнта, який буде посилати команди (SockCommander).

Виконання завдання:

Завдання виконано у Microsoft Visual Studio 2010 у режимі MFC Application (створення додатку під операційну систему Windows).

Слід сказати, що кожен комп'ютер має свою IP-адресу в мережі. Розглядаючи локальну мережу, приведемо приклад IP-адрес: 192.168.0.100, 127.0.0.1. У даному випадку адреса 127.0.0.1 характеризує локальну адресу комп'ютера. Для простоти за умовчанням будемо налаштовуватись саме на цю адресу.

Наведемо головний код роботи програми сервера та клієнта.

Основні функції програмного коду сервера - проект SockListener.

CSockListenerDlg:: CSockListenerDlg (CWnd* pParent /*=NULL*/)

: CDialog (CSockListenerDlg:: IDD, pParent)

{

m_hIcon = AfxGetApp () - >LoadIcon (IDR_MAINFRAME);

}

void CSockListenerDlg:: DoDataExchange (CDataExchange* pDX)

{

CDialog:: DoDataExchange (pDX);

DDX_Control (pDX, IDC_LIST1, m_list1);

}

BEGIN_MESSAGE_MAP (CSockListenerDlg, CDialog)

ON_WM_SYSCOMMAND ()

ON_WM_PAINT ()

ON_WM_QUERYDRAGICON ()

ON_WM_SHOWWINDOW ()

ON_WM_CREATE ()

ON_BN_CLICKED (IDC_EXIT, OnExit)

END_MESSAGE_MAP ()

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

BOOL CSockListenerDlg:: OnInitDialog ()

{

CDialog:: OnInitDialog ();

ASSERT ( (IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT (IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu (FALSE);

if (pSysMenu! = NULL)

{

CString strAboutMenu;

strAboutMenu. LoadString (IDS_ABOUTBOX);

if (! strAboutMenu. IsEmpty ())

{

pSysMenu->AppendMenu (MF_SEPARATOR);

pSysMenu->AppendMenu (MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

SetIcon (m_hIcon, TRUE); // Set big icon

SetIcon (m_hIcon, FALSE); // Set small icon

// Получение IP

if (! GetMyIP ()) {

AfxMessageBox ("IP не определен", MB_OK|MB_ICONERROR);

}

else{

m_MySocket. m_ptrDlg = this;

// Создание и настройка сокета сервера на определенный порт (777)

m_MySocket. Create (PORT,SOCK_STREAM);

m_MySocket. Listen ();

}

return TRUE;

}

// Функция получения IP-адреса

BOOL CSockListenerDlg:: GetMyIP ()

{

HOSTENT *hs;

UCHAR ch [4] ={0};

CString csInfo;

:: gethostname ( (LPSTR) (LPCTSTR) m_cshostname, 50);

hs = gethostbyname ( (LPSTR) (LPCTSTR) m_cshostname);

memcpy (ch, hs->h_addr,4);

csInfo. Format ("%s %d. %d. %d. %d", m_cshostname,

ch [0], ch [1], ch [2], ch [3]);

GetDlgItem (IDC_TEXT) - >SetWindowText (csInfo);

return (TRUE);

}

// Получение объекта сокета клиента

void CSockListenerDlg:: ProcessPendingAccept ()

{

CString csSockAddr;

CString csInfo;

static int nIndex = 0;

UINT nSockPort;

CClientSocket* pSocket = new CClientSocket (this);

// Открытие соединения

if (m_MySocket. Accept (*pSocket))

{

if (pSocket->GetSockName (csSockAddr, nSockPort)) {

csInfo. Format ("%s: %u - Соединен", csSockAddr, nSockPort);

m_list1. InsertString (-1, csInfo);

++nIndex;

}

}

else

delete pSocket;

}

// Закрытие соединения

BOOL CSockListenerDlg:: OnCloseConnection (CClientSocket *pSocket)

{

CString csSockAddr;

CString csInfo;

static int nIndex = 0;

UINT nSockPort;

if (pSocket->GetSockName (csSockAddr, nSockPort)) {

csInfo. Format ("%s: %u - Разъединен", csSockAddr, nSockPort);

m_list1. InsertString (-1, csInfo);

}

return (TRUE);

}

// Прием команды от клиента сервером и ее выполнение

void CSockListenerDlg:: ProcessPendingRead (CClientSocket *pSocket)

{

char lpBuf [1000] = {0},soob [1000];

// Получение команды

pSocket->Receive (lpBuf, 1000);

// Выполнение команды

if (ExecuteCommand (lpBuf, FALSE))

{

sprintf (soob,"Загружен %s",lpBuf);

m_list1. InsertString (-1, soob);

}

else

m_list1. InsertString (-1, lpBuf);

}

// Выполнение команд

BOOL CSockListenerDlg:: ExecuteCommand (char *cmdstr, int flags)

{

int rez = WinExec (cmdstr, SW_SHOW);

return rez==33;

}

При запуску програми сервера на екрані з'явиться наступне вікно:

Зверху написано ім'я комп'ютера та його IP-адреса в локальній мережі 192.168.0.100. Крім того у вікні розташований список (клас CListBox), до якого будуть надходити команди клієнта.

І клієнти і сервер повинні бути налаштовані на конкретний порт. У нашому випадку це порт 777.

Далі наведемо основні функції програмного коду клієнту - проект SockCommander.

CSockCommanderDlg:: CSockCommanderDlg (CWnd* pParent /*=NULL*/)

: CDialog (CSockCommanderDlg:: IDD, pParent)

{

// ip по умолчанию (локальная машина)

m_ip = _T ("127.0.0.1");

// команда по умолчанию

m_msg = _T ("Введите команду");

// порт по умолчанию

m_port = _T ("777");

m_hIcon = AfxGetApp () - >LoadIcon (IDR_MAINFRAME);

}

void CSockCommanderDlg:: DoDataExchange (CDataExchange* pDX)

{

CDialog:: DoDataExchange (pDX);

DDX_Text (pDX, IDC_IP, m_ip);

DDX_Text (pDX, IDC_MSG, m_msg);

DDX_Text (pDX, IDC_PORT, m_port);

}

BEGIN_MESSAGE_MAP (CSockCommanderDlg, CDialog)

ON_WM_SYSCOMMAND ()

ON_WM_PAINT ()

ON_WM_QUERYDRAGICON ()

ON_BN_CLICKED (IDC_CONNECT, OnConnect)

ON_BN_CLICKED (IDC_DISCONNECT, OnDisconnect)

ON_BN_CLICKED (IDC_BUTTON1, &CSockCommanderDlg:: OnBnClickedButton1)

END_MESSAGE_MAP ()

BOOL CSockCommanderDlg:: OnInitDialog ()

{

CDialog:: OnInitDialog ();

// Создание объекта сокета

m_ptrComSocket = new CCommandSocket (this);

m_nConnected = FALSE;

return TRUE; // return TRUE unless you set the focus to a control

}

// Соединение клиента с сервером

void CSockCommanderDlg:: OnConnect ()

{

int status = TRUE;

UpdateData (TRUE);

if (m_ip. IsEmpty ())

{

MessageBeep (MB_ICONQUESTION);

GetDlgItem (IDC_IP) - >SetFocus ();

return;

}

if (m_port. IsEmpty ())

{

MessageBeep (5000);

GetDlgItem (MB_ICONQUESTION) - >SetFocus ();

return;

}

if (! m_ptrComSocket->Create (PORT,SOCK_STREAM))

{

AfxMessageBox (MSG_SOCKET_CREAT_FAIL);

status = FALSE;

return;

}

if (! m_ptrComSocket->Connect ( (LPCTSTR) m_ip, atoi (m_port)))

{

status = FALSE;

AfxMessageBox (MSG_SOCKET_CONCT_FAIL);

return;

}

// Проверка ошибочного соединения

if (! status)

{

m_nConnected = FALSE;

GetDlgItem (IDC_TEXT) - >SetWindowText ("Соединение с "+m_ip+" ошибочно");

}

else

{

m_nConnected = TRUE;

GetDlgItem (IDC_TEXT) - >SetWindowText ("Успешное соединение с "+m_ip);

}

}

// Отправка сообщения серверу

void CSockCommanderDlg:: OnBnClickedButton1 ()

{

UpdateData (TRUE);

if (! m_nConnected)

return;

if (m_msg. IsEmpty ())

{

MessageBeep (MB_ICONQUESTION);

GetDlgItem (IDC_MSG) - >SetFocus ();

return;

}

if (! m_ptrComSocket->Send ( (void *) m_msg. GetBuffer (m_msg. GetLength ()),

m_msg. GetLength ()))

{

AfxMessageBox (MSG_SOCKET_SEND_FAIL);

}

}

// Разъединение соединения

void CSockCommanderDlg:: OnDisconnect ()

{

if (m_nConnected)

{

m_ptrComSocket->Close ();

m_nConnected = FALSE;

GetDlgItem (IDC_TEXT) - >SetWindowText ("Разъединен с "+m_ip);

}

}

Розглянемо взаємодію та можливості програми сервера та клієнту.

1. Спочатку запускаємо програму сервера - файл SockListener. exe.

2. Потім запускаємо програму клієнта - файл SockCommander. exe.

3. Виконуємо з'єднання клієнту с сервером.

4. Посилаємо команди серверу.

5. Сервер приймає та обробляє команди.

При запуску програми клієнта на екрані виводиться наступне вікно

У якості IP призначення вказано локальну адресу 127.0.0.1. Порт на який налаштовано сервер 777. Також передбачено введення команд. Унікальність даної розробки в тому, що якщо указати команду на виконання, наприклад: calc, notepad, mspaint тощо - будуть завантажені відповідні додатки, а у вікні сервера виведеться відповідне повідомлення.

Надішлемо дві команди серверу:

1. "Привет всем".

2. calc.

Після цих команд вікно сервера буду виглядати наступним чином:

Після повідомлення "Загружен calc" на екрані дисплею побачимо калькулятор.

Для завершення роботи клієнту треба від'єднатися від сервера. Для цього необхідно натиснути кнопку "Разъединение".

Лабораторна робота 2. Створення гри хрестики-нулики на основі сокетів

Мета роботи: Розробити клієнт-серверну гру хрестики-нулики.

Завдання:

Розробити програмне забезпечення сервера (client_server_app) та клієнтів (client_app) для реалізації гри хрестики-нулики.

Виконання завдання:

Завдання виконано у Microsoft Visual Studio 2010 у режимі Console.

Наведемо програмний код сервера, головна мета якого створення сонета сервера та прослуховування клієнтів та відправка їм відповідних повідомлень. Сонет створено на основі порту 666.

#include "stdafx. h"

#include <stdio. h>

#include <string. h>

#pragma comment (lib, "wsock32. lib")

#include "winsock2. h"

#include "windows. h"

#include <time. h>

#define MY_PORT 666

DWORD WINAPI sayHello (LPVOID client_socket);

SOCKET players [2];

int field [9]; // ставим 1 если игрок 1 2 если игрок 2, всего 9 ячеек на поле

int count=0;

// Главная функция программы

int main ()

{

memset (field,0,sizeof (field)); // никто еще не ходил

char buff [1024];

printf ("TCP SERVER DEMO\n");

if (WSAStartup (0x0202, (WSADATA *) &buff [0]))

{

printf ("Error WSAStartup %d\n", WSAGetLastError ());

return - 1;

}

SOCKET mysocket; // ipv4, stream, tcp

if ( (mysocket = socket (AF_INET, SOCK_STREAM, 0)) < 0)

{

printf ("Error socket %d\n", WSAGetLastError ());

WSACleanup (); // Деиницилизация библиотеки Winsock

return - 1;

}

sockaddr_in local_addr;

local_addr. sin_family = AF_INET;

local_addr. sin_port = htons (MY_PORT);

local_addr. sin_addr. s_addr = 0;

if (bind (mysocket, (sockaddr *) &local_addr, sizeof (local_addr)))

{

printf ("Error bind %d\n", WSAGetLastError ());

closesocket (mysocket); // закрываем сокет!

WSACleanup ();

return - 1;

}

if (listen (mysocket, 0x100))

{

// Ошибка

printf ("Error listen %d\n", WSAGetLastError ());

closesocket (mysocket);

WSACleanup ();

return - 1;

}

int cl_count=0;

printf ("Waiting for connections. \n");

SOCKET client_socket; // сокет для клиента

sockaddr_in client_addr; // адрес клиента (заполняется системой)

int client_addr_size = sizeof (client_addr);

while ( (client_socket = accept (mysocket, (sockaddr *) &client_addr, \

&client_addr_size)))

{

printf ("%d socket\n", client_socket);

// пытаемся получить имя хоста

players [cl_count++] =client_socket;

HOSTENT *hst;

hst = gethostbyaddr ( (char *) &client_addr. sin_addr. s_addr, 4, AF_INET);

// Вывод сведений о клиенте

printf ("+%s [%s] Player %d! \n",

(hst)? hst->h_name: "", inet_ntoa (client_addr. sin_addr),cl_count);

DWORD thID;

// Создание потока с функцией sayHello

CreateThread (NULL, NULL, sayHello, &client_socket, NULL, &thID);

}

return 0;

}

// Функция прослушивания клиента и отправка сообщений в зависимости от кокретных ходов

DWORD WINAPI sayHello (LPVOID client_socket) {

SOCKET my_sock;

my_sock = ( (SOCKET *) client_socket) [0];

int player=0;

if (my_sock==players [0]) player = 1;

else player = 2;

char buff [20 * 1024];

char result [500];

bool k=false;

int win=0;

sprintf (result,"%d player", player);

send (my_sock, result, sizeof (result), 0);

int bytes_recv;

while ( (bytes_recv = recv (my_sock, &buff [0], sizeof (buff), 0)) && bytes_recv! = SOCKET_ERROR)

{

if (k) count++; // количество ходов в игре

buff [bytes_recv-1] =0;

if (! strcmp (&buff [0],"Y"))

{

strcpy (result,"Start!");

k=true;

if (player==1) send (players [0], result,strlen (result), 0);

}

else

{

if (count>=5)

{

for (int m = 0; m < 3; m++)

{

if (field [3*m] == field [3*m+1] && field [3*m+1] == field [3*m+2]) {win=field [3*m];

break; }

else if (field [m] == field [m+3] && field [m+3] == field [m+6]) {win=field [m];

break; }

else if ( (field [2] == field [4] && field [4] == field [6]) || (field [0] == field [4] && field [4] == field [8])) {win=field [4];

break; }

else win=0;

}

}

while (field [atoi (buff)])

{sprintf (result,"Повторный ход");

send (my_sock, result,sizeof (result), 0);

bytes_recv = recv (my_sock, &buff [0], sizeof (buff), 0);

buff [bytes_recv-1] =0;

}

sprintf (result,"%d", atoi (buff));

if (player==1) {

field [atoi (buff)] =1;

send (players [1], result,strlen (result), 0);

}

else {

field [atoi (buff)] =2;

send (players [0], result,strlen (result), 0);

}

if (count>=5)

{

for (int m = 0; m < 3; m++)

{

if (field [3*m] == field [3*m+1] && field [3*m+1] == field [3*m+2]) {win=field [3*m];

break; }

else if (field [m] == field [m+3] && field [m+3] == field [m+6]) {win=field [m];

break; }

else if ( (field [2] == field [4] && field [4] == field [6]) || (field [0] == field [4] && field [4] == field [8])) {win=field [4];

break; }

else win=0;

}

}

}

if (win)

{

if (win==1)

{

strcpy (result,"Winner is Player 1");

}

else

{

strcpy (result,"Winner is Player 2");

}

send (players [0], result,strlen (result), 0);

send (players [1], result,strlen (result), 0);

}

}

closesocket (my_sock);

return 0;

}

сервер сокет клієнт програма

При запуску програми буду виведене наступне вікно, яке буде чекати підключення клієнтів.

Призначення програми клієнт наступні:

1. Встановити з'єднання з сервером.

2. Малювання поля гри хрестики-нулики для конкретного користувача.

3. Передача параметрів кожного ходу на сервер.

Приведемо код програми клієнту.

#include "stdafx. h"

#include <stdio. h>

#include <string. h>

#pragma comment (lib, "wsock32. lib")

#include <winsock2. h>

#include <windows. h>

#include <locale. h>

#include "fun_console. h"

#define PORT 666

int _tmain ()

{

int k=3;

int pole [9] [2];

for (int i=0; i<3; i++)

{

pole [i*3] [0] =50;

pole [i*3+1] [0] =60;

pole [i*3+2] [0] =70;

}

for (int i=0; i<3; i++)

{

pole [i] [1] =k+3;

pole [i+3] [1] =k+9;

pole [i+6] [1] =k+15;

}

SetColor (0,15);

GotoXY (45,k);

printf ("%c", (char) 201);

for (int i=1; i<30; i++) {

printf ("%c", (char) 205);

}

printf ("%c\n", (char) 187);

for (int j=1; j<18; j++)

{

GotoXY (45,++k);

printf ("%c", (char) 186);

if (j%6! =0) {

for (int i=1; i<30; i++)

{

if (i%10==0) printf ("%c", (char) 186);

else printf (" ");

}

} else {

for (int i=1; i<30; i++) printf ("%c", (char) 205);

}

printf ("%c\n", (char) 186);

}

GotoXY (45,++k);

printf ("%c", (char) 200);

for (int i=1; i<30; i++) printf ("%c", (char) 205);

printf ("%c\n", (char) 188);

SetColor (7,0);

setlocale (0, "rus");

char buff [1024];

GotoXY (0,0);

if (WSAStartup (0x202, (WSADATA *) &buff [0]))

{

printf ("WSAStart error %d\n", WSAGetLastError ());

return - 1;

}

SOCKET my_sock;

my_sock = socket (AF_INET, SOCK_STREAM, 0);

if (my_sock < 0)

{

printf ("Socket () error %d\n", WSAGetLastError ());

return - 1;

}

sockaddr_in dest_addr;

dest_addr. sin_family = AF_INET;

dest_addr. sin_port = htons (PORT);

HOSTENT *hst;

char SERVERADDR [1024];

printf ("Введите IP сервера: ");

fgets (&SERVERADDR [0], sizeof (SERVERADDR) - 1, stdin);

if (inet_addr (SERVERADDR)! = INADDR_NONE)

dest_addr. sin_addr. s_addr = inet_addr (SERVERADDR);

else

{

// попытка получить IP адрес по доменному имени сервера

if (hst = gethostbyname (SERVERADDR))

// hst->h_addr_list содержит не массив адресов,

// а массив указателей на адреса

( (unsigned long *) &dest_addr. sin_addr) [0] =

( (unsigned long **) hst->h_addr_list) [0] [0];

else

{

printf ("Invalid address %s\n", SERVERADDR);

closesocket (my_sock);

WSACleanup ();

system ("pause");

return - 1;

}

}

if (connect (my_sock, (sockaddr *) &dest_addr, sizeof (dest_addr)))

{

printf ("Connect error %d\n", WSAGetLastError ());

return - 1;

}

printf ("Соединение успешно установлено\n \

Type quit for quit\n\n");

int nsize;

int row=7;

// printf ("Are you ready to play? Y/N\n");

nsize = recv (my_sock, &buff [0], sizeof (buff) - 1, 0);

buff [nsize] = 0;

printf ("\n%s", buff);

int player = atoi (buff);

int key [9] ={1,1,1,1,1,1,1,1,1};

#define Yes "Y"

send (my_sock, Yes, sizeof (Yes), 0);

int field [9];

memset (field,0,sizeof (field));

while ( (nsize = recv (my_sock, &buff [0], sizeof (buff) - 1, 0))! = SOCKET_ERROR)

{

// ставим завершающий ноль в конце строки

buff [nsize] = 0;

GotoXY (0,row++);

// выводим на экран

printf ("\nS=>C: %s", buff);

if (isdigit ( (unsigned char) buff [0])) {GotoXY (pole [atoi (buff)] [0],pole [atoi (buff)] [1]);

SetColor (0,15);

(player==1)? printf ("2"): printf ("1");

SetColor (7,0);

field [atoi (buff)] = (player==1)? 2: 1;

}

GotoXY (0,row++);

// читаем пользовательский ввод с клавиатуры

printf ("\nS<=C: "); fgets (&buff [0], sizeof (buff) - 1, stdin);

if (! field [atoi (buff)] &&key [atoi (buff)] ==1) {

field [atoi (buff)] = (player==1)? 1: 2;

key [atoi (buff)] =2;

}

if (isdigit ( (unsigned char) buff [0]) && (key [atoi (buff)] ==1||key [atoi (buff)] ==2)) {GotoXY (pole [atoi (buff)] [0],pole [atoi (buff)] [1]);

SetColor (0,15);

(player==1)? printf ("1"): printf ("2");

SetColor (7,0);

key [atoi (buff)] =3;

}

GotoXY (0,row++);

// проверка на "quit"

if (! strcmp (&buff [0], "quit\n") ||! strcmp (&buff [0], "N\n"))

{

// Корректный выход

printf ("Exit. ");

closesocket (my_sock);

WSACleanup ();

return 0;

}

// передаем строку клиента серверу

send (my_sock, &buff [0], strlen (&buff [0]), 0);

}

printf ("Recv error %d\n", WSAGetLastError ());

closesocket (my_sock);

WSACleanup ();

return - 1;

}

При завантаженні програми клієнту буде запропоновано ввести номер ходу від 0 до 8, який буде характеризувати клітинку (зліва направо).

Сервер в свою чергу буде аналізувати ходи кожного з двох користувачів та виведе переможця у разі здобуття перемоги.

Результат роботи програми виглядає наступним чином:

У разі введення 1, вона відобразиться у 2-й комірці.

Размещено на Allbest.ru


Подобные документы

  • Переваги архітектури "клієнт-сервер", порівняльна характеристика програмних засобів розробки його систем. Основні концепції функціонування системи IP-телебачення на базі архітектури "клієнт-сервер". Механізм взаємодії клієнта і сервера в середі Delphi.

    реферат [955,9 K], добавлен 30.01.2010

  • Розробка програми для збору, збереження та обробки інформації про хід технологічного процесу і передачі її в локальну обчислювальну мережу. Структура та функції системи: алгоритми функціонування і програмне забезпечення КОМ, сервера і робочих станцій.

    курсовая работа [225,2 K], добавлен 28.08.2012

  • Принципи організації баз даних (БД) при проектуванні клієнт-серверних додатків. Інструментальні засоби створення системи. Різновиди архітектур БД. Функції та програмна реалізація. Економічне обґрунтування доцільності розробки програмного продукту.

    дипломная работа [2,1 M], добавлен 22.10.2012

  • Розробка компонентів програмного забезпечення системи збору даних про хід технологічного процесу. Опис програмного забезпечення: сервера, що приймає дані про хід технологічного процесу, КОМ для його імітування, робочої станції для відображення даних.

    курсовая работа [1,3 M], добавлен 20.11.2010

  • Розробка елементів інформаційної системи для контролю експлуатації автотранспорту. Розробка програмного забезпечення в середовищі програмування Delphi з використанням пакету компонентів DevelopmentExpress та сервера баз даних під керуванням FireBird 2.1.

    дипломная работа [4,3 M], добавлен 24.10.2012

  • Розробка комплексу інтерактивних програмних засобів для обліку і продажу товарів в Інтернет-магазині. Консультативні та довідкові функції інформаційної системи. Створення і реалізація структурної моделі бази даних. Вимоги до ресурсів сервера і ПК клієнта.

    дипломная работа [891,6 K], добавлен 14.02.2015

  • Вибір технології для створення системи управління контентом. Можливості платформи Node.JS. Опис framework Express, який використовується для створення каркасу додатку. База даних MongoDB. Опис компонентів і проектних рішень. Взаємодія клієнта та сервера.

    курсовая работа [5,2 M], добавлен 29.11.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.