Sūtīt Python Socket failu pārsūtīšanu

Python Socket File Transfer Send



Šī raksta mērķis ir mācīties kā pārsūtīt teksta failu tīklā, izmantojot python programmu . Šī failu pārsūtīšana ir balstīta uz servera klienta modeli, lai izmantotu ligzdas programmēšanu python3+.

Šeit ir pamata shēma šīs programmas palaišanai.









Vienkāršības labad mēs visā rakstā sauksim sistēmu A kā A_klientu un sistēmu B kā B_server.



Faila prasības:

Mums vajag server.py un šim failam jābūt klāt servera sistēmā. Mūsu gadījumā server.py jāatrodas sistēmā B_server.





Vēl divi faili klients.py un paraugs.txt jābūt klāt klientu sistēmā. Mūsu gadījumā šiem diviem failiem vajadzētu būt A_client sistēmā.

Pieņēmumi:

Šeit ir pieņēmumi:



  • Mums vajadzētu būt divām Linux sistēmām ar piekļuvi terminālim.
  • Vēlamā Linux garša ir Ubuntu .
  • Jāinstalē Python3.
  • Abām Linux sistēmām vajadzētu būt iespējai pingēt viena otru. Izmantot ping komandu, lai pārbaudītu ping.
  • Vienai sistēmai jādarbojas kā serverim, bet citai sistēmai jādarbojas kā klientam vienā noteiktā laikā.

Ierobežojumi:

Pirms turpināt, mums jāzina, ka šai programmai ir daži ierobežojumi.

  • Lai palaistu šo programmu, ir jāinstalē Python3+. Ja izmantojat python vecākas versijas, varat novērot kļūdu vai atšķirīgu uzvedību.
  • Pagaidām, izmantojot šo programmu, var pārsūtīt tikai teksta failu. Jebkurš cits formāta fails, kurā nav teksta, var neizdoties.
  • Programmā ir apstrādāti pamata programmēšanas izņēmumi.
  • Programma var darboties vai nedarboties citā OS, nevis Ubuntu.
  • Teksta failam klienta pusē jābūt īsam, jo ​​bufera izmērs ir 1024 baiti.

Iestatīšanas prasības:

  • Lai izmēģinātu šo programmu, mums ir nepieciešama vismaz viena Linux sistēma. Bet ieteikums ir izmantot divas dažādas Linux sistēmas, kas ir savienotas tīklā.
  • Divām sistēmām jābūt savienotām, izmantojot Ethernet vai Wi-Fi vai citus savienojumus.

Servera avota kods:

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

Klienta avota kods:

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

Kā palaist programmas un paredzamo rezultātu:

Šeit ir norādītas programmas izpildes darbības.

1. darbība: dodieties uz B_server sistēmu un atveriet termināli. Īss ceļš termināļa atvēršanai ir Alt+Ctrl+t.

2. solis: Tagad ejiet pa ceļu, kur atrodas server.py.

3. solis: Tagad palaidiet server.py, piemēram, zemāk

python3 serveris.py

Nevajadzētu būt nekādām kļūdām, un tālāk vajadzētu redzēt izdrukas

Serveris tiek ierakstīts portā: 9898

Kopētais faila nosaukums servera pusē būs recv.txt

4. solis: Tagad atveriet termināli A_client sistēmā.

5. darbība. Dodieties uz ceļu, kurā atrodas fails client.py un sample.txt.

6. solis: Tagad palaidiet client.py, piemēram, zemāk

python3 klients.py <B_server sistēmas IP>

Mēs esam novērojuši, ka mums jāzina servera IP adrese. Mēs varam izpildīt komandu zemāk, lai uzzinātu B_server sistēmas IP adresi.

ifconfig

Tagad A_client sistēmas izvadei vajadzētu būt šādai

################## Zemāk ziņojums tiek saņemts no servera #################
| -------------------------------- |
Sveiks Klient[IP adrese: 192.168.1.102],
** Laipni lūdzam serverī **
-Serveris
| -------------------------------- |

7. solis: Tagad dodieties uz B_server un meklējiet zemāk redzamo izvadi

Fails ir veiksmīgi nokopēts
Serveris pārtrauca savienojumu

8. solis: servera mapē jābūt vienam faila nosaukumam recv.txt. Šī recv.txt saturam jābūt tādam pašam sample.txt.

