Konfiguracja sprzętu i oprogramowania

Rozwój części serwerowej do aplikacji mobilnych. Tworzenie aplikacji mobilnych: Synchronizacja z serwerem Tworzenie aplikacji po stronie serwerowej

488 Część IV. Ajax w przykładach

boty i wywołuje serwer, który dynamicznie generuje dane odpowiedzi na podstawie przesłanej wartości ciągu zapytania. Pierwszym parametrem funkcji LoaciXMLXSLTDoc() jest adres URL strony PHP, która generuje dokument XML, połączony z łańcuchem zapytania wygenerowanym przez odniesienie do wartości pola formularza HTML O. Drugim parametrem jest nazwa pliku © XSLT użytego w transformacja danych XML. Trzecim parametrem wymaganym przez funkcję LoadXMLXSLTDoc() jest identyfikator elementu div, w którym mają zostać umieszczone wyniki wyszukiwania. Identyfikator jest nazwą ciągu elementu wyjściowego, a nie odniesieniem do obiektu; w tym przypadku jako identyfikator używany jest ciąg „wyniki”.

W kolejnym kroku wykorzystujemy metody DOM, aby dodać obraz wskaźnika do strony WWW. Tworzony jest element obrazu ©, a atrybut źródła obrazu jest ustawiony na O. Ten utworzony element jest dodawany do elementu div wyników ©. Tak więc, gdy nasza funkcja jest wywoływana z modułu obsługi zdarzenia onsubmit formularza, plik obrazu jest umieszczany na stronie. Ogólnie rzecz biorąc, ważne jest, aby użytkownik stworzył wizualizację sprzężenie zwrotne- komunikat lub obraz, - wskazujący, że przetwarzanie jest w toku. Zapobiega to wielokrotnemu klikaniu przycisku przesyłania z handicapem, myśląc, że nic się nie dzieje (pamiętaj, że proces Ajax jest "niewidoczny").

Ostatnim krokiem jest wywołanie funkcji LoadXMLXSLTDoc() ®, która inicjuje proces wysyłania informacji do serwera. Funkcja LoadXMLXSLTDoc() opisana w sekcji 12.4 obsługuje wywołanie obiektu ContentLoader(), który żąda dokumentów z serwera. Ustawiając pozycję wyjściową jako parametr (zamiast na stałe kodować wartość w funkcji LoadXMLXSLTDoc()), możemy ponownie użyć ta funkcja na jednej stronie bez konieczności rozdzielania funkcjonalność dodanie wielu procedur lub instrukcji if. Dlatego przekierowujemy wyniki różnych Zapytania do różnych części strony. Jednak zanim to wszystko zrobimy, zobaczmy, jak tworzyć dokumenty XML i XSLT na serwerze.

12.3. Kod zaplecza aplikacji: PHP

V W tej sekcji stworzymy dynamiczną Dokument XML wykorzystujący PHP, popularny język skryptowy typu open source (jak wiesz, framework Ajax jest kompatybilny z dowolnym językiem lub platformą po stronie serwera). Dokument XML jest generowany dynamicznie z zestawu wyników otrzymanego w odpowiedzi na zapytanie klienta dotyczące bazy danych. Ponadto pokażemy, jak utworzyć statyczny dokument XSLT, który znajduje się na serwerze i jest pobierany za każdym razem, gdy zażądano pliku dynamicznego. Oba te dokumenty są zwracane do klienta niezależnie, gdy obiekt ContentLoader zostanie zażądany w dwóch oddzielnych żądaniach (Listing 12-7). XSLT przekształca nasz dynamiczny dokument XML po stronie klienta i tworzy tabelę HTML, która jest wyświetlana użytkownikowi.

Rozdział 12 Wyszukiwanie na żywo za pomocą XSLT 489

12.3.1. Tworzenie dokumentu XML

Ponieważ używamy XSLT, potrzebujemy ustrukturyzowanego dokumentu XML, który jest prostym zapisem informacji, tak aby plik XSL mógł wykonać standardowe przekształcenie. W tym projekcie utworzymy dynamiczny plik XML, gdy klient zażąda pliku PHP.

Rozwój struktury XML

Zanim zaczniemy tworzyć plik XML, musimy stworzyć dla niego szablon. Ten wzorzec powinien odzwierciedlać strukturę danych zwracanych przez wyszukiwanie. W wybranym zestawieniu zadań (książce telefonicznej) zwrócimy nazwę firmy, nazwisko osoby kontaktowej, kraj i numer telefonu. Listing 12-3 przedstawia podstawowy szablon XML, który zawiera cztery pola.

Wykaz 12.3. Podstawowy plik XML

Nazwa firmy Nazwa Kontaktu Nazwa kraju numer telefonu

Pierwszym elementem jest książka telefoniczna. Kolejny to element wpisu zawierający podelementy ze wszystkimi szczegółami, które są powiązane ze wszystkimi numerami kontaktowymi znalezionymi w zgłoszeniu. Jeśli mamy pięć wyników, w dokumencie XML będzie pięć elementów wpisu. Nazwa firmy jest wyświetlana w elemencie firma. Dodatkowo dodaliśmy imię osoby kontaktowej, nazwę kraju oraz numer telefonu. Jesteśmy nie tylko ograniczeni określone pola; Pola można dodawać lub usuwać w zależności od tego, jakie informacje chcesz wyświetlić.

