Python Soket Dosya Aktarımı Gönder

Python Socket File Transfer Send



Bu makalenin amacı, öğrenmek python programı aracılığıyla ağ üzerinden bir metin dosyası nasıl aktarılır . Bu dosya aktarımı, python3+'da soket programlamayı kullanmak için sunucu istemci modeline dayanmaktadır.

İş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.py ve bu dosya sunucu sisteminde bulunmalıdır. Bizim durumumuzda server.py B_server sisteminde olmalıdır.





Diğer iki dosya müşteri.py ve örnek.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 atabilmelidir. Kullanmak 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:

Devam etmeden ö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ınmıştır.
  • 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 bağlı iki farklı Linux sistemi kullanmaktır.
  • İki sistem Ethernet veya Wi-Fi veya başka herhangi bir bağlantı aracılığıyla bağlanmalıdır.

Sunucu Kaynak Kodu:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/server.py

Müşteri Kaynak Kodu:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/client.py

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 server.py'nin bulunduğu yola gidin.

Adım 3: Şimdi server.py'yi aşağıdaki gibi çalıştırın

python3 sunucusu.p

Herhangi bir hata olmamalı ve aşağıdaki baskıları görmelisiniz

Sunucu 9898 numaralı bağlantı noktasında listeleniyor

Kopyalanan dosya adı sunucu tarafında recv.txt olacaktır.

Adım 4: Şimdi A_client sisteminde terminali açın.

Adım 5: client.py ve sample.txt dosyasının bulunduğu yola gidin.

Adım6: Şimdi client.py'yi aşağıdaki gibi çalıştırın

python3 istemcisi.p <B_server sistem IP'si>

Sunucunun 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: Sunucu klasöründe recv.txt adında bir dosya olmalıdır. Bu recv.txt dosyasının içeriği aynı sample.txt olmalıdır.

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.py ve müşteri.py .

Server.py ve client.py içindeki herhangi bir kodun aynı olup olmadığını bir kez açıklayacağımızı unutmayın.

  1. sunucu.py:
#!/usr/bin/env python3

Bu, varsayılan olarak bu server.py'nin python3 kullanması gerektiği anlamına gelen shebang satırıdır. Bu hattın bir avantajını görelim.

server.py veya client.py gibi yürüttük piton3 . Artık python3 kullanmadan python dosyasını çalıştırabiliriz. Aşağıdaki komutları takip edin

Süper kullanıcı moduna gidin:

onun

.py dosyasına tüm izinleri verin:

chmod777sunucu.p

server.py'yi çalıştırın:

./sunucu.p içe aktarmak priz
içe aktarılıyorprizPython programına kütüphaneolarakgidiyoruz
kullanmakpriz içinbağlantı.

s = priz.priz()

Bir nesne yaratıyoruz s tüm soket yöntemlerine erişmek için. Bu bir OOP konseptidir.

LİMAN= 9898

Şimdi sunucunun dinleyeceği bir bağlantı noktası seçiyoruz. Bunun yerine rezerve edilmemiş portu kullanabiliriz.

s.bağlamak(('',LİMAN))

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 işe yaradığından boş bırakmayı seçtik.

s.bağlamak((IP adresi,LİMAN))
dosya = açık('recv.txt', 'wb')

Sunucuda yazma modu için recv.txt adında bir dosya açtık ve dosya işaretçisini aldık. İstemciden bir metin dosyası kopyalamamız gerektiğinden bu gereklidir.

süre NS:

Sunucunun işi, bir istemcinin bu 9898 bağlantı noktasındaki sunucuyla iletişim kurmasını beklemek olduğundan, sonsuz bir while döngüsü başlatalım. Yani bu while döngüsü gereklidir.

bağlantı,adres=s.kabul()

Bu kod, istemciden gelen herhangi bir bağlantı talebini kabul etmek içindir. Conn kullanacak bağlantı müşteri ile iletişim kurmak ve adres 9898 numaralı bağlantı noktasında bu sunucuya commotion isteği gönderen istemcinin IP adresidir.

mesaj= ' | --------------------------------- | Merhaba Müşteri[IP adresi:
'
+ adres[0]+'], **Sunucuya Hoş Geldiniz** -Sunucu
| --------------------------------- | '

Bu kod, istemciye 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öndermek(mesajkodlamak())

