Ağ istemcisi öğreticisinin bir tamamlayıcısı olarak, bu öğretici basit bir web sunucusunun piton. Emin olmak için, bu Apache veya Zope'un yerini tutmaz. BaseHTTPServer gibi modülleri kullanarak Python'da web hizmetlerini uygulamanın daha sağlam yolları da vardır. Bu sunucu soket modülünü yalnızca kullanır.
Soket modülünün çoğu Python web servis modülünün omurgası olduğunu hatırlayacaksınız. Basit ağ istemcisinde olduğu gibi, onunla bir sunucu oluşturmak Python'daki web hizmetlerinin temellerini şeffaf bir şekilde göstermektedir. BaseHTTPServer, bir sunucuyu etkilemek için soket modülünü içe aktarır.
İnceleme yoluyla, tüm ağ işlemleri istemciler ve sunucular arasında gerçekleşir. Çoğu protokolde, istemciler belirli bir adres sorar ve veri alır.
Her adres içinde çok sayıda sunucu çalışabilir. Sınır donanımdadır. Yeterli donanım (RAM, işlemci hızı vb.) İle aynı bilgisayar bir web sunucusu, bir ftp sunucusu ve posta sunucusu (pop, smtp, imap veya yukarıdakilerin tümü) aynı anda. Her hizmet bir bağlantı noktasıyla ilişkilendirilir. Bağlantı noktası bir sokete bağlıdır. Sunucu ilişkili bağlantı noktasını dinler ve o bağlantı noktasında istek alındığında bilgi verir.
Dolayısıyla, bir ağ bağlantısını etkilemek için ana bilgisayarı, bağlantı noktasını ve bu bağlantı noktasında izin verilen işlemleri bilmeniz gerekir. Çoğu web sunucusu 80 numaralı bağlantı noktasında çalışır. Ancak, yüklü bir Apache sunucusuyla çakışmayı önlemek için web sunucumuz 8080 numaralı bağlantı noktasında çalışacaktır. Diğer hizmetlerle çakışmayı önlemek için, HTTP hizmetlerini 80 veya 8080 numaralı bağlantı noktasında tutmak en iyisidir. Bunlar en yaygın ikisi. Açıkçası, bunlar kullanılırsa, açık bir bağlantı noktası bulmalı ve kullanıcıları değişiklik konusunda uyarmalısınız.
Ağ istemcisinde olduğu gibi, bu adreslerin farklı hizmetler için ortak bağlantı noktası numaraları olduğuna dikkat etmelisiniz. Müşteri, doğru adresteki doğru bağlantı noktasında doğru hizmeti istediğinde, iletişim yine de gerçekleşir. Google'ın örneğin posta hizmeti başlangıçta ortak bağlantı noktası numaralarında çalışmadı, ancak hesaplarına nasıl erişeceklerini bildikleri için kullanıcılar yine de postalarını alabilirler.
Ağ istemcisinden farklı olarak, sunucudaki tüm değişkenler kabloludur. Sürekli çalışması beklenen herhangi bir hizmet, komut satırında dahili mantığının değişkenlerine sahip olmamalıdır. Bununla ilgili tek değişiklik, bir nedenden ötürü, hizmetin zaman zaman ve çeşitli bağlantı noktası numaralarında çalışmasını isteseniz olurdu. Ancak durum buysa, sistem saatini izleyebilir ve bağlamaları buna göre değiştirebilirsiniz.
Daha önce de belirtildiği gibi, sunucunun ilişkilendirileceği ana bilgisayarı ve dinleneceği bağlantı noktasını bilmesi gerekir. Bizim amacımız için, hizmetin herhangi bir ana bilgisayar adına uygulanmasını sağlayacağız.
Liman, daha önce de belirtildiği gibi, 8080 olacaktır. Bu sunucuyu ağ istemcisi ile birlikte kullanırsanız, bu sunucuda kullanılan bağlantı noktası numarasını değiştirmeniz gerektiğini unutmayın. program.
Bilgiye erişmek veya bilgi sunmak için, Internet, bir soket oluşturmamız gerekiyor. Bu görüşmenin sözdizimi aşağıdaki gibidir:
İlk ikisi açık bir şekilde internet protokolleridir. İnternet üzerinden seyahat eden her şeye bu ailelerden erişilebilir. Birçok ağ hala IPv6'da çalışmaz. Bu nedenle, aksini bilmediğiniz sürece, varsayılan olarak IPv4'ü varsayılan olarak kullanmak ve AF_INET kullanmak en güvenlidir.
Şimdiye kadar, IP paketinin iki protokolünde (TCP ve UDP) çalıştıkları için en yaygın türler SOCK_STEAM ve SOCK_DGRAM'dır. Son üçü daha nadirdir ve bu nedenle her zaman desteklenmeyebilir.
Soketi oluşturduktan sonra, soket seçeneklerini ayarlamamız gerekir. Herhangi bir soket nesnesi için, setsockopt () yöntemini kullanarak soket seçeneklerini ayarlayabilirsiniz. Sözdizimi aşağıdaki gibidir:
Sunucuyu arayan kişiye geri bildirimde bulunmak istiyorsak, sunucunun çalışır durumda olduğunu onaylamak için bir yazdırma komutu girebiliriz.
Sunucuyu kurduktan sonra, piton verilen bağlantı noktasında bir istek yapıldığında ne yapılacağı. Bunun için isteğe değerine göre başvurur ve sürekli while döngüsünün argümanı olarak kullanırız.
Bir istek yapıldığında, sunucu isteği kabul etmeli ve onunla etkileşime geçmek için bir dosya nesnesi oluşturmalıdır.
Bu durumda, sunucu okuma ve yazma için aynı bağlantı noktasını kullanır. Bu nedenle, makefile yöntemine 'rw' argümanı verilir. Arabellek boyutunun boş uzunluğu, dosyanın o kısmını dinamik olarak belirlenecek şekilde bırakır.
Tek eylemli bir sunucu oluşturmak istemedikçe, bir sonraki adım dosya nesnesinden girdi okumaktır. Bunu yaptığımızda, fazla boşluk girdisini çıkarmaya dikkat etmeliyiz.
İstek, bir eylem, ardından bir sayfa, protokol ve kullanılan protokolün sürümü şeklinde gelir. Bir web sayfası sunmak istiyorsa, istenen girişi almak için bu girişi böler ve sonra bu sayfayı soket dosyası nesnesine yazılan bir değişkene okur. Blogda dosya okumak için bir işlev bulunabilir.
Bu öğreticiyi soket modülü ile neler yapabileceğinin biraz daha açıklayıcı olması için, sunucunun bu kısmından vazgeçeceğiz ve bunun yerine verilerin sunumunu nasıl nüanslayabileceğini göstereceğiz. Sonraki birkaç satırı program.
Bir web sayfası gönderiyorsa, ilk satır, verileri bir web tarayıcısına tanıtmanın güzel bir yoludur. Dışarıda bırakılırsa, çoğu web tarayıcısı varsayılan olarak HTML. Bununla birlikte, eğer bunu içeriyorsa, 'Tamam'ın ardından gelmelidir iki yeni satır karakterleri. Bunlar, protokol bilgilerini sayfa içeriğinden ayırmak için kullanılır.
Muhtemelen tahmin edebileceğiniz gibi, ilk satırın sözdizimi protokol, protokol sürümü, mesaj numarası ve durumdur. Daha önce taşınmış bir web sayfasına gittiyseniz, muhtemelen 404 hatası aldınız. Buradaki 200 mesaj basitçe olumlu mesajdır.
Çıktının geri kalanı, birkaç satırdan oluşan bir web sayfasıdır. Sunucunun çıktıdaki kullanıcı verilerini kullanacak şekilde programlanabileceğini göreceksiniz. Son satır, sunucu tarafından alınan web isteğini yansıtır.
Son olarak, isteğin kapanış eylemleri olarak, dosya nesnesini ve sunucu soketini kapatmamız gerekir.
Şimdi bu programı tanınabilir bir adla kaydedin. 'Python program_name.py' ile çağırdıktan sonra, hizmetin çalıştığını onaylamak için bir ileti programladıysanız, bunun ekrana yazdırılması gerekir. Terminal daha sonra duraklamış gibi görünecektir. Her şey olması gerektiği gibi. Web tarayıcınızı açın ve localhost: 8080 adresine gidin. Daha sonra verdiğimiz yazma komutlarının çıktısını görmelisiniz. Yer olması uğruna, bu programda hata işleme uygulanmadığımı lütfen unutmayın. Ancak 'vahşi' herhangi bir program serbest bırakılması gerekir.