Jeśli nie zostaną znalezione żadne wyniki, zamiast wyświetlać komunikat ostrzegawczy, możesz utworzyć element, który wyświetla te informacje użytkownikowi. STO ułatwi nam zwrócenie wyniku użytkownikowi i nie będzie wymagać dodatkowy kod po stronie klienta aplikacji. Kod na listingu 12-4 jest prawie taki sam jak na listingu 12-3, ale tym razem wprowadzamy tekst do elementów XML, które chcemy pokazać użytkownikowi, aby wskazać, że nie znaleziono żadnych wyników.

Listing 12.4. Plik XML bez wyników

brak wyników

// O Wyświetla „Brak wyników” zamiast nazwy firmy Nie dotyczy

490 Część IV. Przykłady ajaksin

// © Pozostałe pola są zastępowane przez „Nie dotyczy”

Nie dotyczy

Nie dotyczy

Za pomocą tego kodu wyświetlamy użytkownikowi pojedynczy wiersz informujący użytkownika, że ​​brakuje żądanych informacji. Deskryptor firmy O wyświetla informacje wskazujące na brak wyników. Inne deskryptory 0 mówią użytkownikowi, że nie ma informacji. Jeśli nie chcemy wyświetlać tekstu „N/A” („niedostępne”), możemy zamiast tego dodać spację nierozdzielającą, która pokaże komórki tabeli. Gdybyśmy w ogóle nie dodali żadnych informacji, komórki w tabeli by się nie pojawiły.

Jak widać format XML ma bardzo prostą strukturę. Gdyby ten plik XML był statyczny, użytkownikowi byłoby stosunkowo łatwo dodać nowego subskrybenta do pliku. Ponieważ jest generowany dynamicznie, potrzebujemy pętli, która tworzy dokument XML z zestawu wyników.

Tworzenie dynamicznego dokumentu XML

Jak zawsze tworzymy dokument XML na serwerze. Zgodnie z polityką używania różnych języków serwera w przykładach, kod serwera dla tego rozdziału jest napisany w PHP. Przypomnijmy raz jeszcze, że framework Ajax można stworzyć przy użyciu dowolnego języka po stronie serwera, a my opiszemy tylko zasadę implementacji kodu po stronie serwera bez wchodzenia w szczegóły. Tak więc listing 12-5 przedstawia kod aplikacji po stronie serwera. Kod pobiera parametr ciągu zapytania i generuje wiele wyników zapytań do bazy danych. Następnie przechodzimy przez zestaw wyników, tworząc element w pliku XML, jak pokazano na listingu 12.4, dla każdego numeru telefonu zwróconego w odpowiedzi na zapytanie.

Listing 12.5. Skrypt phoneXML.php: generowanie dokumentu XML na serwerze

// Informacje o zadeklarowaniu typu MIME header("Typ treści: tekst/xml"); Echo("\n");

// © Połącz z bazą danych

$db = mysql_connect("localhost", "ajax", "akcja"); rnysql_select_db("ajax",$db);

