Commit 77e85aec authored by Kseniya Lysenko's avatar Kseniya Lysenko
Browse files

new lesson

parent b12fb5a2
Loading
Loading
Loading
Loading
+93 −0
Original line number Diff line number Diff line
Потоки. Передача файлов. Клиент-серверный чат
==============================================

Передача файлов
----------------
Передачу файлов с помощью сокетов можно реализовать по следующей схеме:
 1. Настраиваем сокет, устанавливаем соединение.
 2. **На отправляющей стороне**: 
    - открываем файл на чтение в режиме байтового чтения (``'rb'``).
    - построчно передаём файл принимающей стороне (``'rb'``).
 3. **На принимающей стороне**: 
    - открываем файл на запись в режиме байтовой записи (``'wb'``).
    - построчно пишем в файл всё, что получаем от передающей стороны.
 4. Закрываем файлы и соединение.

Пример кода для отправки файла с клиента серверу.

Сервер::
 
 import socket
 import sys

 # создаём сокет и связываем его с IP-адресом и портом
 
 sock = socket.socket()
 ip = "localhost"
 port = 9999
 sock.bind((ip, port))
 
 # сервер ожидает передачи информации
 sock.listen(10)

 while True:
     # начинаем принимать соединения
     conn, addr = sock.accept()
     
     # выводим информацию о подключении
     print('connected:', addr)  
     
     # получаем название файла
     name_f = (conn.recv(1024)).decode ('UTF-8') 
     
     # открываем файл в режиме байтовой записи в отдельной папке 'sent'
     f = open('sent/' + name_f,'wb') 
     
     while True:
         
         # получаем байтовые строки
         l = conn.recv(1024)
         
         # пишем байтовые строки в файл на сервере
         f.write(l)

         if not l:
             break

     f.close()
     conn.close()

     print('File received')

 sock.close()

Клиент::

 import socket
 import sys

 ip = "localhost"
 port = 9999

 # создаём сокет для подключения
 sock = socket.socket()
 sock.connect((ip,port))

 # запрашиваем имя файла и отправляем серверу
 f_name = input ('File to send: ')
 sock.send((bytes(f_name, encoding = 'UTF-8')))

 # открываем файл в режиме байтового чтения
 f = open (f_name, "rb")

 # читаем строку
  l = f.read(1024)

 while (l):
     # отправляем строку на сервер
     sock.send(l)
     l = f.read(1024)

 f.close()
 sock.close()