Temel Kurulum Şeması:
İşte bu programı çalıştırmak için temel kurulum şeması.
Basit olması için, makale boyunca Sistem A'yı A_client ve Sistem B'yi B_server olarak adlandıracağız.
Dosya gereksinimleri:
İhtiyacımız var sunucu.p ve bu dosya sunucu sisteminde bulunmalıdır. Bizim durumumuzda sunucu.py B_server sisteminde olmalıdır.
Diğer iki dosya müşteri.p ve örneklem.Txt istemci sisteminde mevcut olmalıdır. Bizim durumumuzda bu iki dosya A_client sisteminde bulunmalıdır.
varsayımlar:
İşte varsayımlar:
- Terminal erişimi olan iki Linux sistemimiz olmalı.
- Tercih edilen Linux aroması Ubuntu.
- Python3 kurulu olmalıdır.
- Her iki Linux sistemi de birbirine ping atabilmeli. kullanın ping atmak
ping'i kontrol etme komutu. - Bir sistem Sunucu olarak hareket etmeli ve diğer sistem belirli bir zamanda istemci olarak hareket etmelidir.
sınırlamalar:
Daha fazla ilerlemeden önce, bu programın bazı sınırlamaları olduğunu bilmeliyiz.
- Bu programı çalıştırmak için Python3+ kurulu olmalıdır. Python eski sürümlerinde çalıştırılırsa hata veya farklı davranışlar gözlemleyebilirsiniz.
- Bu program üzerinden şimdilik sadece metin dosyası aktarılabiliyor. Metin içermeyen başka bir format dosyası başarısız olabilir.
- Programda temel programlama istisnaları ele alındı.
- Program Ubuntu'dan başka bir işletim sisteminde çalışabilir veya çalışmayabilir.
- 1024 baytlık arabellek boyutu kullanıldığından metin dosyası istemci tarafında kısa olmalıdır.
Kurulum gereksinimleri:
- Bu programı denemek için en az bir Linux sistemine ihtiyacımız var. Ancak tavsiye, ağ üzerinden birbirine bağlı iki farklı Linux sistemi kullanmaktır.
- Ethernet veya Wi-Fi veya diğer bağlantılar aracılığıyla iki sistem bağlanmalıdır.
Sunucu Kaynak Kodu:
https://github.com/linuxhintcode/web örnekleri/blob/master/python_send_file/sunucu.p
Müşteri Kaynak Kodu:
https://github.com/linuxhintcode/web örnekleri/blob/master/python_send_file/client.p
Programlar ve beklenen çıktı nasıl çalıştırılır:
İşte programı yürütmek için adımlar.
Adım 1: B_server sistemine gidin ve bir terminal açın. Bir terminali açmanın kısa yolu Alt+Ctrl+t.
Adım 2: Şimdi sunucunun bulunduğu yola gidin.py mevcut.
Adım 3: Şimdi sunucuyu çalıştırın.py aşağıdaki gibi
piton3 sunucusu.pHerhangi bir hata olmamalı ve aşağıdaki baskıları görmelisiniz
Sunucu 9898 numaralı bağlantı noktasında listeleniyorKopyalanan dosya adı recv olacak.sunucu tarafında txt
Adım 4: Şimdi terminali A_client sisteminde açın.
Adım 5: İstemcinin bulunduğu yola gidin.py ve örnek.txt var.
Adım6: Şimdi istemciyi çalıştırın.py aşağıdaki gibi
python3 istemcisi.pSunucunun IP adresini bilmemiz gerektiğini gözlemledik. B_server sisteminin IP adresini öğrenmek için aşağıdaki komutu çalıştırabiliriz.
ifconfig
Şimdi A_client sisteminin çıktısı şöyle olmalı
################## Sunucudan aşağıdaki mesaj alındı ###################|---------------------------------|
Merhaba Müşteri[IP adresi: 192.168.1.102],
**Sunucuya Hoş Geldiniz**
-sunucu
|---------------------------------|
Adım7: Şimdi B_server'a gidin ve aşağıdaki çıktıyı arayın
Dosya başarıyla kopyalandıSunucu bağlantıya kapalı
Adım8: Bir dosya adı recv olmalıdır.txt sunucu klasöründe. Bu kaydın içeriği.robots.txt aynı örnek olmalıdır.Txt.
Böylece, bir dosyayı python programı aracılığıyla istemciden sunucuya ağ üzerinden başarıyla kopyaladık.
Kod açıklamaları:
iki python dosyası var sunucu.p ve müşteri.p.
Herhangi bir kodun sunucu içinde aynı olup olmadığını bir kez açıklayacağımızı unutmayın.py ve istemci.p.
- sunucu.not:
Bu, varsayılan olarak bu sunucu anlamına gelen shebang satırıdır.py python3 kullanmalı. Bu hattın bir avantajını görelim.
sunucuyu çalıştırdık.py veya istemci.py gibi piton3 <.py file name>. Şimdi python3 kullanmadan python dosyasını çalıştırabiliriz. Aşağıdaki komutları takip edin
Süper kullanıcı moduna gidin:
sutüm izinleri ver .py dosyası:
chmod 777 sunucusu.pSunucuyu çalıştır.not:
./sunucu.py içe aktarma soketiSoket kitaplığını python programına aktarırken
bağlantı için soket kullanmak.
s = soket.priz()
Bir nesne yaratıyoruz "s" tüm soket yöntemlerine erişmek için. Bu bir OOP konseptidir.
PORT = 9898Şimdi sunucunun dinleyeceği bir bağlantı noktası seçiyoruz. Bunun yerine rezerve edilmemiş portu kullanabiliriz.
s.bağlama((", PORT))Sunucu ip adresini bu bağlantı noktasına [9898] bağlamak için bağlama yöntemini kullanıyoruz. Bir gözlem, bağlama yönteminin ilk argümanı yerine sunucunun tam IP adresini kullanabilirdik, ancak bu iyi çalıştığı için boş bırakmayı seçtik.
s.bağlama((IP adresi, PORT))dosya = open("recv.robots.txt", "wb")
Bir dosya ismi açtık “recv.txt” yazma modu için sunucuda ve dosya işaretçisi var. İstemciden bir metin dosyası kopyalamamız gerektiğinden bu gereklidir.
Doğru iken:Sunucunun işi, bir istemcinin bu 9898 bağlantı noktasındaki sunucuyla iletişim kurmasını beklemek olduğundan, sonsuz bir süre döngüsü başlatalım. Yani bu while döngüsü gereklidir.
bağlantı, adres = s.kabul etmek()Bu kod, istemciden gelen herhangi bir bağlantı isteğini kabul etmek içindir. Conn kullanacak “bağlantı" müşteri ile iletişim kurmak ve "adre" 9898 numaralı bağlantı noktasında bu sunucuya kargaşa isteği gönderen istemcinin IP adresidir.
msg = "\n\n|---------------------------------|\n Merhaba Müşteri[IP adresi:"+ addr[0] + "], \n **Sunucuya Hoş Geldiniz** \n -Sunucu\n
|---------------------------------|\n \n\n"
Bu kod, müşteriye gönderilecek bir mesaj oluşturmak içindir. Bu mesaj istemci terminalinde yazdırılmalıdır. Bu, istemcinin sunucuyla iletişim kurabildiğini doğrular.
bağlantı.gönder (mesaj.kodlamak())Şimdi mesajımız hazır ve bunu kullanarak müşteriye gönderiyoruz "bağ". Bu kod aslında müşteriye mesaj gönderir.
RecvData = bağlantı.recv(1024)Bu kod, istemci tarafından gönderilen tüm verileri alıyor. Bizim durumumuzda numunenin içeriğini bekliyoruz.metin dosyası "RecvData".
RecvData iken:RecvData koşuluyla bir while döngüsü daha boş değil. Bizim durumumuzda boş değil.
dosya.yaz(RecvData)İçeride içeriğimiz olduğunda "RecvData" o zaman o dosyaya yazıyoruz "recv.Txt" dosya işaretçisini kullanma "dosya".
RecvData = bağlantı.recv(1024)İstemciden herhangi bir veri olup olmadığını tekrar almaya çalışıyorum. bir Zamanlar "RecvData" veri yok, kod while döngüsünü kıracak.
dosya.kapat()Bu, dosya yazma ile işimiz bittiği için dosya işaretçisini kapatacaktır.
bağlantı.kapat()Bu, istemciyle olan bağlantıyı kapatacak.
kırmakBu, B_server'daki sonsuz while döngüsünden çıkmak içindir.
- müşteri.not:
Python'da argüman özelliğini kullanmak istediğimiz gibi sys kitaplığını içe aktarıyoruz.
if (len(sys.argv) > 1):ServerIp = sistem.argv[1]
Başka:
print("\n\n\n python3 istemcisi gibi çalıştır.p < serverip address > \n\n")
çıkış(1)
Dosya adı istemcisinden sonra B_server'ın IP adresini geçerken.py çalıştırırken, o sunucu IP adresini istemci içinde yakalamamız gerekiyor.
… if (len(sys.argv) > 1): => Kullanıcının en az bir bağımsız değişkeni IP adresi olarak ilettiğinden ve bu IP adresini bağımsız olarak yakaladığından emin olmak için "SunucuIP".
Kullanıcı en az bir bağımsız değişken kodu geçmezse, yardım gösterir ve koddan çıkar.
PORT = 9898Bu, B_server tarafında belirtilen bağlantı noktasıyla aynı olmalıdır.
s.bağlan((ServerIp, PORT))Bu kod, o port ile sunucu IP'sine TCP bağlantısı yapacaktır. Bu noktada yanlış olan herhangi bir şey, bağlantıda başarısızlıklara neden olur.
dosya = open("örnek.robots.txt", "rb")"Örnek" açıyoruz.txt” salt içeriği okumak için okuma modunda.
SendData = dosya.oku(1024)Dosyanın içeriğini okuma ve içine "SendData” değişken.
SendData iken:Eğer “ ise bir while döngüsü başlatıyoruzSendData” veri var. Bizim durumumuzda ise “örnek.robots.txt” boş değil, veriye sahip olmalı.
s.gönder(SendData)Artık içeriği gönderebiliriz "örneklem.Txt" soket nesnesini kullanarak sunucuya "s".
SendData = dosya.oku(1024)Bir şey kaldıysa tekrar oku. Yani dosyadan okunacak bir şey olmayacak “SendData” boş olacak ve while döngüsünden çıkacak.
s.kapat()Bu, istemci tarafındaki bağlantıyı kapatmıyor.
Ubuntu Ekran Görüntüleri Sunucu tarafı
Ubuntu Ekran Görüntüleri İstemci tarafı
Test edilmiş kombinasyonlar:
- Sunucu olarak Linux ve istemci olarak Linux: PASS
- İstemci olarak Linux ve sunucu olarak Linux: PASS
- Sunucu olarak Linux ve istemci olarak Windows10: PASS
- İstemci olarak Linux ve sunucu olarak Windows10: PASS
Öneri, sunucu ve istemci için iki Linux sistemi kullanmaktır.
Beklenen Hatalar:
- Sunucu 9898 portunda çalışmıyorsa aşağıdaki hatayı görebilirsiniz
Geri izleme (en son arama son):
Dosya "istemci.py", satır 22, içindes.bağlan((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Bağlantı reddedildi
- İstemci tarafında IP adresi geçilmezse aşağıdaki hata görülür
gibi koş
python3 istemcisi.p < serverip address >- 1 ise aşağıdaki hata görülürAziz istemci tarafındaki argüman bir IP adresi değil
Geri izleme (en son arama son):
Dosya "istemci.py", satır 22, içindes.bağlan((ServerIp, PORT))
priz.gaierror: [Errno -2] Ad veya hizmet bilinmiyor
- Bağlantı noktası 98980 gibi kullanılıyorsa aşağıdaki hata görülür
Geri izleme (en son arama son):
Dosya "istemci.py", satır 22, içindes.bağlan((ServerIp, PORT))
OverflowError: getsockaddrarg: bağlantı noktası 0-65535 olmalıdır.
- Aşağıdaki hata “örnek.txt” istemci tarafında mevcut değil.
Geri izleme (en son arama son):
Dosya "istemci.py", satır 25, içindedosya = open("örnek.robots.txt", "rb")
FileNotFoundError: [Errno 2] Böyle bir dosya veya dizin yok: 'örnek.Txt'
Sonuç:
Bu programı kullanarak python programını kullanarak bir sistemden başka bir sisteme ağ üzerinden basit bir metin dosyası gönderebiliriz. Bu bize, ağ üzerinden veri göndermek için de temel python ve soket programlama öğrenmesini sağlar.