<?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>Bilgisayar Kavramları &#187; Network(Ağ)</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/networkag/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bilgisayarkavramlari.com</link>
	<description>www.bilgisayarkavramlari.com</description>
	<lastBuildDate>Sun, 29 Jan 2012 21:38:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Büyük Tablo (Big Table)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/11/20/buyuk-tablo-big-table/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/11/20/buyuk-tablo-big-table/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 19:40:13 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Veri Tabanı (Database)]]></category>
		<category><![CDATA[Web Teknolojileri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=6072</guid>
		<description><![CDATA[Yazan: Şadi Evren ŞEKER Google tarafından geliştirilen ve arama motoru tasarımında kullanılan yaklaşımdır. Kısaca amaç, web sayfalarının daha başarılı bir şekilde depolanması (storing), bulunması (finding) ve güncellenmesidir (updating) . Google&#8217;ın konuya yaklaşımı, ucuz bilgisayarlar tarafından yüksek miktarda verinin tutulması ve işlenmesi yönündedir. Bu yaklaşımın genel bir görüntüsü aşağıdaki şekilde çizilebilir: Yukarıdaki şekilde görüldüğü üzere, bir [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan: Şadi Evren ŞEKER</p>
<p>Google tarafından geliştirilen ve arama motoru tasarımında kullanılan yaklaşımdır. Kısaca amaç, web sayfalarının daha başarılı bir şekilde depolanması (storing), bulunması (finding) ve güncellenmesidir (updating) .</p>
<p>Google&#8217;ın konuya yaklaşımı, ucuz bilgisayarlar tarafından yüksek miktarda verinin tutulması ve işlenmesi yönündedir. Bu yaklaşımın genel bir görüntüsü aşağıdaki şekilde çizilebilir:</p>
<p><img title="buyuktablo.png" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/buyuktablo.png" alt="Buyuktablo" width="350" height="324" border="0" /></p>
<p>Yukarıdaki şekilde görüldüğü üzere, bir büyük mantıksal tablo, çok sayıda küçük tabletlere bölünmüştür. Diğer bir deyişle, aslında tek bir bilgisayarda işlenecek olan mantıksal tablo, çok sayıda ufak ve nispeten daha ucuz bilgisayar tarafından işlenebilmekte / tutulabilmektedir.</p>
<p>Büyük tablo yaklaşımında, veriler aşağıdaki şekilde tutulmaktadır:</p>
<table border="1">
<tbody>
<tr>
<td>Örnek Site</td>
<td>Site Metni</td>
<td>çıpa (anchor) 1</td>
<td>çıpa (anchor)2</td>
<td>Başlık (title)</td>
</tr>
<tr>
<td>www.bilgisayarkavramlari.com</td>
<td>Sitedeki metin</td>
<td>www.sadievrenseker.com</td>
<td>www.shedai.net</td>
<td>bilgisayar mühendisliği</td>
</tr>
</tbody>
</table>
<p>Yukarıdaki tabloda gösterildiği üzere, herhangi bir büyük tablo kayıdında, sitenin adresi, sitenin metin kısmı, sitede bulunan bağlantılar (link, anchor, çıpa) vey sitenin başlığı tutulmaktadır.</p>
<p>Büyük tablo (big table) yaklaşımında, herhangi bir veriye erişmek için, erişilecek olan hücrenin, zaman bilgisi, satır bilgisi ve kolon bilgisine ihtiyaç duyulur. Örneğin yukarıdaki örnek sitenin fihristlendiği (indexing) zaman, sitenin adresi ve hangi bilgisine erişileceği (örneğin sitenin içeriği olan metin) bilgileri birleştirilerek bir erişim sağlanabilir.</p>
<p>Büyük tablo kullanımının avantajları aşağıdaki şekilde sıralanabilir.</p>
<ul>
<li>Özel bir sorgulama diline (query language) ihtiyaç duyulmaz ve dolayısıyla sorgulama dilinin iyileştirilmesi (query optimisation) gibi özel adımlara gerek yoktur.</li>
<li>Sadece satır seviyesinde işlemler gerçekleştirilir. Yani ilişkisel veritabanı (relational database) tasarımında olduğu üzere, <a href="http://www.bilgisayarkavramlari.com/2009/01/14/birlestirme-join/">tablolar arasında birleştirme (join)</a>gibi işlemlere gerek yoktur.</li>
<li>Tabletler, bütün büyük tablo (big table) sisteminde bulunan sunucular tarafından erişilebilir durumda tutulurlar.</li>
<li>Ayrıca yapılan her işlem ilave bir işlem kütüğünde (transaction log) tutulur ve bu kütüğe bütün sunucular erişebilir.</li>
<li>Sunuculardan birisinin bozulması durumunda, diğer sunuculardan birisi bu işlem kütüğüne erişerek bozulan sunucunun görevini üstlenebilir.</li>
</ul>
<p>Büyük tablonun en önemli avantajlarından birisi, satır bazında bir limitinin olmamasıdır. Yani her kayıt için sınırsız sayıda bağlantı tutulması gerekebilir. Önceden bir sayı belirlenmesi, iki yönlü olarak probleme sebep olabilirdi. Örneğin her sayfa başına 100 bağlantı tutma limiti gelmiş olsaydı, daha az olan sayfalar için gereksiz yere hafızada yer işgal edilecek, daha fazla olan sayfalar için de bağlantıların sadece ilk 100 tanesinin tutulup, geri kalanının tutulamaması gibi bir durum ortaya çıkacaktı.</p>
<p>Bu yaklaşımla, ayrıca disk erişimi de azaltılmış olur çünkü bir erişimde, site ile ilgili bütün bilgilerin okunması mümkündür. Alternatif olarak ilişkisel bir veritabanı kullanılması durumunda, site ile ilgili bilgilerin okunması ancak bütün tablolara erişildikten sonra mümkün olacaktı.</p>
<p>Elbette büyük tablo yaklaşımının karşılaştığı problemler de bulunur. Örneğin, aynı kaydın birden fazla kere geçmesi bir risktir. Örneğin aynı içeriğin internet üzerinde içerik hırsızları tarafından kopyalanması, aynı içeriğin bir kısmının aynı kaldığı yeni sürümlerinin çıkması, intihal olarak çalıntı içeriğin bulunması, çoklu gönderiler (spam, mass message) ile aynı içeriğin birden fazla divan (forum ) ve tartışma sitelerinde bulunması veya kopya siteler bu tip içerik tekrarlarının başlıca sebepleridir. Yapılan çalışmalarda, geniş kapsamlı bir <a href="http://www.bilgisayarkavramlari.com/2008/12/09/web-emeklemesi-web-crawling/">web emeklemesi (web crawling)</a> sonucu, dolaşılan sayfaların %30&#8242;luk bir bölümü, geri kalan %70&#8242;lik bölüm içerisinde tam veya benzer içerikte kopyalar bulundurmaktadır (diğer bir deyişle sadece %40&#8242;lık bir kesimin benzeri veya tam kopyası bulunmamakta %60&#8242;lık kesim ise benzer veya tam kopya olarak internette bulunmaktadır. Bu problemin çözümü için tekrarların bulunması gerekir (duplicate detection).</p>
<p>Tekrar bulma işlemi iki seviyede yapılabilir. Birincisi tam tekrarın bulunmasıdır ki buradaki amaç, birebir kopyalanan içerikleri eşleştirmektir. Diğer bir yaklaşım ise benzerliklerin bulunması ve belirli bir benzerlik seviyesinin üzerinde olan içeriklerin eşleştirilmesidir. Örneğin şu anda yazmakta olduğum yazıyı, kopyalayarak, yazar kısmına kendi ismini yazan birisi ile bu sayfadaki içeriğin eşleşmesi gerekir. Sonuçta birebir aynı değildir ama çok yakın içeriktedirler ve iki sayfa için ayrı ayrı sunucuda kaynak kullanılması problem oluşturabilir.</p>
<p>Tam benzerliğin bulunması için toplam kontrolü (checksum) yöntemleri kullanılır. Örneğin <a href="http://www.bilgisayarkavramlari.com/2008/01/12/crc-cyclic-redundancy-check-cevrimsel-fazlalik-sinamasi/">CRC (cyclic redundancy check)</a> ve benzer algoritmalar ile sayfaların toplam kontrolü yapılır ve eşleştirilir.</p>
<p>Benzer sitelerin bulunması için de geliştirilmiş algoritmalar vardır. Örneğin <a href="http://www.bilgisayarkavramlari.com/2011/11/19/simhash-benzerlik-ozeti/">SimHash algoritması (benzerlik özeti)</a> bu algoritmalara bir örnektir ve google tarafından da kullanılmaktadır.</p>

<p class="sayac_bilgi">269 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/11/20/buyuk-tablo-big-table/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CDMA (code division multiple access)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/11/09/cdma-code-division-multiple-access/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/11/09/cdma-code-division-multiple-access/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 03:42:47 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Mantık Devreleri (Logic Circuits)]]></category>
		<category><![CDATA[Network(Ağ)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=6012</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde, özellikle ağ (network) konusunda geçen ve bir ortamı, birden fazla veri kanalının iletişimi için kullanılan yöntemlerden birisidir. Literatürde sıkça geçen diğer çok kanallı veri iletişim yöntemleri, TDMA (time division multiple access , zaman paylaşımlı çoklu erişim) ve FDMA (frequency division multiple access, frekans paylaşımlı çoklu erişim) yöntemleridir. CDMA [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde, özellikle ağ (network) konusunda geçen ve bir ortamı, birden fazla veri kanalının iletişimi için kullanılan yöntemlerden birisidir. Literatürde sıkça geçen diğer çok kanallı veri iletişim yöntemleri, <a href="http://www.bilgisayarkavramlari.com/2007/12/16/zaman-bolmeli-coklama-time-division-multiplexing-tdm/">TDMA (time division multiple access , zaman paylaşımlı çoklu erişim)</a> ve <a href="http://www.bilgisayarkavramlari.com/2007/12/16/frekans-bolmeli-coklama-siklik-bolmeli-coklayici-frequency-division-multiplexing-fdm/">FDMA (frequency division multiple access, frekans paylaşımlı çoklu erişim)</a> yöntemleridir.</p>
<p>CDMA yöntemini bu diğer meşhur iki yöntem ile karşılaştırmak için genelde şu şekilde bir örnek verilir. Örneğin bir odada birden çok kişinin konuşarak haberleştiğini düşünelim. TDM yaklaşımında, kişiler sırayla ve teker teker konuşmakta, ilgili alıcı konuşan kişinin mesajını almaktadır. FDM yaklaşımında, kişiler farklı ses tonları ile konuşmakta ve dolayısıyla alıcı olan kişi, ilgili ses tonuna dikkatini vererek iletilen mesajı almaktadır. CDMA yaklaşımında ise, kişiler farklı lisanlarda konuşmakta, dolayısıyla o lisanı bilen kişiler tarafından algılanmakta, diğer kişiler tarafından iletilen veri gürültü olarak algılanıp dikkate alınmamaktadır.</p>
<p><strong>Örnek</strong></p>
<p>Konuyu bir örnek üzerinden açıklamaya çalışalım. Örneğin 4 farklı veri kanalı üzerinden veri akmakta olsun ve bunları CDMA yöntemi ile tek bir kanaldan taşımak isteyelim.</p>
<ul>
<li>V1: 1101</li>
<li>V2: 0010</li>
<li>V3: 1010</li>
<li>V4: 0011</li>
</ul>
<p>&nbsp;</p>
<p>Yukarıdaki şekilde verilen 4 farklı verinin CDMA ile nasıl taşındığını anlatalım. Verileri ilk adımda farklı frekans değerine sahip işaretler ile kodluyoruz (code). Örneğimizde kullanacağımız 4 farklı kodumuz aşağıdaki şekilde olsun:</p>
<ul>
<li>K1: 1111</li>
<li>K2: 1010</li>
<li>K3: 1100</li>
<li>K4: 1001</li>
</ul>
<p>Verilerin, kodlar tarafından işlenebilmesi için ve 4 farklı verimiz olduğu için, verilerin genliğini 4 misli şeklinde düünebiliriz. Buna göre örnek olarak son veri için kodlamayı anlatalım:</p>
<p>V4 : 0000 0000 1111 1111 (Gösterim için 0011 verisinin her elemanını 4 kere tekrarladım.)</p>
<p>K(V4,K4) : 0110 0110 1001 1001 (V4&#8242;ün, K4 ile kodlanması sonucunda, V4 üzerindeki 1 değerleri için K4&#8242;ün kendisi, V4 üzerindeki 0 değerleri için ise K4&#8242;ün tersi gelmektedir. Daha basit anlamda her V4 dörtlüsü (uzun şekilde yazılmış halini düşünün) ile K4 değerlerinin <a href="http://www.bilgisayarkavramlari.com/2008/03/13/ozel-veya-exclusive-or-farklilik-operatoru/">özel veyasının (XOR) </a>tersi alınır !(( 0000 0000 1111 1111 ) XOR ( 1001 1001 1001 1001)) şeklinde)</p>
<p>Sonuçta 4 farklı veri ve 4 farklı kodlama için aşağıdaki sonuçlara ulaşılır:</p>
<ul>
<li>K(V1,K1) : 1111 1111 0000 1111</li>
<li>K(V2,K2) : 0101 0101 1010 0101</li>
<li>K(V3,K3) : 1100 0011 1100 0011</li>
<li>K(V4,K4) : 0110 0110 1001 1001</li>
</ul>
<p>CDMA algoritmamızda, son adım olarak yukarıdaki değerleri topluyoruz. Toplamın ve yukarıdaki işlemlerin görsel olarak ifadesi aşağıdaki şekildedir:</p>
<p><img title="cdmailk.png" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/cdmailk.png" alt="Cdmailk" width="600" height="218" border="0" /></p>
<p>Yukarıdaki toplama işlemi sonucunda elde edilen verilerin, her birisinin farklı alıcılar tarafından alınmak istediğini düşünelim. Bu durumda her alıcı, almak istediği göndericinin kodlama değerini kendisinde ayarlayacak ve yukarıda elde edilen sonuç verisini kendisinde işleyecektir. Bu durum aşağıdaki şekilde gösterilmektedir:</p>
<p><img title="cdmaiki.png" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/cdmaiki.png" alt="Cdmaiki" width="600" height="315" border="0" /></p>
<p>Yukarıda görüldüğü üzere her kodlama değeri sonucunda açılan veri, orjinal olarak kodlanan ilgili veridir. Örneğin K1 kodlamasndan açılan veri V1 olarak bulunmuştur. Bu işlem diğer kodlamaları engellememektedir.</p>
<p>&nbsp;</p>
<p>CDMA yöntemi, günümüzde de kullanılan UMTS teknolojisinin temelini oluşturur. UMTS (universal mobile telecommunication system, evrensel hareketli telekomunikasyon sistemi) teknolojisi, CDMA2000 teknolojisinden sonra (IMT Multi Carrier, inter mobile telecommunications, hareketli telekomunicakasyonlar arası çoklu taşıyıcı olarak da bilinir) geliştirilen ve CDMA 2000 teknolojisi ile rekabeti amaçlayan bir teknolojidir. CDMA2000 de, UMTS&#8217;in temeli olan W-CDMA de birer 3G teknolojisidir ve cep telefonlarının aynı anda iletişimi için kullanılmaktadır.</p>

<p class="sayac_bilgi">222 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/11/09/cdma-code-division-multiple-access/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>İstatistiksel Çoklama (Statistical Multiplexing)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/11/09/istatistiksel-coklama-statistical-multiplexing/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/11/09/istatistiksel-coklama-statistical-multiplexing/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 02:26:45 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Network(Ağ)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=6006</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde, özellikle ağ (network) konusunda kullanılan bir terimdir. Ağ iletişimi için kullanılan kanalın, birden fazla veriyi aynı anda iletmesi istendiği durumlarda genel olarak TDM (zaman paylaşımı çoklamalı) veya FDM (frekans paylaşımı çoklamalı) alternatiflerinden birisi kullanılır. İstatistiksel çoklama ise, TDM paylaşımının özel bir çeşididir. Basitçe ağ genişliğini (bandwidth), istatistiksel yöntemlere [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde, özellikle ağ (network) konusunda kullanılan bir terimdir. Ağ iletişimi için kullanılan kanalın, birden fazla veriyi aynı anda iletmesi istendiği durumlarda genel olarak <a href="http://www.bilgisayarkavramlari.com/2007/12/16/zaman-bolmeli-coklama-time-division-multiplexing-tdm/">TDM (zaman paylaşımı çoklamalı)</a> veya <a href="http://www.bilgisayarkavramlari.com/2007/12/16/frekans-bolmeli-coklama-siklik-bolmeli-coklayici-frequency-division-multiplexing-fdm/">FDM (frekans paylaşımı çoklamalı)</a> alternatiflerinden birisi kullanılır. </p>
<p>İstatistiksel çoklama ise, TDM paylaşımının özel bir çeşididir. Basitçe ağ genişliğini (bandwidth), istatistiksel yöntemlere göre, transfer edilecek veriler arasında paylaştırır. Bu yüzden literatürde istatistiksel zaman bölmeli çoklama (statistical time division multiplexing, STDM) olarak da geçmektedir. </p>
<p> STDM yöntemi, birden fazla veri kanalını aynı anda taşırken, iletilmek istenen verilerin arasında rastgele bir değerle tercih yapar. Bu yüzden, klasik TDM yöntemine göre, kanalın boş kalması ihtimali yoktur. Daha iyi anlatabilmek için bir örnek verelim:</p>
<p>İletilmek istenen veriler aşağıdaki şekilde olsun:</p>
<li>V1 50Kb
<li>V2 20Kb
<li>V3 50kb
<p>Örneğin bir paketle iletebileceğimiz veri miktarı da 20Kb olsun. Yukarıdaki verilerin TDM ile iletilmesi durumunda, aşağıdakine benzer bir tablo ortaya çıkacaktır:</p>
<p>T1:V1(20Kb)<br />
T2:V2(20Kb)<br />
T3:V3(20Kb) Bu noktada bütün verilerin 20Kb&#8217;lık parçaları iletildi<br />
T4:V1(20Kb)<br />
T5:V2(20Kb) <br />
T6:V3(20Kb)<br />
T7:V1(10Kb) ilk 40kb zaten iletildiği için kalan 10Kb iletiliyor ve pakette 10Kb boşluk bulunuyor<br />
T8:V2(0Kb) V2&#8242;nin bittiğini anlıyoruz<br />
T9:V3(10Kb)</p>
<p>Yukarıda görüldüğü üzere T8 anında, 20Kb kapasitesi olan paketimiz gereksiz yere vakit kaybına sebep olmuştur. Çözüm olarak istatistiksel yöntemin kullanılması halinde, aşağıdakine benzer bir durum ortaya çıkacaktır. </p>
<p>Yukarıdaki veriler ve paket genişliği için aynı örneği STDM üzerinden çözmeye çalışalım. Öncelikle bir veri yapısı olarak <a href="http://www.bilgisayarkavramlari.com/2008/04/16/sira-queue/">sıra (queue)</a> belirliyor ve bu sırada verileri ve kalan boyutlarının bilgisini tutuyoruz:</p>
<p>Q -> V1(50Kb) -> V2(40Kb) -> V3 (50Kb) <br />
T1:V1(20Kb) Q -> V2(40Kb) -> V3(50Kb) -> V1 (30Kb) <br /> <br />
T2:V2(20Kb) Q -> V3(30Kb) -> V1(30Kb) -> V2 (20Kb)<br />
T3:V3(20Kb) Q -> V1(30Kb) -> V2(20Kb) -> V3 (30Kb)<br />
T4:V1(20Kb) Q -> V2(40Kb) -> V3(50Kb) -> V1 (10Kb) <br /> <br />
T5:V2(20Kb) Q -> V3(30Kb) -> V1(10Kb) <br />
T6:V3(20Kb) Q -> V1(10Kb) -> V3(10Kb) <br />
T7:V1(10Kb) Q -> V3(10Kb) <br />
T9:V3(10Kb) Q -> Boş</p>
<p>Yukarıda görüldüğ üzere, sıra (queue) kullanılarak erişilecek verilerin listesi tutulmuş ve bu verilere <a href="http://www.bilgisayarkavramlari.com/2008/11/19/ilk-gelen-calisir-first-come-first-serve-fsfc/">ilk gelen çalışır (first come first serve, FIFO) </a>yaklaşımı ile erişilimiştir. </p>
<p>STDM yönteminde, erişim şekli, farklı zamanlama algoritmaları (scheduling algorithms) kullanılarak iyileştirilebilir. Örneğin <a hred="http://www.bilgisayarkavramlari.com/2009/10/04/priority-queue-oncelik-sirasi-ruchan-sirasi/">öncelik sırası (priority queue) </a> kullanılarak bazı veri kanallarına öncelik verilmesi mümkündür. <a href="http://www.bilgisayarkavramlari.com/2011/01/03/fair-share-scheduling-adil-paylasimli-zamanlama/">Adil zamanlama algoritmaları ile (fair share scheduling) </a>veri iletimini dengelemek veya bütün verilerin aynı zamanda bitmesi veya küçük verinin daha hızlı iletilmesi, kullanılacak olan zamanlama algoritması ile ayarlanabilir. Hatta tamamen rast gele değerler üreterek veri iletimi rast gele bir sürece dönüştürülebilir. </p>
<p>STDM uygulamaları sırasında kullanılan diğer bir yöntem de, paket boylarının istatistiksel olarak ayarlanmasıdır. Örneğin değişken paket boyutuna sahip bir ağ yapısında, gönderilecek olan verinin özelliklerine göre (boyut, QoS&#8217;den doğan öncelik vs.) paket boyları ayarlanabilir</p>

<p class="sayac_bilgi">90 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/11/09/istatistiksel-coklama-statistical-multiplexing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jitter (Dalga Bozulumu)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/11/09/jitter-dalga-bozulumu/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/11/09/jitter-dalga-bozulumu/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 01:36:29 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Kuantum Hesaplama]]></category>
		<category><![CDATA[Network(Ağ)]]></category>
		<category><![CDATA[Resim İşleme (Image Processing)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=5992</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Genelde sinyal işleme konularında geçen bir terim olan jitter (dalga bozulumu), bilgisayar bilimlerinde, ağ (networking), çoklu ortam uygulamaları (multi media) veya resim işleme (image processing) gibi konularda geçmektedir. Jitter kavramı, kısaca bir sinyalin olması gereken değere göre hatalı dalga değeri vermesidir. Örneğin yukarıdaki şekilde bir dijital sinyal görülmektedir (resmin üstünde). [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Genelde sinyal işleme konularında geçen bir terim olan jitter (dalga bozulumu), bilgisayar bilimlerinde, ağ (networking), çoklu ortam uygulamaları (multi media) veya resim işleme (image processing) gibi konularda geçmektedir.<br />
Jitter kavramı, kısaca bir sinyalin olması gereken değere göre hatalı dalga değeri vermesidir. </p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/dalgabozulum.png" alt="Dalgabozulum" title="dalgabozulum.png" border="0" width="600" height="284" /></p>
<p>Örneğin yukarıdaki şekilde bir dijital sinyal görülmektedir (resmin üstünde). Bu sinyalin bozulmuş hali resmin ortasında ve bozulmadan kaynaklanan jitter değeri resmin ortasında gösterilmiştir. </p>
<p>Dalgada yaşanan sürekli bir bozulma olmasından dolayı, jitter terimi, faz bozulması veya faz gürültüsü (phase noise) olarak da tanımlanabilir. Dalganın anlık bir noktasında yaşanan gürültüden, bu anlamda farklıdır. </p>
<p>Sinyalde yaşanan ve sürekli olan bu bozulmanın da bir periyodundan (veya frekansından) bahsedilebilir. Dalga bozulumu frekansı (jitter frequency), bu tanıma göre, dalgada yaşanan bozulmaların en büyük değerleri arasındaki mesafedir. Diğer bir deyişle, yukarıdaki şekilde görülen ve bozulum yaşanan dalgaların frekansıdır. Dalga frekansı hesaplanırken, en büyük değerler arasındaki fark alınabileceği gibi en küçük değerler arasındaki fark da alınabilir. </p>
<p>Dalga bozulumunun yaşandığı yere göre farklı isimlendirmelerin kullanılması mümkündür. </p>
<p><b>Sarnıçlama Dalga Bozulumu (Sampling Jitter)</b>: Bu kavram, genelde işaret (sinyal) üzerinde uygulanan çevirimler sırasında ortaya çıkar. DAC (digital to analog converter, dijital verinin analog veriye çevirimi) veya tersi olan ADC (analog to digital converter, analog verinin dijital veriye çevirimi) işlemleri belirli bir zaman almaktadır. O halde sinyal işlenirken, beklenen zamana göre gecikmeli olarak sonuç elde edilecek ve nihayetinde bir dalga bozulumu yaşanacaktır. </p>
<p>Örneğin sarnıçlama yapılan (belirli aralıklarla örnekler alınan, sampling) bir sistemin, ses, ışık veya hız gibi sürekli (conitinous) bir işaret (signal) olduğunu kabul edelim. Bu işaretin belirli zamanlarda değerinin okunarak dijital ortama çevirimi, burada bahsedilen gecikmeler ve kaymalara neticede de sarnıçlama dalga bozulumuna sebep olacaktır. </p>
<p><b>Paket Dalga Bozulumu</b>: Bilgisayar ağlarında, bazı durumlarda, paketlerin belirli sıklıkta (frequency) iletilmesi beklenir. Bu sıklığın bozulması da bir dalga bozulumu (jitter) olarak kabul edilebilir. Bilgisayar ağlarındaki dalga bozulumu (jitter) aslında başlı başına bir hizmet kalitesi (quality of service) konusudur ve daha çok kabul gören PDV (packet delay variation) terimi altında kullanılmaktadır. </p>
<p>Yukarıda verilen örnekler daha da arttırılabilir. Örneğin bir CD-ROM&#8217;dan okuma sırasında, CD üzerindeki verinin aranması sırasında geçen süre, herhangi bir veri transfer yazılımı veya devresinin, veriyi göndermeye başlamasında geçen süre, <a href="http://www.bilgisayarkavramlari.com/2010/10/14/kuantum-kapilari-quantum-gates/">kuantum kapılarının (qunatum gates)</a>, elektron dönüşünden kaynaklanan (spin based) çalışma gecikmesi veya aktarılmak istenen verinin kanal kapasitesinin çok üzerinde olasından dolayı, verinin bir kısmının <a href="http://www.bilgisayarkavramlari.com/2007/12/22/tikaniklik-congestion/">tıkanıklık (congestion)</a> ile karşılaşması ve bu yüzden beklenen zamandan daha geç transfer edilmesi gibi durumlar birer dalga bozulumu (jitter) örneğidir. </p>

<p class="sayac_bilgi">129 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/11/09/jitter-dalga-bozulumu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ICMP (Internet Kontrol Mesajı Protokolü)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/09/14/icmp-internet-kontrol-mesaji-protokolu/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/09/14/icmp-internet-kontrol-mesaji-protokolu/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 11:49:10 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Standartları]]></category>
		<category><![CDATA[Network(Ağ)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/09/14/icmp-internet-kontrol-mesaji-protokolu/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER İngilizce, Internet Control Message Protocol kelimelerinin baş harflerinden oluşan kısaltmadır. Türkçe olarak İnternet Tespit Mesajı Teşrifatı olarak çevrilebilir. Genel olarak işletim sistemleri tarafından, ağda bulunan cihazların durumunu tespit amaçlı kullanılan bir teşrifattır (protocol). Örneğin bir cihaza erişilip erişilemediğini tespit için gönderilen mesaj tipidir. ICMP mesajları, birer IP paketi halinde yollanmaktadır. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>İngilizce, Internet Control Message Protocol kelimelerinin baş harflerinden oluşan kısaltmadır. Türkçe olarak İnternet Tespit Mesajı Teşrifatı olarak çevrilebilir.</p>
<p>Genel olarak işletim sistemleri tarafından, ağda bulunan cihazların durumunu tespit amaçlı kullanılan bir <a href="http://www.bilgisayarkavramlari.com/2009/08/22/3317/">teşrifattır (protocol).</a> Örneğin bir cihaza erişilip erişilemediğini tespit için gönderilen mesaj tipidir.</p>
<p>ICMP mesajları, birer IP paketi halinde yollanmaktadır. ICMP hem UDP hem de TCP üzerinde çalışabilmektedir ancak çalıştığı protokole göre farklılık gösterebilir. Örneğin UDP paketlerine itibar etmek doğru olmaz çünkü paket kaybı olabilir.</p>
<p>ICMP paketleri ayrıca üzerinde çalıştıkları <a href="http://www.bilgisayarkavramlari.com/2008/01/11/gecis-gunu-flag-day/">IP sürümüne göre (IP Version)</a> ismlendirilmektedirler. Örneğin IPv4 için olan paketlere ICMPv4, <a href="http://www.bilgisayarkavramlari.com/2008/01/11/gecis-gunu-flag-day/">IPv6</a> için olanlara ise ICMPv6 ismi verilmektedir.</p>
<p>ICMP paketlerinin 8 byte uzunluğunda bir başlığı (header) ve bunu takip eden ve değişken boyutta veri kısmı bulunur. Klasik bir windows ICMP paketi 32 byte uzunluğundaykey, klasik bir UNIX / Linux paketi ise 64 byte uzunluğundadır. Bu durumda windows için veri uzunluğu 24 byte, linux için ise 56 byte olmaktadır.</p>
<p>ICMP paketinin başlığında ilk byte, ICMP tipini belirtir. İkinci byte ICMP kodunu, üçüncü ve dördüncü bytelar ise paketin tamamının, <a href="http://www.bilgisayarkavramlari.com/2008/01/12/internet-toplam-kontrolu-internet-checksum/">toplam kontrolünü (check sum)</a> belirtir. Başlık boyutunun 8 byte olduğunu belirtimiştik, geri kalan 4 byte ise ICMP tip ve koduna göre değişiklik göstermektedir. Bu durumda ICMP paketi aşağıdaki yapıda olacaktır:</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 52px;" />
<col style="width: 56px;" />
<col style="width: 68px;" />
<col style="width: 92px;" />
<col style="width: 92px;" /></colgroup>
<tbody valign="top">
<tr style="background: #8064a2;">
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;">
<p style="text-align: center;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>Bit</strong>ler</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">
<p style="text-align: center;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>0–7</strong></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">
<p style="text-align: center;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>8–15</strong></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">
<p style="text-align: center;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>16–23</strong></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">
<p style="text-align: center;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>24–31</strong></span></p>
</td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>0</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">
<p style="text-align: center;"><span style="font-family: Times New Roman; font-size: 12pt;">Tip</span></p>
</td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">
<p style="text-align: center;"><span style="font-family: Times New Roman; font-size: 12pt;">Kod</span></p>
</td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;" colspan="2">
<p style="text-align: center;"><a href="http://www.bilgisayarkavramlari.com/2008/01/12/internet-toplam-kontrolu-internet-checksum/"><span style="font-family: Times New Roman; font-size: 12pt;">Toplam Kontrolü</span></a></p>
</td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 2.25pt; border-right: solid 0.5pt;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>32</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;" colspan="4">
<p style="text-align: center;"><span style="font-family: Times New Roman; font-size: 12pt;">Başlığın tipine ve koduna bağlı olarak devamı</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><strong>Yukarıdaki tiplerin değerine örnek olması açısından aşağıdaki tablodan istifade edilebilir:<br />
</strong></span></p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 38px;" />
<col style="width: 386px;" /></colgroup>
<tbody valign="top">
<tr style="background: #8064a2;">
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 2.25pt; border-left: none; border-bottom: solid 2.25pt; border-right: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>Tip </strong></span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 2.25pt; border-left: none; border-bottom: solid 2.25pt; border-right: none;">
<p style="text-align: center;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;">Açıklama</span></p>
</td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>0</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Eko yanıt-ping yanıtı(Echo Reply)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>3</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Hedefe Erişilemedi(Destnation Not Reachable)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>4</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Kaynak Kapatmak(Source Quench)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>5</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Yeniden Yönlendirme(Redirection Required)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>8</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Eko yanıt-ping isteği(Echo Request)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>9</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Yönlendirici tanıtımı</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>10</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Yönlendirici istemi</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>11</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Zaman aşımı&#8211;traceroute kullanır(Time to Live Exceeded)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>12</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Parametre Problemi(Parameter Problem)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>13</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Timestamp İstemi(Timestamp Request)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>14</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Timestamp Yanıtı(Timestamp Reply)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>15</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Bilgi İstemi(Information Request)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>16</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Bilgi Yanıtı(Information Reply)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>17</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="font-family: Times New Roman; font-size: 12pt;">Addres Maskesi istemi(Address Mask Request)</span></td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none; border-bottom: solid 2.25pt;"><span style="color: white; font-family: Times New Roman; font-size: 12pt;"><strong>18</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px; border-bottom: solid 2.25pt;"><span style="font-family: Times New Roman; font-size: 12pt;">Addres Maskesi yanıtı(Address Mask Reply)</span></td>
</tr>
</tbody>
</table>
</div>
<p><span style="font-family: Times New Roman; font-size: 12pt;">Yukarıdaki her tip için ayrıca kodlar bulunmaktadır.<br />
</span></p>
<p>Örneğin 5 numaralı tip olan yeniden yönlendirme tipinin (redirection required) alt kodları olarak aşağıdaki tabloda yer alan değerlerden birisi atanabilir:</p>
<p>&nbsp;</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 37px;" />
<col style="width: 511px;" /></colgroup>
<tbody valign="top">
<tr style="background: #8064a2;">
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 2.25pt; border-left: none; border-bottom: solid 2.25pt; border-right: none;">
<p style="text-align: center;"><span style="color: white;">Kod</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 2.25pt; border-left: none; border-bottom: solid 2.25pt; border-right: none;">
<p style="text-align: center;"><span style="color: white;">Açıklama</span></p>
</td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white;"><strong>0</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px;">Ağ için yönlendir (Redirect Datagram for the Network )</td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white;"><strong>1</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;">Sahibi için yönlendir (Redirect Datagram for the Host)</td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none;"><span style="color: white;"><strong>2</strong></span></td>
<td style="background: #d8d8d8; padding-left: 7px; padding-right: 7px;">Servis tipine göre ve ağa göre yönlendir (Redirect Datagram for the TOS &amp; network)</td>
</tr>
<tr>
<td style="background: #8064a2; padding-left: 7px; padding-right: 7px; border-left: none; border-bottom: solid 2.25pt;"><span style="color: white;"><strong>3</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px; border-bottom: solid 2.25pt;">Servis tipine ve sahibine göre yönlendir (Redirect Datagram for the TOS &amp; host)</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<p>Ayrıca diğer tiplerinde benzer şekilde alt kodları bulunmaktadır. ICMP paketi, ayrıca internet standartlarını belirleyen kurum olan IETF (internet engineerint task force) tarafından yayınlanan ve standartların yayınlandığı RFC dokümanlarında (yorum için talep, request for comment) 792 numaralı yayında geçmektedir. İlgili dokümana aşağıdaki bağlantıdan erişilebilir:</p>
<p><a href="http://tools.ietf.org/html/rfc792">http://tools.ietf.org/html/rfc792</a></p>

<p class="sayac_bilgi">184 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/09/14/icmp-internet-kontrol-mesaji-protokolu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eşlik Kontrol Matrisi (Parity Check Matrix)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/04/20/eslik-kontrol-matrisi-parity-check-matrix/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/04/20/eslik-kontrol-matrisi-parity-check-matrix/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 05:26:26 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[Network(Ağ)]]></category>
		<category><![CDATA[Veri Sıkıştırma (Data Compression)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/04/20/eslik-kontrol-matrisi-parity-check-matrix/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Hata kontrolü için kullanılan yöntemlerden birisidir. Veri güvenliği, veri iletimi veya veri sıkıştırma gibi alanlarda kullanılır. Genelde H sembolü ile gösterilir. Basitçe sistemde kullanılan üreteç matristen (generating matrix) çıkarılabilir. Bir eşlik kontrol matrisinin yapısı aşağıda verilmiştir: G = [I&#124;P] şeklinde bir üreteç matris olmak üzere H = [PT&#124;I] şeklinde bir [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Hata kontrolü için kullanılan yöntemlerden birisidir. Veri güvenliği, veri iletimi veya veri sıkıştırma gibi alanlarda kullanılır. Genelde H sembolü ile gösterilir. Basitçe sistemde kullanılan <a href="http://www.bilgisayarkavramlari.com/2011/04/20/uretec-matris-generator-matrix/">üreteç matristen (generating matrix)</a> çıkarılabilir. Bir eşlik kontrol matrisinin yapısı aşağıda verilmiştir:
</p>
<p>G = [I|P] şeklinde bir üreteç matris olmak üzere
</p>
<p>H = [P<sup>T</sup>|I] şeklinde bir eşlik kontrol matrisi üretilebilir.
</p>
<p>Örneğin aşağıdaki şekilde bir üreteç matrisimiz olsun:
</p>
<p><span style="font-family:Times New Roman; font-size:12pt">Örneğin aşağıdaki üreteç matrisi ele alalım:<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">| 1 0 0 1 1 |<br/>| 0 1 0 1 0 | = G<br/>| 0 0 1 1 1 |<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bu matrisin ilk kısmı olan 3×3 boyutlarındaki bölüm birim matristir<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">| 1 0 0 |<br/>| 0 1 0 | = I<br/>| 0 0 1 |<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">İkinci kısım ise P ile gösterilen üreteç matrisin özel parçasıdır:<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">| 1 1 |<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">| 1 0 | = P<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">| 1 1 |<br />
</span></p>
<p>Yukarıdaki parçaları birleştirmeden önce P matrisinin <a href="http://www.bilgisayarkavramlari.com/2008/12/29/matris-tersyuz-matrix-transpose/">tersyüzünü (transpose)</a> alıyoruz:
</p>
<p>|111|
</p>
<p>|101| = P<sup>T</sup>
	</p>
<p>Ardından birim matris ile birleştiriyoruz:
</p>
<p>|11110|
</p>
<p>|10101| = H
</p>
<p>Şeklinde yukarıda verilen üreteç matrisin, eşlik kontrol matrisi bulunur. </p>

<p class="sayac_bilgi">242 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/04/20/eslik-kontrol-matrisi-parity-check-matrix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kod Kelimesi</title>
		<link>http://www.bilgisayarkavramlari.com/2011/04/19/kod-kelimesi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/04/19/kod-kelimesi/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 10:50:56 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Derleyiciler]]></category>
		<category><![CDATA[Network(Ağ)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Veri Güvenliği(Cryptography)]]></category>
		<category><![CDATA[Veri Sıkıştırma (Data Compression)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/04/19/kod-kelimesi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Haberleşmede kullanılan bir terimdir. Bir kod kelimesi (code word), belirli bir teşrifatın (protocol, protokol) anlamlı en küçük parçasıdır. Her kod kendi başına tek bir anlam ifade eder ve bu anlam yeganedir (unique). Aynı yaklaşım programlama dilleri için de geçerlidir. Her programlama dilinde bulunan her kelime tek bir anlam ifade eder. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Haberleşmede kullanılan bir terimdir. Bir kod kelimesi (code word), belirli bir <a href="http://www.bilgisayarkavramlari.com/2009/08/22/3317/">teşrifatın (protocol, protokol)</a> anlamlı en küçük parçasıdır. Her kod kendi başına tek bir anlam ifade eder ve bu anlam yeganedir (unique).
</p>
<p>Aynı yaklaşım programlama dilleri için de geçerlidir. Her programlama dilinde bulunan her kelime tek bir anlam ifade eder.
</p>
<p>Örneğin bir programlama dilindeki &#8220;if&#8221; kelimesi, bu dildeki <a href="http://www.bilgisayarkavramlari.com/2008/01/03/derleyici-compiler/">kaynak kodda bulunan (source code)</a> kod kelimesidir (code word).
</p>
<p>Benzer durum herhangi bir haberleşme teşrifatında da olabilir.
</p>
<p>Kod kelimeleri kullanıldıkları yere göre kanal kelimeleri (channel code words) veya kaynak kelimeleri (source code words) olarak isimlendirilebilir. İlki haberleşme ikincisi ise programlama tabiridir.
</p>
<p>Ancak kavramsal olarak kaynak kelimelerinin veri sıkıştırma (data compression) veya veri güvenliği (cryptography) gibi alanlarda kullanılması da mümkündür. Örneğin uzun bir kelimeyi, daha kısa bir kelime ile ifade etmenin anlamı, bu kelimenin yerine geçen bir kaynak kod kullanılmasıdır.
</p>
<p>Benzer şekilde kanal kodları, gürültülü ortamlarda veri iletişimini güvenli hale getirmek için gereksiz ilave bilgiler içerebilir. Yani kod kelimeleri, yerine kullanıldıkları anlamdan uzun veya kısa olabilmektedirler.
</p>
<p>Veri güvenliği açısından da bir kod kelimesi, yerine kullanıldığı kelimeye dönüşü sadece belirli kişiler tarafından yapılabilen şifreli metindir. </p>

<p class="sayac_bilgi">197 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/04/19/kod-kelimesi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Birbirini Dışlama (Mutually Exclusive)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/01/05/birbirini-dislama-mutually-exclusive/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/01/05/birbirini-dislama-mutually-exclusive/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 16:29:20 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[bilgisayar felsefesi]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[işletim sistemleri]]></category>
		<category><![CDATA[Network(Ağ)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/01/05/birbirini-dislama-mutually-exclusive/</guid>
		<description><![CDATA[Yazan: Yrd. Doç. Dr. Şadi Evren ŞEKER Birbirini dışlama özelliği, birden fazla işin birbiri ile ilişkisizliğini belirtmek için kullanılan bir terimdir. Örneğin iki işlem (process) veya iki lifin (thread) birbirinden bağımsız çalışmasını, aynı anda bir işlemi yapmamasını istediğimiz zaman birbirini dışlama özelliğini kullanabiliriz. Bazı kaynaklarda, kısaca mutex (mutually exclusive kısaltması) olarak da geçer. İki adet [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan: Yrd. Doç. Dr. Şadi Evren ŞEKER</p>
<p>Birbirini dışlama özelliği, birden fazla işin birbiri ile ilişkisizliğini belirtmek için kullanılan bir terimdir. Örneğin iki <a href="http://www.bilgisayarkavramlari.com/2007/11/18/islem-process/">işlem (process)</a> veya iki <a href="http://www.bilgisayarkavramlari.com/2010/03/22/thread-iplik/">lifin (thread)</a> birbirinden bağımsız çalışmasını, aynı anda bir işlemi yapmamasını istediğimiz zaman birbirini dışlama özelliğini kullanabiliriz. Bazı kaynaklarda, kısaca mutex (mutually exclusive kısaltması) olarak da geçer.</p>
<p>İki adet <a href="http://www.bilgisayarkavramlari.com/2009/10/09/eslemeli-metotlar-synchronized-methods/">birbirine paralel ilerleyen iş için (concurrent)</a> aynı anda bir kaynağa erişme veya birbirleri için kritik olan işlemler yapma ihtimali her zaman bulunur. Örneğin bilgisayarda çalışan iki ayrı <a href="http://www.bilgisayarkavramlari.com/2010/03/22/thread-iplik/">lifin (thread)</a> JAVA dilinde ekrana aynı anda bir şeyler basmaya çalışması veya paylaşılan bir dosyaya aynı anda yazmaya çalışması, eş zamanlı programlamalarda, sıkça karşılaşılan problemlerdendir. Bu problemin çözümü için, <a href="http://www.bilgisayarkavramlari.com/2009/10/09/eslemeli-metotlar-synchronized-methods/">işlemlerin senkronize edilmesi</a> gerekir ve temel işletim sistemleri teorisinde 4 yöntem önerilir:</p>
<ul>
<li>Koşullu Değişkenler (Conditional Variable)</li>
<li><a href="http://www.bilgisayarkavramlari.com/2009/03/30/semafor-semaphore-flama-isaret/">Semaforlar (Semaphores)</a></li>
<li>Kilitler (Locks)</li>
<li>Monitörler (Monitors)</li>
</ul>
<p>Yukarıda sayılan bu 4 yöntem, basitçe iki farklı işi senkronize hale getirmeye yarar. Şayet iki ayrı işin birbirine hiçbir şekilde karışmaması isteniyorsa (mutex) bu durumda çeşitli algoritmaların kullanılmasıyla sistemdeki işlerin ayrılması sağlanabilir. Örneğin aşağıda, iki çok kullanılan algoritmaya bağlantı verilmiştir:</p>
<ul>
<li><a href="http://www.bilgisayarkavramlari.com/2011/01/06/dekker’s-algorithm/">Dekker Algoritması </a></li>
<li><a href="http://www.bilgisayarkavramlari.com/2011/01/06/peterson%e2%80%99s-algorithm/">Peterson Algoritması </a></li>
</ul>

<p class="sayac_bilgi">300 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/01/05/birbirini-dislama-mutually-exclusive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Overhead (Ek Yük)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/01/03/overhead-ek-yuk/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/01/03/overhead-ek-yuk/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 14:00:49 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[işletim sistemleri]]></category>
		<category><![CDATA[Network(Ağ)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/01/03/overhead-ek-yuk/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Genel olarak bir işin yapılması için, gereken ek maliyetlere verilen isimdir. Örneğin bir kamyonun, bir yükü taşıması için, kendisini de taşıması gerekir. Kendisini taşımasının maliyeti, bu işlemdeki ek yüktür (overhead). Bilgisayar bilimlerinde, çeşitli alanlarda farklı anlamlarla kullanılmaktadır. Örneğin veri iletişimi (network) konusunda ek yük (overhead) denildiğinde genelde bir veriyi iletmek [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Genel olarak bir işin yapılması için, gereken ek maliyetlere verilen isimdir. Örneğin bir kamyonun, bir yükü taşıması için, kendisini de taşıması gerekir. Kendisini taşımasının maliyeti, bu işlemdeki ek yüktür (overhead).
</p>
<p>Bilgisayar bilimlerinde, çeşitli alanlarda farklı anlamlarla kullanılmaktadır.
</p>
<p>Örneğin veri iletişimi (network) konusunda ek yük (overhead) denildiğinde genelde bir veriyi iletmek için kullanılan <a href="http://www.bilgisayarkavramlari.com/2009/08/22/3317/">teşrifatın (protokol)</a> kendi içindeki ilave haberleşmeleri kast edilir. Örneğin <a href="http://www.bilgisayarkavramlari.com/2009/10/17/guvenli-ag-protokolu-reliable-network-protocol/">TCP/IP protokolünü</a> ele alalım. Veriyi doğrudan iletmek yerine öncelikle 3 yönlü el sıkışma (three way hand shaking) işlemi ile taraflar arasında iletişim kurulur. Ardından her taşınan veri için TCP/IP paketinin başlık ve sonluk bilgileri de taşınır (ki bu bilgilerin içerisinde örneğin paketin nereden gelip nereye gittiği bilgisi bulunur). İşte veri iletmek için ayrılan kanal veya kaynakların bir kısmının, veriyi taşımak yerine protokole özgü ilave bilgileri taşıması genelde veri iletişimi (network) açısından ek yük (overhead) olarak isimlendirilir.
</p>
<p>Programlama dilleri açısından çağırma ek yükü (call overhead) ismi verilen kavram, bir fonksiyonun çağrılması sırasında yaşanan ek yüktür. Bir programlama dilinde, herhangi bir fonksiyon çağrıldığında, bu fonksiyonun çalışması sonucunda döneceği yer bir <a href="http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/">yığında (stack)</a> tutulur. Fonksiyon çalışıp işi bittikten sonra program akışına bu noktadan devam edilir. Bu şekilde fonksiyonlar birbirini çağırarak devam edebilir. Örneğin A fonksiyonu B&#8217;yi, B fonksiyonu C&#8217;yi … şeklinde birbirilerini çağırdıklarında fonksiyonun çalışması için gereken yere ilave olarak fonksiyon bilgisi için ilave bir yer tutulması gerekir. Bu yere ve bu yer üzerine yapılan işlemlere çağırma ek yükü (call overhead) ismi verilir.
</p>
<p>İşletim sistemleri açısından zamanlama ek yükü (scheduling overhead) ismi verilen kavram, bir zamanlama algoritmasının, işlemler arasında geçiş yaparken kaybettiği kaynaklardır. Örneğin <a href="http://www.bilgisayarkavramlari.com/2008/11/19/kesintili-zamanlama-preemptive-scheduling/">kesintili zamanlama (preemptive scheduling)</a> kullanılan algoritmalarda bu ek yük miktarı (overhead) artacaktır. </p>

<p class="sayac_bilgi">161 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/01/03/overhead-ek-yuk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAVA ile Sohbet İstemci/Sunucusu</title>
		<link>http://www.bilgisayarkavramlari.com/2009/11/20/java-ile-sohbet-istemcisunucusu/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/11/20/java-ile-sohbet-istemcisunucusu/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 00:22:34 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Network(Ağ)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/11/20/java-ile-sohbet-istemcisunucusu/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER 1. Giriş 2. Sunucu / İstemci Mimarisi (Client /Server) 3. JAVA ile ağ programlama 4. JAVA dilinde veri iletişimi için akışların (streams) kullanımı 5. JAVA dilinde Temel bir istemci sunucu (client / server) kodlaması 6. Kodların derlnemesi ve çalıştırılması 7. Java dilinde çok lifli bir istemci / sunucu kodlaması 8. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p class="shutter"><a href="#1">1. Giriş</a><br />
<a href="#2">2. Sunucu / İstemci Mimarisi (Client /Server)</a><br />
<a href="#3">3. JAVA ile ağ programlama</a><br />
<a href="#4">4. JAVA dilinde veri iletişimi için akışların (streams) kullanımı</a><br />
<a href="#5">5. JAVA dilinde Temel bir istemci sunucu (client / server) kodlaması</a><br />
<a href="#6">6. Kodların derlnemesi ve çalıştırılması</a><br />
<a href="#7">7. Java dilinde çok lifli bir istemci / sunucu kodlaması </a><br />
<a href="#8">8. Kodların derlenmesi ve çalıştırılması</a></p>
<p><span style="color:red">Lütfen dikkat: Özellikle 147 adet yazımı kopyalayan ve hiçbir mailime cevap vermeyen is34.net sitesi yöneticisi başta olmak üzere, yazılarımı kopyalayan site yöneticileri. Emek ve vakit harcayarak ürettiğim yazılarımı lütfen kopyalamayınız. Örneğin bu aşağıdaki yazıyı işimden vakit buldukça ayırdığım zamanları kullanarak toplam 3 günde yazabildim. Şayet bu tip yazıları üreten insanların emeğini basit bir iki tıklama ile kopyalayarak web yayıncılığı yaptığınızı düşünüyorsanız, ve telif hakları yasasına saygınız yoksa, ve içerik üreten insanları bu işten bezdirmek istiyorsanız yaptığınız hırsızlığa devam ediniz, ancak bundan sonra yazılarımın izinsiz bir şekilde kopyalanması durumunda hukuki işlem başlatacağımı belirtmek isterim.</span></p>
<p><strong><a name="1"></a>1. Giriş</strong></p>
<p>Bu yazının amacı, JAVA programlama dili kullanarak basit bir istemci/sunucu mimarisinin kodlanmasıdır. Sunucu / istemci mimarilerinde birden fazla istemcinin bağlanması durumunda <a href="http://www.bilgisayarkavramlari.com/2007/11/18/cok-islemlik-multi-processing/">çok işlemli  (multiprocess)</a> veya <a href="http://www.bilgisayarkavramlari.com/2010/03/22/thread-iplik/">çok lifli (multithreaded) </a>kodlama uygulanır.</p>
<p><strong><a name="2"></a>2. Sunucu / İstemci Mimarisi (Client /Server)</strong></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb1.png" alt="" /></p>
<p>İstemci / sunucu (client / server) mimarisinde bir bilgisayarın istemci veya sunucu olması oynadığı role göre değişir. Yani bir sunucu bir ağ üzerinde bir hizmet sunan bilgisayardır. Örneğin bir web sitesi yada email sunucusu basitçe bu hizmetleri sunan bilgisayarlardır. Bu anlamda bir bilgisayar duruma göre <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">istemci (client)</a> ve duruma göre de <a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">sunucu (server)</a> olabilir.</p>
<p>Birden fazla <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">istemcinin</a> aynı anda bağlandığı durumlarda, <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">bir istemcinin</a>, <a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">sunucu</a> üzerinde yaptığı işlemlerin, diğer istemcileri engellememesi için (non-blocking); diğer programlamanın ve işletim sistemlerinin bize sunduğu birden fazla işlemin aynı anda çalışmasını sağlayan çok işlemlilikten istifade edilir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb3.png" alt="" /></p>
<p>Örneğin basit bir sisteme giriş işlemi sırasında bir kullanıcının ismini ve şifresini girmesi beklenirken, diğer kullanıcıların çalışmasına devam edebilmesi için çok işlemli programlama gerekir. Bu durumda <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">istemcilerin</a> her birisi için <a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">sunucu tarafında</a> ayrı bir işlem oluşturulmalıdır.</p>
<p>JAVA programlama dilinde ne yazık ki işlem(process) oluşturma imkanı bulunmaz.  Bunun sebebi JAVA programlarının üzerinde çalıştığı JAVA Çalışma Ortamının (JRE , Java Runtime Environment) zaten bir işlem olması ve bu işlem üzerinden yeni işlemler çalıştırıldığında kontrolünün mümkün olmamasıdır. Bu duruma çözüm olarak JAVA geliştiricileri,<a href="http://www.bilgisayarkavramlari.com/2010/03/22/thread-iplik/"> çok lifli (multi threaded)</a> programlamaya izin veren bir ortam geliştirmişlerdir.</p>
<p>Kısaca java ortamında, bizim örneğimizdeki sohbet programı gibi, aynı anda birden fazla işin yapılması istendiğinde <a href="http://www.bilgisayarkavramlari.com/2010/03/22/thread-iplik/">çok lifli (multithreaded)</a> programlama kullanılır.</p>
<p>Yukarıdaki temel konuların açıklamasından sonra programlamaya başlayabiliriz. Programlama sırasında öncelikle ağ bağlantılarını kodlayacak, tek lifli bir ağ programını istemci / sunucu mimarisi ile geliştirdikten sonra çok lifli hale getireceğiz. Ağ olarak IP (internet protocol) üzerinde çalışan TCP (transport control protocol) kullanacağız (kısaca TCP/IP protokolü)</p>
<p><strong><a name="3"></a>3. JAVA ile ağ programlama</strong></p>
<p>JAVA dilinde ağ ile ilgili <a href="http://www.bilgisayarkavramlari.com/2008/07/15/sinif-class/">sınıflar (Class)</a> java.net paketinin içerisinde toplanmıştır. Bu paketten ServerSocket ve Socket sınıflarını kullanacağız. Ağ programlama bilgisi olmayan okuyucular için burada belirtmekte yarar gördüğüm bir nokta, ağdaki IP (internet protocol) iletişiminin bilgisayarlarda bulunan portlardan yapılmasıdır. Bir portun bağlanması (binding) sonucu bu port soket (socket) halini alır ve bu soket üzerinden artık veri iletişimi olabilir. Yani bu durumu bilgisayarımızda çok sayıdaki deliğe benzetebiliriz (port). Bu deliklerden birisinin bir boru ile başka bir bilgisayara bağlanması durumunda, artık bu delikten bırakılan veriler diğer bilgisayara ulaşacaktır. Dolayısıyla bu delik artık bir soket olmuştur ve ucu bağlıdır.</p>
<pre><span style="font-family:Courier New; font-size:10pt">Socket istemci;
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> istemci = new Socket("Bilgisayar", PortNo);
</span></pre>
<p>Yukarıdaki kod, JAVA dilinde basit bir soket oluşturmaya yarar. Buna göre verilen parametrelerden ilki bilgisayar adıdır. Bu isim bilgisayarın ağ üzerinde bulabileceği bir isim (bilgisayar ismi (host name)) veya DNS üzerinden sorgulayabileceği bir isim (örn. bir web sitesi ismi) olabileceği gibi bir IP adresi de olabilir.</p>
<p>JAVA dilinde bulunan <a href="http://www.bilgisayarkavramlari.com/2008/11/22/istisna-yakalama-kabz-i-istisna-exception-handling/">istisnalar (exceptions)</a> gereği yukarıdaki satırı tek başına kullanmak mümkün olmaz. Bunun sebebi bir soket açılması sırasında karşılaşılabilecek giriş çıkış problemleridir (I/O). Bu durumu engellemek için JAVA&#8217;nın bize sunduğu imkanlardan try / catch bloklarını kullanmamız gerekir:</p>
<pre><span style="font-family:Courier New; font-size:10pt">try{
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> Socket istemci;
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">     istemci = new Socket("Bilgisayar", PortNo);
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">}catch(IOException e){
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    System.out.println("Soket acilamadi");
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">}
</span></pre>
<p>Yukarıdaki kodun yeni halinde, try bloğunda bir problem olması durumunda catch bloğu çalışmakta dolayısıyla hata ekrana basılmaktadır.</p>
<p>Şimdiye kadar öğrendiklerimiz doğrultusunda artık iki bilgisayarın üzerinde bulunan deliklerden (port) birbirine bağlanabildiklerini ve bu bağlantı üzerinden veri akıtabildiklerini biliyoruz. Tam bu noktada bir problem söz konusudur. Şayet sunucu, <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">istemcileri (clients)</a> beklediği deliği (port) bir istemciye ayırırsa, bu delikten başka istemci bağlanamaz. Yani tek bir istemci gelip bu deliği tıkar ve yeni istemciler için bu delik artık doludur hatası oluşur.</p>
<p>Bu durumu çözmek için <a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">sunucunun</a> konuştuğu ve istemcilerin bağlanmasını beklediği delik boş tutulmalıdır. Bu deliğin tek görevi gelen bağlanma taleplerini cevaplamaktır, sunucunun sunduğu hizmet ise pek ala diğer deliklerden sunulabilir.</p>
<p>Örneğin 800 numaralı portta çalışan bir sunucuyu ele alalım. Sunucu 800 numaralı porttan bir bağlantı gelmesini bekler, bağlantı olunca bu istemciyi hemen farklı bir porta, örneğin 801 alır ve iletişim bu port üzerinden devam eder. Yeni bir istemci bağlanınca da bir sonraki , örneğin 802 alarak bu işleme devam eder. İlk istemcinin işi bittikten sonra artık yeni gelen istemciyi 801 numaralı porta alabilir.</p>
<p>Bir anlamda 800 numaralı portta bekleyen sunucu gelen bağlantı taleplerini farklı portlara yönlendirerek bu portlardan hizmet sunar. Bu işleme kısaca port atlatma denilebilir. Bu işlemi yapmak için oturup baştan kod yazmak yerine JAVA&#8217;da bize sunulan nimetlerden birisi olan ServerSocket <a href="http://www.bilgisayarkavramlari.com/2008/07/15/sinif-class/">sınıfını</a> kullanabiliriz. Bu sınıf bütün bu açıkladığımız işlemleri zaten yapmaktadır. Yani ServerSocket sınıfı verilen port numarasında beklemekte gelen bağlantıları bizim bilmediğimiz , bilmemiz de gerekmeyen portlara yönlendirmektedir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb5.png" alt="" /></p>
<p>Yukarıdaki temsili resimde gösterilen her iki bilgisayardaki deliklerin (port) bağlanarak soket haline gelmesidir. Bu resimde anlatılmak istenen, iki bilgisayar arasındaki deliklerin bir boru benzeri <a href="http://www.bilgisayarkavramlari.com/2009/04/20/fstream-file-stream-dosya-akisi/">giriş ve çıkış akışlarının (InputStream / OutputStream)</a> bağlanmasıdır.</p>
<p>ServerSocket sınıfından oluşan bir <a href="http://www.bilgisayarkavramlari.com/2008/07/15/nesne-object/">nesnenin</a> kullanımı iki aşamadan oluşur. İlk aşamada nesneyi oluştururuz:</p>
<pre><span style="font-family:Courier New; font-size:10pt">ServerSocket Sunucu;
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> try {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    Sunucu = new ServerSocket(PortNo);
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }catch (IOException e) {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">           System.out.println("Sunucu soketi acilamadi");
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }
</span></pre>
<p>Bu yazı şadi evren şeker tarafından yazılmış ve bilgisayarkavramlari.com sitesinde yayınlanmıştır. Bu içeriğin kopyalanması veya farklı bir sitede yayınlanması hırsızlıktır ve telif hakları yasası gereği suçtur.</p>
<p>Yukarıdaki şekilde açılan &#8220;Sunucu&#8221; isimli nesneyi kullanarak <a href="http://www.bilgisayarkavramlari.com/2009/04/20/fstream-file-stream-dosya-akisi/">borularımızı (streams)</a> bağlayabileceğimiz bir <a href="http://www.bilgisayarkavramlari.com/2008/07/15/nesne-object/">nesne oluşturmak</a> için aşağıdaki kod yazılır:</p>
<pre><span style="font-family:Courier New; font-size:10pt">Socket baglanti = null;
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> try {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    baglanti = Sunucu.accept();
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">        }
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> catch (IOException e) {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    System.out.println(e);
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }
</span></pre>
<p>Yukarıda, ilk aşamada oluşturulan Sunucu <a href="http://www.bilgisayarkavramlari.com/2008/07/15/nesne-object/">nesnesinin</a> accept metodu çağrılarak bir bağlantı oluşturulmuş ve bu bağlantı bir sokete yönlendirilmiştir. Artık kodun bundan sonraki bölümünde baglanti nesnesine erişilerek <a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">sunucudaki</a> veri iletişimi kontrol edilebilir.</p>
<p><strong><a name="4"></a>4. JAVA dilinde veri iletişimi için akışların (streams) kullanımı</strong></p>
<p>Ağdaki iki bilgisayarın birbiri ile konuşması için JAVA programlama dilinde bulunan <a href="http://www.bilgisayarkavramlari.com/2009/04/20/fstream-file-stream-dosya-akisi/">akışlar (streams)</a> kullanılır. Biz bu uygulamada DataInputStream ve PrintStream <a href="http://www.bilgisayarkavramlari.com/2008/07/15/sinif-class/">sınıflarını (class)</a> kullanacağız. Bu uygulamanın geliştirilmesinde veya benzer ağ uygulamalarında farklı akış sınıfları kullanılabilir. Bu akış sınıflarını birer boruya benzetmek mümkündür. Basitçe iki bilgisayardaki delikler (ports) arasında köprü kurarlar ve birinden bırakılan veri diğerine ulaşır.</p>
<p>JAVA dilinde verilerin akması için kullanılan <a href="http://www.bilgisayarkavramlari.com/2009/04/20/fstream-file-stream-dosya-akisi/">boruları (streams)</a> ikiye ayırmak mümkündür:</p>
<ul>
<li>Giriş akışları (InputStreams)</li>
<li>Çıkış Akışları (OutputStreams)</li>
</ul>
<p>Öncelikle giriş akışlarını tanımlayalım. Bunun için iki ayrı tanım yapmamız gerekecek. İstemci tarafında &#8220;istemci&#8221; isimli soket nesnesinde bağlanan kodu aşağıdaki şekilde yazabiliriz:</p>
<pre><span style="font-family:Courier New; font-size:10pt">DataInputStream input;
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> try {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    input = new DataInputStream(istemci.getInputStream());
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> catch (IOException e) {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    System.out.println();
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }
</span></pre>
<p>Öte yandan <a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">sunucu tarafında</a> &#8220;baglanti&#8221; isimli nesneden bir giriş akışı oluşturulacaktır:</p>
<pre><span style="font-family:Courier New; font-size:10pt"> DataInputStream input;
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> try {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">      input = new DataInputStream(baglanti.getInputStream());
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> catch (IOException e) {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    System.out.println(e);
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }
</span></pre>
<p>Yukarıdaki kodların yazılması sonucu hem <a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">sunucu</a> hem de <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">istemci tarafında</a> soketlerimizin arkasına boruları bağlamış oluyoruz. Artık bu input <a href="http://www.bilgisayarkavramlari.com/2008/07/15/nesne-object/">nesnesinden</a> herhangi bir değer okunduğunda, istemci için sunucudan, sunucu için ise istemciden bir veri okunmuş olur.</p>
<p>Yukarıdaki üçüncü şekilde bulunan boruların bağlanması hatırlanırsa, giriş borularına benzer şekilde (ve karşılık gelecek şekilde) çıkış borularının da bağlanması gerekir. Bu bağlantı için aşağıdaki kodlar kullanılabilir:</p>
<pre><span style="font-family:Courier New; font-size:10pt">PrintStream output;
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> try {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    output = new PrintStream(istemci.getOutputStream());
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> catch (IOException e) {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    System.out.println(e);
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }
</span></pre>
<p>Yukarıdaki bağlama işlemi PrintStream <a href="http://www.bilgisayarkavramlari.com/2008/07/15/sinif-class/">sınıfı</a> ile yapılmıştır. Bu sınıf aslında bir OutputStream tipidir. Uygulamamızda ve JAVA ağ iletişimi sırasında en çok yollanan veri tipinin String (dizgi) olduğunu kabul edebiliriz. Yukarıdaki printstream sınıfı bize java&#8217;nın en temel ekrana bilgi yazdıran System.out.println benzeri bir yazım imkanı sunar. Bu sayede yollamak istediğimiz verileri println fonksiyonunu çağırarak basitçe karşıya gönderebiliriz.</p>
<p>JAVA&#8217;da diğer bir alternatif ise yine bir OutputStream tipi olan DataOutputStream sınıfıdır. Bu sınıfta ise PrintStream&#8217;den farklı olarak String yerine byte tipi verileri yollamamıza izin verir.</p>
<pre><span style="font-family:Courier New; font-size:10pt"> DataOutputStream output;
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> try {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    output = new DataOutputStream(istemci.getOutputStream());
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> catch (IOException e) {
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt">    System.out.println(e);
</span></pre>
<pre><span style="font-family:Courier New; font-size:10pt"> }
</span></pre>
<p><strong><a name="5"></a>5. JAVA dilinde Temel bir istemci sunucu (client / server) kodlaması</strong></p>
<p>Yukarıdaki temel kodlamaları öğrendikten sonra çok lifli (multithreaded) programlamayı yine bir kenara bırakarak basit bir istemci / sunucu iletişimini kodlamaya çalışalım. Öncelikle çok tanıdık olan bir yankı sunucusu (echo server) yazalım. Literatürde çok geçen bu sunucu, kendisine gelen mesajları aynen <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">istemciye</a> geri yollar. Dolayısıyla istemcinin <a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">sunucuya</a> yolladığı mesajlar bir anlamda yankılanmış olur. Basit bir şekilde teknolojiyi anlamak için oldukça elverişli bir örnek olan bu kodun istemci tarafı aşağıdaki şekilde kodlanabilir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb7.png" alt="" /></p>
<p>Yukarıda, kodumuzun <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">istemci tarafı</a> bulunuyor. Kodu inceleyecek olursak, ilk iki satırında ağ ve giriş çıkış işlemleri için gereken importlar yapılmıştır. Ardından 6 ile 19. Satırlar arasında kullanacağımız ağ bağlantısı ve bu bağlantıdaki akışlar (streams, borular) tanımlanarak birbirine bağlanmıştır. Buradaki bağlantıya dikkat edilecek olursa istemciSoket oluşturulmuş ve bu soket üzerine hem PrintStream hem de DataInputStream bağlanmıştır.</p>
<p>Sunucu olarak verilen 127.0.0.1 IP adresi localhost veya loopback olarak geçen bilgisayarın kendisidir. Yani bağlanmaya çalıştığımız sunucunun aynı bilgisayar olduğunu kabul ediyoruz.  Şayet farklı bir bilgisayara bağlanılmak isteniyorsa buradaki IP veya bilgisayar ismi değiştirilecektir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb8.png" alt="" /></p>
<p>Yukarıdaki kod, bir önceki istemciye benzer şekilde 1234 numaralı portta bir soket oluşturmakta ve buradan gelen bağlantıları dinlemektedir. Sunucu, kodun 23. Satırında bulunan os.println fonksiyonu ile gelen mesajı geri yollamakta ve bu işi 21. Satırda açılan bir sonsuz <a href="http://www.bilgisayarkavramlari.com/2008/09/08/dongu-loop/">döngü (loop)</a> içerisinde yapmaktadır.</p>
<p><strong><a name="6"></a>6. Kodların derlnemesi ve çalıştırılması</strong></p>
<p>Kodların <a href="http://www.bilgisayarkavramlari.com/2008/01/03/derleyici-compiler/">derlenmesi (compile)</a> ve çalıştırılması aşağıdaki şekildedir:</p>
<p>Sunucu tarafı için:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb9.png" alt="" width="641" height="83" /></p>
<p>İstemci tarafı için:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb10.png" alt="" width="675" height="107" /></p>
<p>Unutulmaması gereken bir husus, sunucunun istemciden önce çalıştırılmasıdır. Aksi halde aşağıdaki şekilde bir hata alınabilir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb11.png" alt="" width="591" height="96" /></p>
<p>Bunun sebebi kodumuzda bulunan <a href="http://www.bilgisayarkavramlari.com/2008/11/22/istisna-yakalama-kabz-i-istisna-exception-handling/">istisnanın (exception)</a> tetiklenmiş olmsıdır. Çünkü bağlanılmak istenen bilgisayardaki ilgili portun arkasında soket bağlanmamıştır (bind).</p>
<p>Kodu test ederken, <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">istemci tarafından</a> bir mesajın yazılması yeterlidir. Bu mesaj sunucu tarafına ağ üzerinden iletilecek ve cevabı yine ağ üzerinden dönerek <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">istemci tarafında</a> ekrana yazılacaktır:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb12.png" alt="" width="651" height="101" /></p>
<p><strong><a name="7"></a>7. Java dilinde çok lifli bir istemci / sunucu kodlaması </strong></p>
<p>Yukarıda basit bir ağ bağlantısının nasıl kodlandığını gördükten sonra esas amacımız olan sohbet programımızı yazmaya başlayabiliriz. Kodumuz, şimdiye kadar yazdığımız koda çok benzeyecek, sadece çok lifli (multithreaded) olmasını sağlayacağız. Dolayısıyla önce kodu verip sonra açıklamasını yapalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb13.png" alt="" /><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb14.png" alt="" /></p>
<p>Yukarıdaki kodun büyük kısmı bir önceki uygulamamızla aynı olmakla birlikte, kodda yeni olan lif (thread) eklentileri bulunmaktadır. Öncelikle kodun bir lif (Thread) olarak çalışmasını sağlayan Runnable <a href="http://www.bilgisayarkavramlari.com/2008/11/22/arayuz-interface/">arayüzünü (interface)</a> implement etmesi gerekmektedir. (kodun 4. Satırında)</p>
<p>Ayrıca bu <a href="http://www.bilgisayarkavramlari.com/2008/11/22/arayuz-interface/">ara yüzün (interface)</a> gereği olarak sınıfımızda (class) bir run() metodu bulunması gerekir. Bu metod, kodun 37. Satırından itibaren kodlanmıştır. Bu metodun özelliği, lif çalıştığında bu fonksiyonun çalışmasıdır.</p>
<p>Kodun yeni olan bir diğer özelliği 25. Satırdaki yeni lif oluşturma satırıdır. Bu satırda new Thread() yazılarak yeni bir lif (Thread) oluşturulur ve içerisine sınıfımız (istemci sınıfı) olduğu gibi verilir.</p>
<p>Burada lif oluşturulup içerisine bir sınıfı verebilmek için sınıfın Runnable özelliğine haiz olması gerekir. Yani her sınıfı, bir lif oluşturup içine koymak mümkün değildir. Bunun için sınıfta bir run() metodu bulunmalıdır ve bu metodun bulunduğundan emin olmak için de Runnable ara yüzünü implement etmelidir.</p>
<p>Kodun 25. Satırından sonra artık bilgisayarımızda iki ayrı lif (thread) varlığından bahsedebiliriz. Birincisi <a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">sunucudan</a> gelen mesajları ekrana basarken diğeri kullanıcının ekranda yazdıklarını (klavyeden yazıklarını) sunucuya yollamaktadır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb15.png" alt="" /></p>
<p>Yukarıdaki temsili şekilde de gösterildiği üzere birinci lif yani kodun kendisi, kullanıcı girişlerini okuyup sunucuya gönderirken (kodun 27. Satırı) ikinci lif ise, sunucudan gelen mesajları ekrana basmaktadır (kodun 40. Satırı) bu sayede bu iki iş birbirini engellememektedir.</p>
<p><a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">Sunucu tarafında</a> ise iki ayrı sınıf kullanacağız. Sınıflardan birisi sunucunun asıl çalışan ve bağlantıları toplayan lifi (thread) olacaktır. Diğer sınıf ise sunucunun gelen her bağlantıda oluşturduğu ve sadece ilgili istemciye cevap vermesi için kullandığı liften (thread) oluşacaktır. Önce ana sunucu sınıfımızın kodunu inceleyelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb17.png" alt="" /></p>
<p>Yukarıdaki kod, daha önceden kullandığımız bağlantı ve <a href="http://www.bilgisayarkavramlari.com/2009/04/20/fstream-file-stream-dosya-akisi/">borulama</a> yaklaşımları ile 1234 numaralı porttan bir bağlantı olmasını bekler. Bu bekleme işlemi kodun 21. Satırında olmaktadır ve her bağlantı alınmasında, yeni bir istemciLif <a href="http://www.bilgisayarkavramlari.com/2008/07/15/nesne-object/">nesnesi</a> oluşturulur.</p>
<p>Burada dikkat edilecek bir nokta toplam 10 adet liften oluşan bir <a href="http://www.bilgisayarkavramlari.com/2007/05/04/array-dizi/">dizinin (Array)</a> varlığıdır. Kodun 8. Satırında tanımlanan ve 25. Satırında içerisine birer istemciLif nesnesi atanan bu dizide, bağlanan her <a href="http://www.bilgisayarkavramlari.com/2007/12/13/istemci-client-talebe/">istemci</a> için bir nesne referansı (object referrer, <a href="http://www.bilgisayarkavramlari.com/2007/10/16/pointer-gosterici-2/">gösterici (pointer)</a> ) tutulur. Bu nesne göstericileri daha sonra istemciLifini incelerken de göreceğimiz üzere istemciler arası haberleşme sırasında kullanılır.</p>
<p>Diğer bir deyişle <a href="http://www.bilgisayarkavramlari.com/2007/12/13/sunucu-server/">sunucuya</a> bir istemci bağlandıktan sonra, bu istemci için oluşturulan lif (thread) artık sohbet ederken diğer liflerle haberleşir ve bizim ağ üzerindeki sohbet programımız aslında lifler arası sohbete dönüşür. Elbette her lif kendisine bağlanan istemciye, mesajları anında iletmekte ve dolayısıyla farklı ağ konumundaki kullanıcılar da bu mesajları almaktadır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb18.png" alt="" /></p>
<p>Yukarıdaki kodda, <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">yapıcı metodun (constructor)</a> içerisinde, anaSunucudan gelen lif bilgileri ve soket bilgisi, bu <a href="http://www.bilgisayarkavramlari.com/2008/07/15/sinif-class/">sınıfa</a> geçirilmektedir. Yani yeni bir <a href="http://www.bilgisayarkavramlari.com/2008/07/15/nesne-object/">nesne (object)</a> üretilirken, bu nesne anaSunucuda kurulmuş olan bağlantıyı almakta ve bu bağlantı üzerinden çalışmasına devam etmektedir. Ayrıca anaSunucuda bulunan diğer liflerin (threads) bilgisi de bu life geçmekte ve bu sayede lifler arasında mesajlaşma ile diğer liflerden gelen mesajları alabilmekte veya yeni bir mesajı diğer liflere iletebilmektedir.</p>
<p>Kodun 18. Satırında, istemciden yeni bir isim istenmekte 19. Satırda bu isim okunmakta, 21-23. Satırlarda ise bu bağlantı diğer liflere haber verilmektedir.</p>
<p>Bilindiği üzere anaSunucuda 10 elemandan oluşan bir lif dizimiz bulunuyor, bu liflerin tamamı o anda çalışmayabilir. Çalışanlara ise bağlanan kişiyi haber vermek üzere 21. Satırda basit bir for <a href="http://www.bilgisayarkavramlari.com/2008/09/08/dongu-loop/">döngüsü (loop)</a> kurulmuş, 22. Satırda ise o lifin varlığı sınanarak şayet böyle bir lif varsa 23. Satırda o life mesaj geçirilmiştir.</p>
<p>Bu satırdan sonra yeni gelen kişinin bağlandığı o anda çalışan herkese duyurulur. Mesajlaşmasının da bundan pek bir farkı yoktur. 24. Satırdaki sonsuz döngü içerisinde 25. Satırda ağdaki istemciden okunan mesaj, 27-28. Satırlarda benzer bir döngü ile bütün liflere iletilmektedir.</p>
<p>Yukarıdaki kodda, ayrıca /cik komutu ile kullanıcının bağlantıyı koparması hedeflenmiştir. Bunun için kullanıcı bağlanır bağlanmaz, istemcisine bilgilendirme mesajı 20. Satırda yollanmıştır. Ayrıca kullanıcıdan gelen her mesaj 25. Satırda okunduktan hemen sonra 26. Satırda bu mesajın /cik harfleri ile başlayıp başlamadığı kontrol edilmiştir. Şayet başlıyorsa, 24. Satırdaki sonsuz döngü kırılarak 31. Ve 32. Satırlarla kullanıcının sohbetten ayrıldığı diğer liflere bildirilmiştir.</p>
<p><strong><a name="8"></a>8. Kodların derlenmesi ve çalıştırılması</strong></p>
<p>Kodların çalışması ve derlenmesi aşağıda gösterilmiştir:</p>
<p>Sunucu tarafında:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb19.png" alt="" width="652" height="46" /></p>
<p>İstemci tarafında:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112009_0022_JAVAileSohb20.png" alt="" width="636" height="113" /></p>
<p><a href="http://www.bilgisayarkavramlari.com/wp-content/uploads/www.bilgisayarkavramlari.com.rar">Yukarıdaki kodların çalışan birer kopyası bu bağlantıdan indirilebilir.</a></p>
<p>Yukarıdaki kodlarda, Anatol URSU&#8217;nun sitesinden faydalanılmıştır. Bu kodlara http://www.ase.md/~aursu/ClientServerThreads.html adresinden de erişilebilir.</p>

<p class="sayac_bilgi">1,024 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/11/20/java-ile-sohbet-istemcisunucusu/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