Tātad mēs esam veiksmīgi nokopējuši failu no klienta uz serveri tīklā, izmantojot python programmu.

Koda skaidrojumi:

Ir divi python faili server.py un klients.py .

Ņemiet vērā, ka mēs vienreiz izskaidrosim, vai kods server.py un client.py ir vienāds.

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

Šī ir shebang līnija, kas pēc noklusējuma nozīmē šo server.py jāizmanto python3. Apskatīsim vienu šīs līnijas priekšrocību.

Mēs esam izpildījuši server.py vai client.py, piemēram python3. Tagad, neizmantojot python3, mēs varam izpildīt python failu. Izpildiet tālāk norādītās komandas

Dodieties uz superlietotāja režīmu:

Piešķiriet visas atļaujas .py failam:

chmod777serveris.py

Palaidiet server.py:

./serveris.py importēt kontaktligzda
Importēšanakontaktligzdabibliotēku python programmāmēs ejam
izmantotkontaktligzda priekšsavienojums.

s = kontaktligzda.kontaktligzda()

Mēs veidojam objektu s lai piekļūtu visām kontaktligzdas metodēm. Šī ir OOP koncepcija.

Ostas= 9898

Tagad mēs izvēlamies vienu portu, kurā serveris klausīsies. Tā vietā mēs varam izmantot rezervētu portu.

s.saistīt(('',Ostas))

Mēs izmantojam saistīšanas metodi, lai saistītu servera IP adresi ar šo portu [9898]. Viens novērojums ir tāds, ka mēs būtu varējuši izmantot precīzu servera IP adresi saistīšanas metodes pirmā argumenta vietā, bet mēs izvēlamies atstāt tukšu, jo tas darbojas labi.

s.saistīt((IP adrese,Ostas))
failu = atvērts('recv.txt', 'wb')

Mēs esam atvēruši vienu faila nosaukumu recv.txt serverī rakstīšanas režīmam un saņēmuši faila rādītāju. Tas ir nepieciešams, jo mums ir jāpārkopē viens teksta fails no klienta.

kamēr Taisnība:

Sāksim vienu bezgalīgu ciklu, jo servera uzdevums ir gaidīt, līdz klients sazinās ar serveri šajā 9898 portā. Tātad šī cilpa ir nepieciešama.

savienot,adr=s.pieņemt()

Šis kods ir paredzēts, lai pieņemtu visus ienākošos savienojuma pieprasījumus no klienta. Conn izmantos savienot sazināties ar klientu un adr ir tā klienta IP adrese, kurš ir nosūtījis uzbudinājuma pieprasījumu šim serverim portā 9898.

msg= ' n n| -------------------------------- | nLabdien, klients [IP adrese:
'
+ adr[0]+'], n** Laipni lūdzam serverī ** n-Serveris n
| -------------------------------- | n n n'

Šis kods ir paredzēts, lai izveidotu ziņojumu, ko nosūtīt klientam. Šis ziņojums ir jāizdrukā klienta terminālī. Tas apstiprina, ka klients spēj sazināties ar serveri.

savienotnosūtīt(msg.kodēt())

Tagad mums ir sagatavots ziņojums, un pēc tam nosūtiet to klientam, izmantojot to savienot Šis kods faktiski nosūta ziņojumu klientam.

RecvData=savienotrecv(1024)

Šis kods saņem visus datus, kas tiek sūtīti no klienta puses. Mūsu gadījumā mēs sagaidām parauga.txt saturu RecvData .

kamērRecvData:

Vēl viena cilpa ar nosacījumu RecvData nav tukša. Mūsu gadījumā tas nav tukšs.

failu.rakstīt(RecvData)

Kad mums ir saturs iekšā RecvData tad mēs rakstām uz šo failu recv.txt izmantojot failu rādītāju failu.

RecvData=savienotrecv(1024)

Atkal mēģinu saņemt, ja ir kādi dati no klienta. Reiz RecvData nav datu, kods pārtrauks cikla ciklu.

failu.aizvērt()

Tas vienkārši aizvērs faila rādītāju, kā mēs esam pabeiguši ar failu rakstīšanu.

savienotaizvērt()

Tas pārtrauks savienojumu ar klientu.

pārtraukums