Şimdi mesajımız hazır ve bunu kullanarak müşteriye gönderiyoruz. bağlantı Bu kod aslında istemciye mesaj gönderir.

RecvData=bağlantıtekrar(1024)

Bu kod, istemci tarafından gönderilen tüm verileri alıyor. Bizim durumumuzda sample.txt dosyasının içeriğini bekliyoruz. RecvData .

süreRecvData:

RecvData koşuluna sahip bir while döngüsü daha boş değil. Bizim durumumuzda boş değil.

dosya.yazı yazmak(RecvData)

İçeride içeriğimiz olduğunda RecvData sonra o dosyaya yazıyoruz recv.txt dosya işaretçisini kullanma dosya.

RecvData=bağlantıtekrar(1024)

İstemciden herhangi bir veri varsa tekrar alınmaya çalışılıyor. Bir kere 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ı kapatacaktır.

kırmak

Bu, B_server'daki sonsuz while döngüsünden çıkmak içindir.

  1. müşteri.py:
içe aktarmak sistem

Python'da argüman özelliğini kullanmak istediğimiz gibi sys kitaplığını içe aktarıyoruz.

Eğer (uzun(sistem.bağımsız değişken) > 1):
Sunucu Ip'si= sistem.bağımsız değişken[1]
Başka:
Yazdır(' gibi koş python3 istemci.py ')
çıkış(1)

Çalışırken client.py dosya adından sonra B_server'ın IP adresini geçtiğimiz için client içinde o server IP adresini yakalamamız gerekiyor.

…..if (len(sys.argv) > 1): => Kullanıcının en az bir argümanı IP adresi olarak ilettiğinden emin olmak ve o IP adresini insdie yakalamak için SunucuIP.

Kullanıcı en az bir argüman geçmezse, kod yardım gösterir ve koddan çıkar.

LİMAN= 9898

Bu, B_server tarafında belirtilen bağlantı noktasıyla aynı olmalıdır.

s.bağlamak((Sunucu Ip'si,LİMAN))

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 = açık('örnek.txt', 'rb')

Sample.txt dosyasını salt içeriği okumak için okuma modunda açıyoruz.

SendData= dosya.okuman(1024)

Dosyanın içeriğini okuma ve içine koyma SendData değişken.

süreSendData:

Bir while döngüsü başlatıyoruz eğer SendData verilere sahiptir. Bizim durumumuzda sample.txt boş değilse veri içermelidir.

s.göndermek(SendData)

Artık içeriği gönderebiliriz örnek.txt soket nesnesini kullanarak sunucuya s.

SendData= dosya.okuman(1024)

Bir şey kaldıysa tekrar oku. Yani dosyadan okunacak hiçbir şey olmayacak SendData boş olacak ve while döngüsünden çıkacaktır.

s.kapat()

Bu, istemci tarafındaki bağlantıyı kapatmaz.

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:

  1. Sunucu 9898 portunda çalışmıyorsa aşağıdaki hatayı görebilirsiniz.

Geri izleme (en son arama son):

Dosya'istemci.py',hat22, içinde <modül>
s.bağlamak((Sunucu Ip'si,LİMAN))
BağlantıReddedildiHatası:[Errno111]Bağlantı reddedildi
  1. İstemci tarafında IP adresi geçilmezse aşağıdaki hata görülür.

gibi koş

python3 istemcisi.p <sunucu IP adresi>
  1. 1 ise aşağıdaki hata görülürNSistemci tarafındaki argüman bir IP adresi değil

Geri izleme (en son arama son):

Dosya'istemci.py',hat22, içinde <modül>
s.bağlamak((Sunucu Ip'si,LİMAN))
priz.gai hatası:[Errno -2]İsimveyahizmetOlumsuzbilinen
  1. 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',hat22, içinde <modül>
s.bağlamak((Sunucu Ip'si,LİMAN))
taşma hatası: getsockaddrarg: bağlantı noktası olmalıdır0-65535.
  1. İstemci tarafında sample.txt yoksa aşağıdaki hata görülür.

Geri izleme (en son arama son):

Dosya'istemci.py',hat25, içinde <modül>
dosya = açık('örnek.txt', 'rb')
FileNotFoundError:[Errno2]yok öyledosya veyadizin:'örnek.txt'

Çözüm:

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.