<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Компьютерные сети &#187; Программирование ТСР-сокетов</title>
	<atom:link href="http://www.conlex.kz/category/prikladnoj-uroven/programmirovanie-tsr-soketov/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.conlex.kz</link>
	<description>Многоуровневая архитектура Интернета</description>
	<lastBuildDate>Wed, 30 Nov 2011 06:17:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Взаимодействие процессов при помощи ТСР-сокетов</title>
		<link>http://www.conlex.kz/vzaimodejstvie-processov-pri-pomoshhi-tsr-soketov/</link>
		<comments>http://www.conlex.kz/vzaimodejstvie-processov-pri-pomoshhi-tsr-soketov/#comments</comments>
		<pubDate>Sun, 31 Aug 2008 16:39:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Программирование ТСР-сокетов]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[протокол]]></category>
		<category><![CDATA[протокол tcp]]></category>

		<guid isPermaLink="false">http://www.conlex.kz/vzaimodejstvie-processov-pri-pomoshhi-tsr-soketov/</guid>
		<description><![CDATA[Как мы отмечали в разделе «Принципы работы протоколов прикладного уровня», процессы, выполняющиеся на разных вычислительных машинах, взаимодействуют друг с другом при помощи сообщений, посылаемых через сокеты. Мы представили процессы в виде домов, а сокеты — в виде дверей. Как показано на рис. 2.18, сокет является дверью между процессом и протоколом TCP. Разработчик приложения полностью контролирует [...]]]></description>
			<content:encoded><![CDATA[<p>Как мы отмечали в разделе «Принципы работы протоколов прикладного уровня», процессы, выполняющиеся на разных вычислительных машинах, взаимодействуют друг с другом при помощи сообщений, посылаемых через сокеты. Мы представили процессы в виде домов, а сокеты — в виде дверей. Как показано на рис. 2.18, сокет является дверью между процессом и протоколом TCP. Разработчик приложения полностью контролирует ту часть сокета, которая относится к прикладному уровню, почти не имея возможности воздействовать на «транспортную» часть (за исключением задания нескольких параметров протокола TCP, таких как максимальный размер буфера и сегмента).</p>
<p><a href="http://www.conlex.kz/wp-content/uploads/2008/09/218.png" title="218.png"><img src="http://www.conlex.kz/wp-content/uploads/2008/09/218.png" ilo-full-src="http://www.conlex.kz/wp-content/uploads/2008/09/218.png" alt="218.png" width="619" height="292" /></a></p>
<p>Теперь рассмотрим процесс взаимодействия клиентской и серверной программ более подробно. В функции клиента входит инициирование соединения с сервером, а сервер должен быть готовым к установлению соединения. Это означает, что, во-первых, программа-сервер должна быть запущена раньше, чем клиент сделает попытку установить соединение, и, во-вторых, что сервер должен располагать со-кетом, с помощью которого устанавливается соединение.</p>
<p>Когда серверный процесс запущен, клиент может инициировать установку ТСР-соединения с сервером. Первым действием клиентской программы является создание сокета, при этом программа указывает адрес серверного процесса, состоящий из IP-адреса и номера порта процесса. После создания сокета клиентская сторона протокола TCP осуществляет процедуру тройного рукопожатия с сервером, оканчивающуюся установлением соединения. Заметим, что процедура рукопожатия никак не сказывается на работе приложения.</p>
<p>В ходе тройного рукопожатия клиентский процесс стучит во входную дверь серверного процесса. Когда сервер слышит стук, он создает новую дверь (то есть новый сокет), относящуюся к текущему клиенту. В примере, который последует ниже, входной дверью является объект ServerSocket с именем welcomeSocket. Когда клиент стучит в эту дверь, вызывается метод accept() объекта welcomeSocket, создающий новую дверь для клиента. По окончании процедуры рукопожатия устанавливается TCP-соединение между сокетом клиента и новым сокетом сервера, который называют сокетом соединения.</p>
<p>С точки зрения приложения TCP-соединение является прямым виртуальным каналом между сокетами соединения клиента и сервера. Клиент может осуществлять передачу любых байтов через свой сокет, при этом протокол TCP гарантиру-ет, что сервер получит эти байты через свой сокет без искажений и в том же порядке, в каком они были переданы. Подобно тому как люди могут входить и выходить через одни и те же двери, клиент и сервер способны с помощью сокетов осуществлять прием и передачу информации. Рисунок 2.19 иллюстрирует сказанное.</p>
<p><a href="http://www.conlex.kz/wp-content/uploads/2008/09/219.png" title="219.png"><img src="http://www.conlex.kz/wp-content/uploads/2008/09/219.png" ilo-full-src="http://www.conlex.kz/wp-content/uploads/2008/09/219.png" alt="219.png" width="621" height="547" /></a></p>
<p>Поскольку сокеты играют центральную роль в работе приложений клиент/сервер, разработку таких приложений часто называют программированием сокетов. Перед тем как привести пример первого приложения клиент/сервер, мы бы хотели рассмотреть понятие потока данных. Под потоком данных понимается последовательность символов, передающаяся между двумя процессами. По отношению к процессу выделяют входной и выходной потоки. Входной поток процесса связывается с некоторым входным устройством (клавиатурой, сокетом и т. д.), а выходной поток — с некоторым выходным устройством (монитором, сокетом и т. д.).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conlex.kz/vzaimodejstvie-processov-pri-pomoshhi-tsr-soketov/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ядро сетевого приложения состоит из двух программ — клиента и сервера</title>
		<link>http://www.conlex.kz/yadro-setevogo-prilozheniya-sostoit-iz-dvux-programm-klienta-i-servera/</link>
		<comments>http://www.conlex.kz/yadro-setevogo-prilozheniya-sostoit-iz-dvux-programm-klienta-i-servera/#comments</comments>
		<pubDate>Sat, 30 Aug 2008 16:35:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Программирование ТСР-сокетов]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[udp]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[браузер]]></category>
		<category><![CDATA[протокол]]></category>
		<category><![CDATA[протокол ftp]]></category>
		<category><![CDATA[протокол tcp]]></category>

		<guid isPermaLink="false">http://www.conlex.kz/yadro-setevogo-prilozheniya-sostoit-iz-dvux-programm-klienta-i-servera/</guid>
		<description><![CDATA[Как упоминалось в разделе «Принципы работы протоколов прикладного уровня», ядро сетевого приложения состоит из двух программ — клиента и сервера. Когда эти программы запускаются, создаются клиентский и серверный процессы, которые взаимодействуют друг с другом, обмениваясь сообщениями через сокеты. При создании сетевого приложения главной задачей разработчика является написание программного кода для клиентской и серверной частей приложения. [...]]]></description>
			<content:encoded><![CDATA[<p>Как упоминалось в разделе «Принципы работы протоколов прикладного уровня», ядро сетевого приложения состоит из двух программ — клиента и сервера. Когда эти программы запускаются, создаются клиентский и серверный процессы, которые взаимодействуют друг с другом, обмениваясь сообщениями через сокеты. При создании сетевого приложения главной задачей разработчика является написание программного кода для клиентской и серверной частей приложения.</p>
<p>Существуют два вида приложений с архитектурой клиент/сервер. К первому виду относятся приложения, поддерживающие стандартный протокол, описанный в документах RFC. В этом случае как клиентская, так и серверная части приложения должны соответствовать всем описаниям, приведенным в RFC. Например, если приложение использует протокол FTP, то клиентская и серверная программы приложения должны быть построены в соответствии с требованиями документа RFC 959, описывающего FTP-приложения. Следование стандартам позволяет независимым разработчикам подключаться к созданию различных частей одного и того же приложения. Так, например, браузер Netscape способен успешно взаимодействовать с web-сервером Apache, а FTP-клиент, предназначенный для домашнего компьютера, — с FTP-сервером на платформе UNIX. Для приложений, разработанных по стандарту RFC, следует применять порт с номером, соответствующим используемому протоколу.</p>
<p>Второй вид приложений с архитектурой клиент/сервер — нестандартные приложения. В таких приложениях поддержка клиентом и сервером каких-либо соглашений, принятых в RFC, не обязательна. Разработчик в лице одного или нескольких человек создает клиентскую и серверную части приложения, полностью контролируя процесс написания кода. При этом другие разработчики не смогут создавать программы, взаимодействующие с нестандартным приложением. Для нестандартных приложений необходимо использовать порты с номерами, отличающимися от хорошо известных, указанных в RFC.</p>
<p>В этом и следующем разделах мы рассмотрим ключевые принципы разработки нестандартных приложений с архитектурой клиент/сервер. Одно из первых решений, которое вынужден принимать разработчик, касается выбора протокола транспортного уровня (TCP или UDP) для своего приложения. Как вы помните, протокол TCP предполагает установление логического соединения между хостами и обеспечивает надежную передачу данных. Протокол UDP, напротив, не устанавливает логического соединения, и передача пакетов осуществляется без гарантии их доставки адресату.</p>
<p>В этом разделе мы создадим простую клиентскую часть приложения, поддерживающую протокол TCP, а в следующем разделе — протокол UDP. Обе программы написаны на языке Java. Необходимо отметить, что эти же программы можно было с равным успехом писать на языке С или С++, однако наш выбор обусловлен несколькими существенными причинами. Во-первых, Java-код проще, понятнее (что особенно важно для новичков) и состоит из меньшего числа строк, чем код на С/ С++. Во-вторых, программирование приложений клиент/сервер на языке Java в последние годы получило большую популярность, и не исключено, что в ближайшие годы станет общепринятым. Не стоит отчаиваться, если вы не знакомы с языком Java: чтение кода не станет для вас проблемой, если вы обладаете навыками программирования на любом другом языке.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conlex.kz/yadro-setevogo-prilozheniya-sostoit-iz-dvux-programm-klienta-i-servera/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Пример приложения клиент/сервер на языке Java</title>
		<link>http://www.conlex.kz/primer-prilozheniya-klientserver-na-yazyke-java/</link>
		<comments>http://www.conlex.kz/primer-prilozheniya-klientserver-na-yazyke-java/#comments</comments>
		<pubDate>Thu, 01 May 2008 16:45:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Программирование ТСР-сокетов]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[udp]]></category>
		<category><![CDATA[протокол]]></category>
		<category><![CDATA[сеть]]></category>

		<guid isPermaLink="false">http://www.conlex.kz/primer-prilozheniya-klientserver-na-yazyke-java/</guid>
		<description><![CDATA[С помощью следующего приложения мы осветим вопросы программирования сокетов как для протокола TCP, так и для протокола UDP. Приложение функционирует следующим образом. 1. Клиент считывает со стандартного устройства ввода (клавиатуры) строку символов и посылает эту строку серверу через свой сокет. 2. Сервер принимает строку через свой сокет. 3. Сервер переводит все символы строки в верхний [...]]]></description>
			<content:encoded><![CDATA[<p>С помощью следующего приложения мы осветим вопросы программирования сокетов как для протокола TCP, так и для протокола UDP. Приложение функционирует следующим образом.</p>
<p>1. Клиент считывает со стандартного устройства ввода (клавиатуры) строку символов и посылает эту строку серверу через свой сокет.<br />
2. Сервер принимает строку через свой сокет.<br />
3. Сервер переводит все символы строки в верхний регистр.<br />
4. Сервер отсылает модифицированную строку клиенту.<br />
5. Клиент получает строку и печатает ее с помощью стандартного устройства вывода (монитора).</p>
<p>Мы начнем с рассмотрения приложения, в котором взаимодействие клиента и сервера осуществляется через логическое соединение по протоколу TCP (рис. 2.20).</p>
<p><a href="http://www.conlex.kz/wp-content/uploads/2008/09/220.png" title="220.png"><img src="http://www.conlex.kz/wp-content/uploads/2008/09/220.png" ilo-full-src="http://www.conlex.kz/wp-content/uploads/2008/09/220.png" alt="220.png" width="634" height="641" /></a></p>
<p>Ниже мы приведем тексты программ для клиентской и серверной сторон приложения и снабдим пояснениями каждую строку кода. Программа-клиент названа TCPClient.java, программа-сервер — TCPServer.java. Отметим, что приведенные программы лишь иллюстрируют ключевые фрагменты приложения и не претендуют на то, чтобы называться «хорошими» с точки зрения практического применения. Для улучшения программ приведенные тексты следовало бы снабдить несколькими дополнительными строками.</p>
<p>После компиляции обеих программ (каждой на своем компьютере) первой запускается программа-сервер, поскольку для установления соединения серверный процесс должен ожидать запроса со стороны клиентского процесса. Клиентский процесс создается после запуска программы-клиента, и в его функцию входит инициирование TCP-соединения с сервером. После того как соединение установлено, пользователь, находящийся на клиентской стороне, может вводить строки символов и получать их обратно в верхнем регистре.</p>
<p>Ниже приведен текст программы TCPClient.java.</p>
<blockquote><p>import java.io.*;<br />
import java.net.*;<br />
class TCPClient {<br />
public static void main(String argv[]) throws Exception<br />
{<br />
String sentence;<br />
String modifiedSentence;<br />
BufferedReader inFromUser =<br />
new BufferedReader(<br />
new InputStreamReader(System.in));<br />
Socket clientSocket = new Socket (&#8220;hostname&#8221;. 6789);<br />
DataOutputStream outToServer =<br />
new DataOutputStream(<br />
clientSocket.getOutputStream());<br />
BufferedReader inFromServer =<br />
new BufferedReader(<br />
new InputStreamReader(<br />
cli entSoket.getInputStream()));<br />
sentence = inFromUser.readLine();<br />
outToServer.writeBytes(sentence + &#8216;\n&#8217;);<br />
modifiedSentence = inFromServer.readLine();<br />
System.out.printing &#8220;FROM SERVER: &#8221; + modifiedSentence);<br />
clientSocket.close();<br />
}<br />
}</p></blockquote>
<p>Как показано на рис. 2.21, программа TCPClient создает три потока данных и один сокет.<br />
Сокет имеет название clientSocket. Поток inFromUser является входным потоком данных программы и связан со стандартным устройством ввода (клавиатурой). Все символы, вводимые с клавиатуры пользователем, попадают в поток inFromUser. Другой входной поток данных программы, inFromServer, связан с сокетом и состоит из символов, передаваемых серверной стороной приложения. Выходной поток данных программы TCPClient имеет название outToServer и также связан с сокетом. Этот поток содержит символы, передающиеся серверу для обработки.</p>
<p>Теперь рассмотрим приведенный код подробнее. Первые две строки содержат имена<br />
двух Java-пакетов, java i&#8217;о и java. net:</p>
<blockquote><p>import java.io.*;<br />
import java.net.*;</p></blockquote>
<p>Пакет java.io содержит классы входных и выходных потоков данных. Обычно этими классами являются BufferedReader и DataOutputStream, которые и были использованы в программе. Пакет java.net хранит классы, поддерживающие работу с компьютерной сетью (Socket и ServerSocket). Объект clientSocket программы порожден классом Socket.</p>
<blockquote><p>class TCPClient {<br />
public static void main(String argv[]) throws Exception<br />
{&#8230;&#8230;}<br />
}</p></blockquote>
<p><a href="http://www.conlex.kz/wp-content/uploads/2008/09/221.png" title="221.png"><img src="http://www.conlex.kz/wp-content/uploads/2008/09/221.png" ilo-full-src="http://www.conlex.kz/wp-content/uploads/2008/09/221.png" alt="221.png" width="626" height="596" /></a></p>
<p>Конструкции, аналогичные приведенной выше, являются стандартными в практике программирования на Java. Первая строка представляет собой начало блока определения класса. В ней присутствует ключевое слово class и имя определяемого класса TCPClient. Класс может содержать переменные и методы; в объявлении класса они заключены в фигурные скобки и фактически составляют блок определения класса. В классе TCPClient нет переменных, он содержит единственный метод с именем main(). Методы похожи на процедуры и функции языков, подобных С; метод main() также играет роль, схожую с функцией main() в С или С++. Когда интерпретатор Java исполняет приложение (будучи вызванным управляющим классом приложения), он обращается к методу main() этого класса. Метод mainQ вызывает все остальные методы, используемые в приложении. Если в данный момент вы впервые сталкиваетесь с Java-приложением, можете не обращать внимания на ключевые слова public, static, void, main и throws Exception.</p>
<blockquote><p>String sentence;<br />
String modifiedSentence;</p></blockquote>
<p>Приведенные две строки являются объявлениями объектов типа String. Объект sentence предназначен для хранения строки, вводимой пользователем и передаваемой серверу. Объект modifiedSentence содержит строку, принимаемую от сервера и выводимую на стандартное устройство вывода.</p>
<blockquote><p>BufferedReader inFromUser =<br />
new BufferedReader(new InputStreamReaderCSystem.in));</p></blockquote>
<p>Здесь происходит создание потокового объекта in From User типа BufferedReader. Инициализация потока данных производится объектом System.in, связывающим поток со стандартным устройством ввода. После выполнения этой команды клиенту начинают передаваться символы, вводимые пользователем с клавиатуры.</p>
<blockquote><p>Socket clientSocket = new Socket (&#8220;hostname&#8221;, 6789);</p></blockquote>
<p>В приведенной строке происходит создание объекта clientSocket типа Socket. Кроме того, при этом инициируется TCP-соединение между клиентом и сервером. Слово hostname необходимо заменить именем хоста, сохранив кавычки (например, &#8220;_fling.seas.upenn.edu&#8221;). Перед началом установки TCP-соединения клиент производит DNS-запрос IP-адреса хоста. Значение 6789 — это номер порта; вы можете выбрать другое число, однако необходимо помнить, что клиентская и серверная стороны должны использовать один и тот же номер порта. Как упоминалось ранее, IP-адрес хоста в совокупности с номером порта приложения идентифицирует серверный процесс.</p>
<blockquote><p>DataOutputStream outToServer =<br />
new DataOutputStream(clientSocket.getOutputStream());<br />
BufferedReader inFromServer =<br />
new BufferedReader(new InputStreamReader(clientSoket.getlnputstream()));</p></blockquote>
<p>Здесь происходит создание потоковых объектов, связанных с сокетом. Поток outToServer обеспечивает вывод программы через сокет, а поток inFromServer предназначен для приема данных от серверной стороны (см. рис. 2.21).</p>
<blockquote><p>sentence = inFromUser. readLineO;</p></blockquote>
<p>Эта строка помещает последовательность символов, вводимых пользователем, в переменную sentence. Ввод оканчивается нажатием пользователем клавиши Enter. Как видим, для помещения символов в переменную используется потоковый объект inFromUser.</p>
<blockquote><p>outToServer.writeBytes(sentence + &#8216;\n&#8217;);</p></blockquote>
<p>Здесь строка sentence, снабженная символом возврата каретки, помещается в выходной поток outToServer. После этого она будет передана через сокет в канал, соединяющий клиента с сервером.</p>
<blockquote><p>modifiedSentence = inFromServer. readLineO;</p></blockquote>
<p>Ответ сервера принимается во входной поток inFromServer, откуда принятая строка копируется в переменную modifiedSentence. Помещение символов в строку modifiedSentence продолжается до тех пор, пока не будет получен символ возврата каретки.</p>
<blockquote><p>System.out.println(&#8220;FROM SERVER: &#8221; + modifiedSentence);</p></blockquote>
<p>Здесь происходит вывод принятой от сервера строки на монитор,</p>
<blockquote><p>clientSocket.close();</p></blockquote>
<p>Эта строка закрывает сокет, а следовательно, и TCP-соединение между клиентом и сервером. Как будет показано в главе 3, исполнение этой команды ведет к отправке TCP-клиентом сообщения ТСР-серверу.</p>
<p>Ниже приведен текст программы TCPServer.java.</p>
<blockquote><p>import java.io.*;<br />
import java.net.*;<br />
class TCPServer {<br />
public static void main(String argv[]) throws Exception<br />
{<br />
String clientSentence;<br />
String capitalizedSentence;<br />
ServerSocket welcomeSocket = new ServerSocket (6789);<br />
while (true) {<br />
Socket connectionSocket = welcomeSocket.<br />
accept();<br />
BufferedReader inFromClient =<br />
new BufferedReader(new InputStreamReaderC<br />
connectionSocket.getInputStream()));<br />
DataOutputStream outToClient =<br />
New DataOutputStreamC connectionSocket.getOutputStream());<br />
clientSentence = inFromClient. readLineO; capitalizedSentence =<br />
clientSentence.toUpperCaseO + &#8216;\n&#8217;;<br />
outToClient.writeBytes(capitalizedSentence);<br />
}<br />
}<br />
}</p></blockquote>
<p>Программа TCPServer имеет много общего с программой TCPClient; рассмотрим ее подробнее, опустив строки, общие с программой TCPClient и описанные выше.</p>
<blockquote><p>ServerSocket welcomeSocket = new ServerSocket (6789);</p></blockquote>
<p>Здесь происходит создание объекта welcomeSocket типа ServerSocket. Объект welcomeSocket представляет собой впускающий сокет, с помощью которого клиент устанавливает первоначальный контакт с сервером. Для этого сокета используется порт с номером 6789, совпадающим с номером порта сокета клиента (мы раскроем причины совпадения номеров портов сокетов клиента и сервера в главе 3). Протокол TCP устанавливает прямой виртуальный канал между сокетом clientSocket на клиентской стороне и connectionSocket на серверной стороне, после чего клиент и сервер могут свободно осуществлять обмен информацией. После создания сокета connectionSocket сервер может вновь использовать сокет welcomeSocket для инициирования других соединений с клиентами (приведенная программа не обрабатывает новых соединений, однако ее можно модифицировать соответствующим образом).</p>
<p>Далее программа создает несколько потоковых объектов, аналогичных clientSocket.</p>
<blockquote><p>capitalizedSentence = clientSentence.toUpperCaseO + &#8216;\n&#8217;;</p></blockquote>
<p>та команда основная в приложении. Она выполняет получение строки, передаваемой клиентом, перевод строки в верхний регистр с помощью метода tollpperCase() и добавление в конец символа возврата каретки. Все остальные команды программы являются периферийными и не касаются взаимодействия сервера с клиентом.</p>
<p>Для того чтобы протестировать совместную работу наших программ, следует поместить их на разные хосты и указать в программе TCPClient имя хоста-сервера. Затем необходимо запустить программу TCPServer, чтобы создать серверный процесс. Серверный процесс будет находиться в состоянии ожидания до тех пор, пока клиентский процесс не инициирует TCP-соединение; для этого, в свою очередь, нужно запустить программу TCPClient. Наконец, чтобы проверить наше приложение в действии, следует ввести на стороне клиента строку, оканчивающуюся символом возврата каретки (он вводится нажатием клавиши Enter).</p>
<p>Используя приведенные тексты программ, вы можете создать собственное приложение клиент/сервер. Например, вы можете изменить работу сервера таким образом, что вместо перевода строки в верхний регистр он будет подсчитывать количество букв «s» в ней.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conlex.kz/primer-prilozheniya-klientserver-na-yazyke-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