Tas ir jāiziet no bezgalīgas cilpas B_server.

  1. client.py:
importēt sys

Sys bibliotēkas importēšana, kā mēs vēlamies, izmanto argumentu iespēju python.

ja (len(sys.argv) > 1):
ServerIp= sys.argv[1]
citādi:
drukāt(' n nSkrien kā npython3 client.py n n')
Izeja(1)

Skrienot, mēs nododam B_server IP adresi pēc faila nosaukuma client.py, šī servera IP adrese ir jānoķer klienta iekšienē.

… ..If (len (sys.argv)> 1): => Lai lietotājs nodotu vismaz vienu argumentu kā IP adresi un noķertu šo IP adresi ServerIP.

Ja lietotājs neiziet, vismaz viens argumenta kods parāda palīdzību un iziet no koda.

Ostas= 9898

Tam jābūt tādam pašam portam, kā minēts B_server pusē.

s.savienot((ServerIp,Ostas))

Šis kods izveidos TCP savienojumu ar servera IP ar šo portu. Viss, kas nav kārtībā šajā ponintā, rada neveiksmes savienojumā.

failu = atvērts('sample.txt', 'rb')

Mēs atveram failu sample.txt lasīšanas režīmā, lai lasītu tikai saturu.

SendData= failu.lasīt(1024)

Faila satura lasīšana un ievietošana SendData mainīgais.

kamērSendData:

Mēs sākam vienu ciklu, ja SendData ir dati. Mūsu gadījumā, ja paraugs.txt nav tukšs, tam vajadzētu būt datiem.

s.nosūtīt(SendData)

Tagad mēs varam nosūtīt saturu paraugs.txt serverim, izmantojot ligzdas objektu s.

SendData= failu.lasīt(1024)

Vēlreiz lasu, ja kaut kas ir palicis. Tātad no faila nebūs ko lasīt SendData būs tukšs, un tas iznāks no cikla cikla.

s.aizvērt()

Tas nenozīmē savienojumu no klienta puses.

Ubuntu ekrānuzņēmumi servera pusē

Ubuntu ekrānuzņēmumi klienta pusē

Pārbaudītas kombinācijas:

  • Linux kā serveris un Linux kā klients: PASS
  • Linux kā klients un Linux kā serveris: PASS
  • Linux kā serveris un Windows10 kā klients: PASS
  • Linux kā klients un Windows10 kā serveris: PASS

Ieteicams serverim un klientam izmantot divas Linux sistēmas.

Paredzamās kļūdas:

  1. Tālāk redzat kļūdu, ja serveris nedarbojas 9898 portā

Traceback (pēdējais pēdējais zvans):

Fails'client.py',līnija22, iekšā <modulis>
s.savienot((ServerIp,Ostas))
ConnectionRefusedError:[Ernno111]savienojums atteikts
  1. Tālāk redzama kļūda, ja IP adrese netiek nodota klienta pusē

Skrien kā

python3 klients.py <servera adrese>
  1. Zemāk redzamā kļūda ir redzama, ja 1starguments klienta pusē nav IP adrese

Traceback (pēdējais pēdējais zvans):

Fails'client.py',līnija22, iekšā <modulis>
s.savienot((ServerIp,Ostas))
kontaktligzda.gaierror:[Ernno -2]Vārdsvaiapkalpošanazināms
  1. Tālāk redzama kļūda, ja ports tiek izmantots kā 98980

Traceback (pēdējais pēdējais zvans):

Fails'client.py',līnija22, iekšā <modulis>
s.savienot((ServerIp,Ostas))
Pārpildes kļūda: getsockaddrarg: portam jābūt0-65535.
  1. Tālāk redzama kļūda, ja paraugs.txt nav pieejams klienta pusē.

Traceback (pēdējais pēdējais zvans):

Fails'client.py',līnija25, iekšā <modulis>
failu = atvērts('sample.txt', 'rb')
FileNotFoundError:[Ernno2]Tādu navfailu vaikatalogs:'sample.txt'

Secinājums:

Izmantojot šo programmu, mēs varam nosūtīt vienkāršu teksta failu no vienas sistēmas uz citu sistēmu, izmantojot tīklu, izmantojot python programmu. Tas ļauj mums apgūt pamata zināšanas par python un ligzdas programmēšanu arī datu nosūtīšanai pa tīklu.