Witaj Amigo!
- Cześć Risza!
— Tematem dzisiejszego wykładu są Gniazda. Gniazdo przetłumaczone z angielskiego - Rozeta.
Wiesz już, że każdy komputer w sieci ma swój unikalny adres IP.
- Tak.
— A teraz wyobraź sobie, że masz kilka komputerów, a na każdym z nich działa kilkanaście programów współpracujących z Internetem: Skype, ICQ itp.
A te programy chcą się ze sobą komunikować.
Konieczne jest upewnienie się, że nie „przeszkadzają” sobie nawzajem. Aby Skype komunikował się ze Skype, ICQ z ICQ itp.
Pamiętasz, jak ten problem został rozwiązany za pomocą adresów URL i serwerów WWW?
- Tak, dodano porty.
- Dokładnie.
To tak, jakby zrobić wiele małych pokoi w domu i zadeklarować, że jest to budynek mieszkalny. Każdy port jest jak osobne mieszkanie.
Tak więc adres IP to unikalny numer komputera, a adres IP + port to unikalny numer określonego „mieszkania” (komórki) w komputerze, które może zajmować program.
Ta unikalna komórka nazywa się gniazdem .
Gniazdo ma swój unikalny numer, który składa się z adresu IP i numeru portu.
- Tak. Te. socket - to numer jakiejś wirtualnej komórki w komputerze, którą może zająć program? A ten drugi program będzie wysyłał do niego wiadomości w tej komórce iw ten sposób będą się komunikować?
– Nie wiem, jak to wymyśliłeś, ale tak właśnie jest.
To jest moja robotyczna intuicja.
- Świetnie. W takim razie poznajmy szczegóły.
Gniazda są w rzeczywistości najbardziej podstawowym i prymitywnym sposobem komunikacji programów w sieciach.
Java ma dwie klasy do obsługi gniazd. Są to klasy Socket i ServerSocket .
ServerSocket to specjalna klasa, której obiekty pełnią rolę serwera – tj. Mogę obsługiwać żądania, które przychodzą do określonego gniazda.
Klasa Socket jest tak naprawdę klientem Socket, dzięki któremu możemy wysłać wiadomość do jakiegoś gniazda i otrzymać odpowiedź.
Jak wysłać wiadomość do jakiegoś gniazda:
//создаем сокет
Socket clientSocket = new Socket("localhost", 4444);
//получаем OutputStream
OutputStream outputStream = clientSocket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println("Kiss my shiny metal ass!");
out.flush();
//читаем ответ
InputStream inputStream = clientSocket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String answer = in.readLine();
- Wszystko jest bardzo podobne do pobierania pliku z Internetu.
„To dlatego, kochanie, że tam też używa się gniazdek.
Gniazda są używane w rdzeniu wszystkiego lub prawie wszystkiego w sieci.
Tutaj możesz przeczytać dodatkowe informacje.
Dzięki za wykład Rysiu.
- To nie wszystko. śnić.
Teraz zrozumiemy, jak działa gniazdo serwera.
To działa trochę bardziej skomplikowane.
//создаем obiekt serwer-сокет
ServerSocket serverSocket = new ServerSocket(4444); //порт
//в цикле обрабатываем входящие соединения.
while (true)
{
//метод accept ждет, пока кто-то не подключится.
Socket socket = serverSocket.accept();
//читаем сообщение
InputStream inputStream = socket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String message = in.readLine();
//придумываем ответ – просто разворачиваем строку задом наперед
String reverseMessage = new StringBuilder(message).reverse().toString();
//отправляем ответ
OutputStream outputStream = socket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println(reverseMessage);
out.flush();
}
Chciałbym zwrócić Państwa uwagę na kilka kwestii.
Moment 1: Aby utworzyć gniazdo, należy określić adres IP (lub domenę) oraz port. Aby utworzyć gniazdo serwera, tylko port. Gniazdo serwera pojawia się tylko na komputerze, na którym zostało utworzone.
Moment 2: Klasa ServerSocket posiada metodę accept(), która po wywołaniu czeka na połączenie przychodzące. Te. metoda będzie działać w nieskończoność, dopóki jakieś gniazdo klienta nie spróbuje uzyskać do niej dostępu. Metoda accept() zaakceptuje połączenie, utworzy obiekt gniazda do komunikacji, a następnie zwróci ten obiekt.
Z punktu widzenia programisty Javy gniazdo to dwa strumienie - InputStream, z którego można odczytywać komunikaty/dane oraz OutputStream, w którym można zapisywać komunikaty/dane.
Kiedy tworzysz gniazdo serwera, w rzeczywistości istnieje port, z którym mogą łączyć się gniazda z innych komputerów. Ale do tego muszą poprawnie określić numer portu naszego gniazda i adres IP naszego komputera. Cóż, albo jego nazwa domeny.
Oto interesujący przykład dla Ciebie, możesz spróbować go przeanalizować i wykonać:
http://habrahabr.ru/post/69136/
Chodzi o to, że za pomocą gniazda serwera napisany jest prymitywny serwer WWW, do którego można po prostu uzyskać dostęp z przeglądarki.
- Wow! Serwer internetowy? Fajny! Przestudiuję to bardzo dokładnie.
Dzięki Risza.
— Wszyscy, Amigo, idźcie odpocząć!
GO TO FULL VERSION