$result = mysql_query("WYBIERZ *

FROM Kontakty WHERE ContactName jak "%". // © Wypełnij wniosek

$_GET["q"] ."%"",$db); ?>

// O Sprawdź wyniki

if ($myrow = mysgl_fetch_array($wynik)) ( wykonaj (

// © Przeprowadź pętlę przez zestaw wyników

Rozdział 12 Wyszukiwanie na żywo za pomocą XSLT 491

001">

)while ($myrow - mysql_fetch_array($result)); )w przeciwnym razie(

książka telefoniczna lub wyślij komunikat „Brak wyników” 0.

12.3.2. Utwórz dokument XSLT

Używając XSLT, nasz plik XML można przekonwertować w piękną tabelę HTML za pomocą kilku linijek kodu. Dokument XSLT umożliwia dopasowanie szablonu, jeśli konieczne jest wyświetlenie danych w dowolnym żądanym formacie. Dopasowywanie szablonów wykorzystuje strukturę szablonu do wyświetlania danych. W tym samym czasie przechodzimy przez węzły drzewa

492 Część IV. Ajax w przykładach

źródło przy użyciu XSLT. Dokument XSLT pobiera ustrukturyzowany plik XML i konwertuje go na format, który można łatwo przeglądać, aktualizować i modyfikować. W naszym przypadku dokument XSLT jest zdefiniowany statycznie.

Struktura XSLT

Transformacja XSLT zawiera reguły tłumaczenia drzewa źródłowego na drzewo docelowe. Cały proces XSLT polega na dopasowaniu do struktury szablonu. Gdy elementy drzewa źródłowego pasują do danej struktury, tworzone jest drzewo docelowe zgodnie z szablonem dokumentu.

Struktura drzewa docelowego nie musi być powiązana ze strukturą drzewa źródłowego. Dlatego oryginalny plik XML można przekonwertować do dowolnego pożądanego formatu. Nie jest konieczne używanie tylko tabelarycznego widoku zbioru danych.

Transformacja XSLT nazywana jest arkuszem stylów, ponieważ definiuje stylizację powstałego drzewa. Arkusz stylów zawiera reguły szablonu, które składają się z dwóch części. Pierwsza część to struktura szablonu, z którą porównywane są węzły drzewa źródłowego. Po znalezieniu dopasowania, procesor XSLT wykorzystuje drugą część - szablon zawierający deskryptory do budowy drzewa źródłowego.

Utwórz dokument XSLT

Generowanie transformacji XSLT dla danego projektu jest stosunkowo proste. Ponieważ zamierzamy otrzymać tabelę, nie jest wymagane żadne wyszukane dopasowanie wzorców; po prostu kolejno przechodzimy przez wszystkie węzły elementów drzewa źródłowego. Poniżej opracujemy szablon, który generuje tabelę HTML z czterema kolumnami. Odpowiedni plik XSLT dla tego projektu pokazano na listingu 12-6.

Wykaz 12.6. Plik XSLT

„ISO-8859-l”?>

// О Ustaw wersję XML i kodowanie

// © Ustaw przestrzeń nazw XSLT„http://www.w3.org/1999/XSL/Transform">

// © Ustaw zasady szablonów

// Informacje Dodaj element tabeli

// © Utwórz pasek tytułu

Rozdział 12 Wyszukiwanie na żywo za pomocą XSLT 493

// 0 Kolejno przeglądaj elementy książki telefonicznej

select="książka telefoniczna/wpis"> // © Sformatuj dane wyjściowe

Spółka kontakt Kraj telefon

Podczas tworzenia transformacji XSLT należy określić kodowanie i wersję XML O oraz przestrzeń nazw XSLT ©. Przestrzeń nazw definiuje zasady i specyfikacje, z którymi musi być zgodny dokument. Elementy w przestrzeni nazw XML są rozpoznawane w dokumencie źródłowym, ale nie są rozpoznawane w dokumencie wynikowym. Prefiks xsl służy do definiowania wszystkich naszych elementów w przestrzeni nazw XSLT. Następnie możesz ustawić regułę szablonu - poszukaj struktury / © pasującej do całego dokumentu.

Teraz możemy zacząć tworzyć szablon tabeli, który wyświetla nasze wyniki. Dodajemy deskryptor tabeli O, który mapuje identyfikator do tabeli. Po nim następuje wiersz nagłówka tabeli w punkcie zawierający nazwy kolumn, które wskazują użytkownikowi, jakie informacje są zawarte w tabeli.

Przechodząc kolejno przez zbiór węzłów drzewa źródłowego, otrzymujemy pozostałe wiersze tabeli. W tym przypadku wykorzystywana jest pętla for-each © w procesie przetwarzania wpisów, wydających węzły znajdujące się w książce telefonicznej/wpisie.

Ponieważ sekwencyjnie przemierzamy drzewo dokumentu, musimy wybrać wartości kolumn. Aby wybrać wartości z węzłów, operator value-of to służy do wyodrębnienia wartości elementu XML i dodania jej do strumienia wyjściowego transformacji. Aby określić element XML, którego tekst chcemy wyodrębnić, użyj atrybutu select z nazwą elementu. Po wygenerowaniu pliku XSLT i utworzeniu kodu do dynamicznego generowania dokumentu XML, możesz uzupełnić kod JavaScript i zobaczyć, jak połączenie transformacji XSLT z ustrukturyzowanym plikiem XML daje łatwą do przeglądania tabelę.

W następnym kroku ponownie wracamy do strony klienta, pobierając pliki, które właśnie utworzyliśmy z odpowiedzią HTTP.

Rozwój części serwerowej klienta- aplikacja serwerowa zaczyna się od projektowania architektury. Wiele zależy od architektury: od rozszerzalności aplikacji po jej wydajność i łatwość obsługi/utrzymania.

Przede wszystkim należy określić, w jaki sposób dane będą umieszczane na serwerze oraz w jaki sposób będą przetwarzane żądania przychodzące od klienta. Niezbędne jest również przemyślenie organizacji buforowania danych po stronie serwera.

Konieczne jest podjęcie decyzji o protokołach wymiany danych i formatach przesyłania danych.

API (interfejs programowania aplikacji) - interfejs programowanie aplikacji. W bardziej zrozumiałym języku jest to zestaw żądań do serwera, który ten ostatni rozumie i może udzielić prawidłowej odpowiedzi. API definiuje funkcjonalność logiki serwera, podczas gdy API pozwala wyabstrahować, jak ta funkcjonalność jest zaimplementowana. Innymi słowy, API jest niezbędną częścią całej infrastruktury klient-serwer.

Porównaj JSON i XML. Podaj przykład protokołów w zależności od typu aplikacji.

Wielowątkowość

Jednym z kluczowych aspektów współczesnego programowania jest wielowątkowość. Za pomocą wielowątkowości możemy wydzielić kilka wątków w aplikacji, które będą wykonywać jednocześnie różne zadania.

Wielowątkowość jest właściwością platformy (na przykład system operacyjny, maszyna wirtualna itp.) lub aplikacji, która polega na tym, że proces zaszczepiony w systemie operacyjnym może składać się z kilku wątków działających „równolegle”, czyli bez określonej kolejności w czasie.

Istotą wielowątkowości jest quasi-wielozadaniowość na poziomie jednego procesu wykonywalnego, czyli wszystkie wątki są wykonywane w przestrzeni adresowej procesu. Ponadto wszystkie wątki procesu mają nie tylko wspólną przestrzeń adresową, ale także wspólne deskryptory plików. Działający proces ma co najmniej jeden (główny) wątek.

Wielowątkowości (jako doktryny programistycznej) nie należy mylić z wielozadaniowością lub wieloprocesorowością, mimo że systemy operacyjne, które implementują wielozadaniowość, mają również tendencję do implementowania wielowątkowości.

Do zalet wielowątkowości w programowaniu należą:

W niektórych przypadkach uproszczenie programu przy użyciu wspólnej przestrzeni adresowej.

Mniej czasu spędzonego na tworzeniu wątku w stosunku do procesu.

Poprawa wydajności procesów poprzez zrównoleglenie obliczeń procesora i operacji we/wy.

Pływ(wątek) to zarządzana jednostka kodu wykonywalnego. W środowisku wielozadaniowym opartym na wątkach wszystkie uruchomione procesy z konieczności mają wątek główny, ale może być ich więcej. Oznacza to, że jeden program może wykonywać asynchronicznie wiele zadań. Na przykład edytowanie tekstu w Edytor tekstu w czasie drukowania, ponieważ te dwa zadania działają w różnych wątkach.

Na konwencjonalnym procesorze zarządzanie wątkami jest obsługiwane przez system operacyjny. Wątek jest wykonywany do momentu wystąpienia przerwania sprzętowego, wywołanie systemowe lub do upływu czasu przeznaczonego na to przez system operacyjny. Następnie procesor przełącza się na kod systemu operacyjnego, który zapisuje stan wątku (jego kontekst) lub przełącza się na stan innego wątku, który również ma przydzielony czas na wykonanie. Przy takiej wielowątkowości wystarczy duża liczba Cykle procesora są zużywane na kod systemu operacyjnego, który przełącza konteksty. Jeśli obsługa wątków jest zaimplementowana sprzętowo, sam procesor będzie mógł przełączać się między wątkami, aw idealnym przypadku wykonywać kilka wątków jednocześnie dla każdego cyklu zegara.

– Tymczasowa wielowątkowość (pojedynczy wątek)

– Jednoczesna wielowątkowość (wiele wątków jednocześnie)

Wielowątkowość, jako rozpowszechniony model programowania i wykonywania kodu, pozwala na uruchamianie wielu wątków w ramach jednego procesu. Te wątki wykonania współdzielą zasoby procesu, ale mogą również działać samodzielnie. Wielowątkowy model programowania zapewnia programistom wygodną abstrakcję wykonywania równoległego. Jednak chyba najciekawszym zastosowaniem tej technologii jest zastosowanie jej do pojedynczego procesu, co pozwala na jego równoległe wykonanie w systemie wieloprocesorowym.

Ta zaleta programu wielowątkowego pozwala mu działać szybciej systemy komputerowe, które mają wiele procesorów, procesor z wieloma rdzeniami lub klaster maszyn - ze względu na fakt, że wątki wykonywania programu w naturalny sposób nadają się do prawdziwie równoległego wykonywania procesów. W takim przypadku programista musi być bardzo ostrożny, aby uniknąć wyścigów i innych nieintuicyjnych zachowań. Aby prawidłowo manipulować danymi, wątki wykonania muszą często przechodzić przez procedurę spotkania w celu przetworzenia danych we właściwej kolejności. Wątki wykonania mogą również wymagać muteksów (które są często implementowane przy użyciu semaforów), aby uniemożliwić jednoczesną modyfikację współdzielonych danych lub ich odczytanie podczas procesu modyfikacji. Nieostrożne używanie takich prymitywów może doprowadzić do impasu.

Innym zastosowaniem wielowątkowości, nawet w przypadku systemów jednoprocesorowych, jest zdolność aplikacji do reagowania na dane wejściowe. W programach jednowątkowych, jeśli główny wątek wykonania jest blokowany przez wykonanie długotrwałego zadania, cała aplikacja może być w stanie zamrożonym. Przenosząc takie długotrwałe zadania do wątku roboczego działającego równolegle z wątkiem głównym, możliwe staje się, aby aplikacje nadal odpowiadały na dane wprowadzane przez użytkownika, podczas gdy zadania są wykonywane w tło. Z drugiej strony, w większości przypadków wielowątkowość nie jest jedynym sposobem na utrzymanie responsywności programu. To samo można osiągnąć za pomocą asynchronicznych we/wy lub sygnałów w systemie UNIX.

Istnieją dwa rodzaje wielozadaniowości: oparte na procesach oraz oparty na strumieniu. Różnice między wielozadaniowością opartą na procesach a wielozadaniowością opartą na wątkach są następujące: wielozadaniowość oparta na procesach jest zorganizowana do równoległego wykonywania programów, a wielozadaniowość oparta na wątkach służy do równoległego wykonywania poszczególnych części jednego programu.

Istnieją dwa rodzaje strumieni:

Wątki pierwszego planu lub pierwszy plan. Domyślnie każdy wątek utworzony za pomocą metody Thread.Start() automatycznie staje się wątkiem pierwszego planu. Ten typ Wątki zapewniają ochronę bieżącej aplikacji przed zakończeniem. Środowisko uruchomieniowe języka wspólnego nie zatrzyma aplikacji, dopóki wszystkie wątki pierwszego planu nie zostaną zakończone.

Wątki w tle. Ten typ wątki, znane również jako wątki demonów, są traktowane przez środowisko uruchomieniowe języka wspólnego jako rozszerzalne ścieżki wykonywania, które można zignorować w dowolnym momencie. W związku z tym, jeśli wszystkie wątki pierwszego planu zostaną zakończone, wszystkie wątki w tle zostaną automatycznie zabite, gdy domena aplikacji zostanie zwolniona. Aby utworzyć wątki w tle, należy ustawić właściwość IsBackground na true.

Opowiedz o stanach wątków: uruchomionych, zawieszonych, uruchomionych, ale czekających na coś.

Problem z synchronizacją wątków i współużytkowane zasoby.

Interakcja z wątkiem

W środowisku wielowątkowym często pojawiają się problemy związane z wykorzystaniem tych samych danych lub urządzeń przez równoległe wykonywanie wątków. Do rozwiązywania takich problemów wykorzystywane są metody interakcji wątków, takie jak muteksy, semafory, sekcje krytyczne i zdarzenia.

Mutex jest obiektem synchronizacji, który jest ustawiony na specjalny stan sygnalizowany, gdy nie jest zajmowany przez żaden wątek. Tylko jeden wątek jest właścicielem tego obiektu w dowolnym momencie, stąd nazwy takich obiektów (z angielskiego wzajemnie wykluczający dostęp - wzajemnie wykluczający się dostęp) - wykluczony jest jednoczesny dostęp do współdzielonego zasobu. Po wykonaniu wszystkich niezbędnych czynności, muteks zostaje zwolniony, dając innym wątkom dostęp do współdzielonego zasobu. Obiekt może obsługiwać przechwytywanie rekurencyjne po raz drugi przez ten sam wątek, zwiększając licznik bez blokowania wątku, a następnie wymagając wielu wydań. Taka jest na przykład sekcja krytyczna w Win32. Jednak istnieją pewne implementacje, które tego nie obsługują i powodują zakleszczenie wątku podczas próby rekursywnego przechwytywania. To jest FAST_MUTEX w jądrze Windows.

semafory reprezentują dostępne zasoby, które mogą być pozyskane przez wiele wątków w tym samym czasie, dopóki pula zasobów nie będzie pusta. Następnie dodatkowe wątki muszą czekać, aż wymagana ilość zasobów będzie ponownie dostępna. Semafory są bardzo wydajne, ponieważ umożliwiają równoczesny dostęp do zasobów.

Wydarzenia. Obiekt przechowujący 1 bit informacji „zasygnalizowany lub nie”, na którym zdefiniowane są operacje „sygnał”, „przywracanie stanu bez sygnału” i „czekanie”. Oczekiwanie na zasygnalizowane zdarzenie to brak operacji z natychmiastową kontynuacją wykonania wątku. Oczekiwanie na niesygnalizowane zdarzenie powoduje zawieszenie wykonania wątku do momentu, gdy inny wątek (lub druga faza obsługi przerwań w jądrze systemu operacyjnego) zasygnalizuje zdarzenie. Możliwe jest oczekiwanie na kilka zdarzeń w trybie „dowolne” lub „wszystkie”. Możliwe jest również stworzenie zdarzenia, które po wybudzeniu pierwszego i jedynego oczekującego wątku jest automatycznie resetowane do stanu niesygnalizowanego (obiekt taki służy jako podstawa do zaimplementowania obiektu „sekcja krytyczna”). Aktywnie używany w MS Windows, zarówno w trybie użytkownika, jak iw trybie jądra. W jądrze Linuksa istnieje podobny obiekt o nazwie kwait_queue.

Sekcje krytyczne zapewniają synchronizację jak muteksy, z wyjątkiem tego, że obiekty reprezentujące sekcje krytyczne są dostępne w ramach tego samego procesu. Zdarzenia, muteksy i semafory mogą być również używane w aplikacjach jednoprocesowych, jednak implementacje krytycznych sekcji w niektórych systemach operacyjnych (np. Windows NT) zapewniają szybszy i bardziej wydajny mechanizm wzajemnie wykluczającej się synchronizacji - nabywania i zwalniania operacje na sekcji krytycznej są zoptymalizowane pod kątem pojedynczego wątku (brak rywalizacji) w celu uniknięcia jakichkolwiek wywołań systemowych prowadzących do jądra systemu operacyjnego. Podobnie jak muteksy, obiekt reprezentujący sekcję krytyczną może być używany tylko przez jeden wątek na raz, co czyni je niezwykle przydatnymi w ograniczaniu dostępu do współdzielonych zasobów.

Zmienne warunkowe(kondwary). Podobnie jak zdarzenia, ale nie są to obiekty zajmujące pamięć - wykorzystywany jest tylko adres zmiennej, pojęcie „zawartość zmiennej” nie istnieje, adres dowolnego obiektu może być użyty jako zmienna warunkowa. W przeciwieństwie do zdarzeń, ustawienie zmiennej warunku na stan sygnalizowany nie ma żadnych konsekwencji, jeśli aktualnie nie ma wątków oczekujących na zmienną. Ustawienie zdarzenia w podobnym przypadku wiąże się z przechowywaniem stanu „zasygnalizowanego” w samym zdarzeniu, po czym kolejne wątki, które chcą czekać na zdarzenie, kontynuują wykonywanie natychmiast bez zatrzymywania. Aby w pełni wykorzystać taki obiekt, konieczna jest również operacja „zwolnij mutex i poczekaj na zmienną warunku atomowo”. Aktywnie używany w systemach operacyjnych typu UNIX. Dyskusje o zaletach i wadach zdarzeń i zmiennych warunkowych stanowią ważną część dyskusji o zaletach i wadach zdarzeń i zmiennych warunkowych. wady Windows i UNIX.

Port zakończenia we/wy(port zakończenia IO, IOCP). Zaimplementowany w jądrze systemu operacyjnego i dostępny poprzez wywołania systemowe, obiekt „queue” z operacjami „wstaw strukturę na koniec kolejki” i „pobierz następną strukturę z początku kolejki” - ostatnie wywołanie wstrzymuje wykonanie wątku, jeśli kolejka jest pusta i dopóki żaden inny wątek nie wykona wywołania put. Najważniejszą cechą IOCP jest to, że struktury mogą być w nim umieszczane nie tylko przez jawne wywołanie systemowe z trybu użytkownika, ale także niejawnie wewnątrz jądra systemu operacyjnego w wyniku zakończenia asynchronicznej operacji I/O na jednym z plików deskryptory. Aby osiągnąć ten efekt, musisz użyć wywołania systemowego "skojarz deskryptor pliku z IOCP". W takim przypadku struktura umieszczona w kolejce zawiera kod błędu operacji we/wy, a także, w przypadku powodzenia tej operacji, liczbę faktycznie wprowadzonych lub wyprowadzonych bajtów. Implementacja portu zakończenia ogranicza również liczbę wątków wykonywanych na pojedynczym procesorze/rdzeniu po odebraniu struktury z kolejki. Obiekt jest specyficzny dla MS Windows i umożliwia przetwarzanie przychodzących żądań połączeń i porcji danych na serwerze oprogramowanie w architekturze, w której liczba wątków może być mniejsza niż liczba klientów (nie ma wymogu tworzenia osobnego wątku z kosztami zasobów dla każdego nowego klienta).

Pula wątków

Opowiedz o puli wątków

Rozwój strony serwerowej aplikacji

Wstęp

Obecność w Internecie stała się koniecznością dla nowoczesnych firm. Bez tego niemożliwe jest zbudowanie pełnoprawnej interakcji z klientami. Często, aby rozwiązać taki problem, uciekają się do tworzenia aplikacji klient-serwer. Każdy z nich składa się z części klienckiej i Back-endu. Ostatni termin oznacza część serwerowa Aplikacje. Jeśli w przyszłości musisz samodzielnie zmienić zawartość programu mobilnego, to Back-end musi być stworzony ze szczególnie wysoką jakością. Appomart gwarantuje wykonanie powierzonych zadań zgodnie z wymaganiami. Dlatego zlecając wykonanie aplikacji serwerowych możesz być pewien prawidłowego wyniku.

Do czego służy Back-end?

Tworzenie aplikacji klient-serwer obejmuje tworzenie dwóch części. Pierwszy, Front-end, akceptuje żądania od użytkowników. Widać to z ekranów urządzenia mobilne klientów. Druga, aplikacja serwerowa, przetwarza odebrane żądania i pełni rolę panelu administracyjnego. Tutaj przechowywane są bazy danych i logika programu. Bez tego nic nie będzie działać. aplikacja klient-serwer. W rzeczywistości back-end jest sercem programu. To inteligencja odpowiedzialna za przetwarzanie żądań klientów, szybkość działania aplikacji. Dlatego ważne jest, aby architektura aplikacji serwerowej została przemyślana w najdrobniejszych szczegółach, tak aby nawet mocno obciążone usługi działały płynnie i szybko.

Jak wybrać język programowania?

W przygotowaniu zakres zadań(części dokumentacji roboczej projektu), architekt projektuje system bazy danych i komunikacji, opisuje obiekty i ich właściwości, a także opracowuje niezbędne metody serwerowe (żądania, których „wykorzystają” aplikacje mobilne podczas kontaktu z serwerem).

Znaczenie dokumentacji i porzuconych projektów

Z Appomart dość często kontaktują się klienci, którzy zostali „porzuceni” z tego czy innego powodu przez innych kontrahentów. I bierzemy czyjś, czasem nawet niepoprawnie działający projekt, przeprowadzamy jego audyt i późniejszą weryfikację oraz wsparcie. W trakcie nauki kod źródłowy i materiałów otrzymanych od klienta mamy do czynienia z faktem, że wielu programistów celowo nie dokumentuje metod serwerowych w celu związania klienta ze sobą, ze względu na niewspółmierność kosztów robocizny przeniesienia projektu do obsługi innego programisty, do braku dokumentacji do części serwerowej, a czasem po prostu z powodu nieprofesjonalizmu. Ten fakt jest niestety nie tylko smutny, ale i powszechny. Klient w tym przypadku musi zapłacić za opracowanie dokumentacji dla istniejącego projektu, a także audyt kodu źródłowego, zanim będzie można ocenić skuteczność, wygodę i celowość wsparcia projektu. Appomart utrzymuje elektroniczną dokumentację metod zaplecza w formacie obsługiwanym przez Postman i Swagger do późniejszego wykorzystania.

Jak sprawdzić wykonawcę przed podpisaniem umowy?

Zachęcamy do starannego wyboru wykonawcy i skupienia się nie tylko na kuszącej cenie, ale również na liście dokumentów, które otrzymasz wraz z projektem, a także warunkach przekazania kodu źródłowego i oklejenia kodu komentarze, schematy baz danych (czy to Mongo DB czy MySQL ). Kluczem do sukcesu jest z reguły kompetentna dokumentacja robocza, która jasno wskazuje wymagania dotyczące przekazywanych Państwu materiałów po zakończeniu każdego etapu prac.

Funkcje rozwojowe

PHP dla backendu

Tworzenie aplikacji po stronie serwera (nie mylić z serwerami jako „sprzętem” lub komputerami, ponieważ mówimy o stronie oprogramowania) wymaga określonych umiejętności zawodowych i znajomości języka programowania, który jest używany po stronie serwera. Jeśli spojrzymy na przykłady aplikacji klient-serwer, widzimy, że PHP jest popularne. Jest niekwestionowanym liderem w tworzeniu aplikacji serwerowych. Ponad połowa witryn na świecie jest napisana w tym języku w takiej czy innej konfiguracji. PHP jest łatwe w rozwijaniu i utrzymaniu, a poza tym istnieją specjalne frameworki, które przyspieszają rozwój w PHP.

Struktura

Struktura( platforma oprogramowania) - służy do organizowania i zwiększania poziomów abstrakcji, dzięki czemu projekt jest bardziej elastyczny i skalowalny. Należy jednak rozumieć, że ramy muszą zostać wybrane poprawnie, w oparciu o dogłębną analizę dokumentacji roboczej projektu, bez której nie można opracować produktu wysokiej jakości.

Delphi, JAVA, Python

Istnieją inne języki używane do tworzenia Back-endu. Tak więc, stworzony w Środowisko Delphi aplikacje serwerowe. Z jego pomocą program zyskuje lepsze debugowanie, jest też łatwy do tworzenia w środowisku unikalne programy, pod warunkiem, że kreacja wizualna, co pozwala na zrobienie pięknego, zrozumiałego i Przyjazny dla użytkownika interfejs. Popularność zyskały również aplikacje serwerowe Java. Są one łatwo uzupełniane, łatwe do wykonania na dowolnej platformie i mają przyzwoity poziom bezpieczeństwa. Innym popularnym językiem jest Python. Aplikacje serwerowe z jego pomocą powstają szybko, prosto, bez poważniejszych wydatków.

Rozpościerający się

Tworzenie aplikacji klient-serwer jest pożądane w środowisku korporacyjnym. Często podobne programy wykorzystywane do grup roboczych lub tworzenia systemy informacyjne wewnątrz przedsiębiorstwa. Zdecydowana większość aplikacje mobilne do utrzymania komunikacji z klientem również ma podobną architekturę. Popularność wynika z faktu, że wykorzystanie możliwości serwera pozwala zapewnić kontrolę i integralność systemu, przy jednoczesnym zmniejszeniu obciążenia sieci.

Stworzymy aplikację klient-serwer na Androida, iOS o wysokiej jakości i na czas

Rozwój pod klucz

Programiści Appomart są doświadczeni i wykwalifikowani do realizacji zadań na różnych poziomach. Jesteśmy równie dobrzy we wdrażaniu portale społecznościowe, projekty biznesowe o dużym obciążeniu lub część oprogramowania dla małych startupów. W razie potrzeby stworzymy część kliencką aplikacji pod Kontrola Androida, iOS według istniejących potrzeb, wymagań.

Back-end w Appomart

Nasi programiści pracują z różnymi technologiami i robią to równie dobrze. W Appomart możesz zamówić aplikację klient-serwer w Javie, PHP i Node.JS. Wymagania systemowe są analizowane dla każdego z projektów indywidualnie, co pozwala zapewnić optymalną wydajność programu. Stworzymy od podstaw aplikację klient-serwer Java, PHP i Node.JS lub przejmiemy istniejącą do obsługi ulepszeń i aktualizacji. Jeśli jesteś zainteresowany opracowaniem nowej części serwerowej lub wsparciem już istniejącej, zostaw prośbę, aby uzyskać szczegółową kalkulację kosztów pracy i możliwości współpracy.

tylna strona klienci mobilni- serwer.

Dodatkowe wymagania zależą od specyfiki aplikacji:
skalowalność serwera - dla SaaS, aplikacji społecznościowych, gdzie idealnie oczekuje się dużego przepływu odwiedzających, warunek ten jest obowiązkowy. W przypadku aplikacji biznesowych, w których istnieją ograniczenia liczby użytkowników lub liczba jest przewidywana, ta właściwość nie jest wymagana;
interaktywność: szereg aplikacji musi być wyposażony w mechanizm powiadomień - aby poinformować aplikację (użytkownika) o wystąpieniu określonych zdarzeń, należy wysłać wiadomość do użytkownika. Ta właściwość powinna mieć np. system wymiany lub automatyczny dyspozytor Taxi.
otwarte API: zakłada się, że zewnętrzni programiści mogą korzystać z funkcjonalności systemu za pośrednictwem udokumentowanego protokołu. W końcu klientem może być zarówno aplikacja mobilna, jak i zewnętrzna aplikacja serwerowa.
inne wymagania...

Zespół
Idealnie skład zespołu projektowego ds. rozwoju systemu wyglądałby następująco:
kierownik projektu: zarządza, kontroluje projekt, współpracuje bezpośrednio z klientem;
programista aplikacji serwerowych: tworzy serwer logiki biznesowej, bazę danych, protokół sieciowy;
programista aplikacji administratora: rozwija się Aplikacja internetowa, interfejs użytkownika konfigurowanie i zarządzanie aplikacją serwerową;
Programista aplikacji klienckich na Androida;
programista aplikacji klienckich na iOS;
programista aplikacji klienckich dla...
tester: testuje aplikację administracyjną i aplikacje klienckie.

Uważny czytelnik zauważy, że w przypadku pisania aplikacji serwerowej z GUI, na przykład w HTML5 możesz zaoszczędzić. W tym przypadku tworzenie aplikacji klienckich nie jest wymagane - interfejs użytkownika zapewnia przeglądarka. W tym artykule nie uwzględniono takiego przypadku, mówimy o rozwoju „natywnych” (natywnych) aplikacji na urządzenia mobilne.

Miałem okazję pracować w zespole z pełnym kompletem, ale bądź realistą – nie zawsze zasoby ludzkie i budżet pozwalają na zgromadzenie takiego zespołu. A czasem trzeba połączyć role: kierownik projektu + programista aplikacji serwerowych, programista aplikacji klienckiej + tester.

Technologie, narzędzia, biblioteki
Aby stworzyć mobilny serwer kliencki, zwykle używam następującego stosu „darmowych” technologii:
Apache Tomcat to kontener serwletów;
MySQL - DBMS;
Subversion to system kontroli wersji;
Maven - framework do automatyzacji montażu projektów;
JUnit - zapewni ;
Apache Log4j - biblioteka logów;
Jenkins to system ciągłej integracji;
Hibernate - ORM (ustawienia, konfiguracja we właściwościach, pliki xml i adnotacje)
hibernate-generic-dao - implementacja DAO od Google, implementuje główne metody pracy z danymi bazy danych, upraszcza implementację filtrowania i sortowania w metodach;
- implementacja uwierzytelniania i autoryzacji (bezpieczeństwo), kontener usług i bean (konfiguracja w plikach xml i adnotacje), wykorzystujemy go również przy tworzeniu testów.

W zależności od specyfiki systemu i wymagań dla niego, korzystam z jednej z 2 opcji implementacji protokołu wymiany danych.
Gdy wymagana jest wieloplatformowość, szybkość, prostota, wydajność, skalowalność, otwarte API, wtedy biorę Jersey - implementację usług internetowych REST (RESTful Web services). Ta biblioteka umożliwia korzystanie z serializacji danych w formacie JSON lub/i XML. Konfiguracja REST jest utrzymywana za pomocą adnotacji. Do wymiany z urządzeniami mobilnymi przyjęto format JSON ze względu na to, że ma prostszą implementację po stronie klienta (z tego powodu nie korzystamy z „klasycznych” serwisów WWW), generowany jest mniejszy ruch. Jersey pozwala dostroić się do najbardziej odpowiedniego „rodzaju” JSON.
W przeciwnym razie, jeśli potrzebujesz wieloplatformowej, wysokiej wydajności, prostoty, wydajności, interaktywności, to biorę
Apache MINA to framework do tworzenia aplikacji sieciowych,
Protobuf Google to ustrukturyzowana biblioteka kodowania i dekodowania danych. Strukturę danych określają pliki nagłówkowe *.proto, z których kompilator generuje klasy Java (możliwe jest również ich generowanie dla innych języków programowania: C++, Objective-C itp., co zapewnia właściwość cross-platform) ;
java.util.concurrent - użyj standardowego pakietu.
Ta opcja może być skalowana, ale musi być zaplanowana na etapie projektowania na poziomie architektury z uwzględnieniem logiki biznesowej.

Rozważmy hipotetyczne zadanie na przykładzie wyboru technologii dla rzeczywistej usługi SaaS - „Auknem Services Auction”, która pozwala ludziom złożyć zamówienie na wykonanie wymaganych usług lub prac, a organizacje z kolei zostawiają im swoje oferty . Domyślnie przyjmujemy wszystkie podstawowe wymagania. W związku z tym, że rejestracja w tym systemie jest bezpłatna i bezpłatna, zdecydowanie konieczne jest dodanie do nich skalowalności. A co z interaktywnością? Byłoby fajnie poinformować kontrahentów (wykonawców) o tworzeniu nowych zleceń, a klientów o otrzymanych propozycjach w tym samym momencie w aplikacji, a nie tylko przez e-mail. Na tej podstawie zaimplementujemy Apache MINA, protobuf Google. Patrzymy na następującą właściwość - otwarte API. Usługa jest publiczna, więc załóżmy, że integracją z nią mogą być zainteresowani zewnętrzni deweloperzy. Czekać! Nie takie proste. Protokół oparty na Apache MINA jest dość zależny od implementacji, a integracja bez znajomości niuansów nie jest w żaden sposób przejrzysta. W takiej sytuacji będziesz musiał rozważyć, który czynnik jest ważniejszy i dokonać wyboru.

Wniosek
Byłoby dla mnie interesujące wiedzieć z jakich technologii, bibliotek korzystałeś przy tworzeniu serwera urządzenia mobilnego lub podobne systemy? Wszystko się zmienia, nic nie trwa wiecznie, na każdym poziomie istnieją alternatywy z własnymi zaletami i wadami: MySQL -
Podobał Ci się artykuł? Podziel się z przyjaciółmi!
Czy ten artykuł był pomocny?
tak
Nie
Dziekuję za odpowiedź!
Coś poszło nie tak i Twój głos nie został policzony.
Dziękuję Ci. Twoja wiadomość została wysłana
Znalazłeś błąd w tekście?
Wybierz, kliknij Ctrl+Enter a my to naprawimy!