In [1]:
import sys
sys.version
Out[1]:
Requests for Comment (RFCs) публикуются организацией Internet Engineering Task Force (IETF).
In [2]:
import socket
32-битное число:
Например, 93.184.216.34
127.0.0.1 - Каждый девайс имеет виртуальный интерфейс - loopback interface.
Приватные адреса:
NAT - Network Address Translation - преобразует трафик с приватных адресов в трафик, исходящий с одного публичного ip.
Пакеты:
Структура IPv4 пакета:
128-битное число:
2606:2800:220:1:248:1893:25c8:1946
::1
Структура заголовка IPv6 пакета:
In [12]:
import socket
hostname = 'httpbin.org'
addr = socket.gethostbyname(hostname)
print(addr)
In [11]:
import socket
hostname = 'httpbin.org'
addr_info = socket.getaddrinfo(hostname, 80)
print(addr_info)
In [13]:
import socket
print (socket.gethostbyaddr(addr))
Данные прибывают на интерфейс с определенным IP - но что с ними делать дальше? Каждая программа должна проверить их? Конечно, нет. Существует концепция портов - процесс, взаимодействующий с сетью, может занять определенный номер порта в промежутке от 1 до 65535. Порт входит в заголовок пакета - т.о. протокол знает какому приложению направить данные.
UDP чрезвычайно простой протокол - он не предлагает никаких доп фич помимо доставки данных удаленному процессу. Никакого постоянного соединения. Никакой гарантии доставки и доставки в порядку отправления.
In [43]:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print('Socket created')
s
Out[43]:
In [47]:
s.sendto(bytes("data", encoding="utf-8"), ("127.0.0.1", 3000))
Out[47]:
In [1]:
s.sendto(b"data", ("127.0.0.1", 3000))
In [ ]:
In [6]:
import socket #create a TCP socket (SOCK_STREAM)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
s
Out[6]:
In [9]:
s.connect(("127.0.0.1", 9999))
In [10]:
# запись в сокет
s.send(b"data")
# s.send(bytes("data", encoding="utf-8"))
Out[10]:
In [11]:
# чтение из сокета
s.recv(1024)
Out[11]:
In [ ]:
In [ ]:
Пример запроса клиента:
GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, compress
Host: httpbin.org
User-Agent: HTTPie/0.3.1
Пример ответа сервера:
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Length: 12150
Content-Type: text/html; charset=utf-8
Date: Sun, 30 Oct 2016 13:48:11 GMT
Server: nginx
<!DOCTYPE html>
<html>
<head>
...
In [ ]:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
In [ ]:
sock.bind(("127.0.0.1", 6668))
In [ ]:
data, addr = sock.recvfrom(1024)
print("received message:", data, "from", addr)
In [37]:
sock.close()
In [ ]:
# Показать telnet!!!
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
In [ ]:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
In [ ]:
sock.bind(("127.0.0.1", 6667))
sock.listen(5)
client_sock, addr = sock.accept()
print("connected", addr)
data = client_sock.recv(1024)
print(data)
client_sock.close()
sock.close()
Примеры в папке с лекцией:
In [1]:
import struct
struct.pack("i", 123)
Out[1]:
In [2]:
struct.unpack("i", b'{\x00\x00\x00')
Out[2]:
In [62]:
import urllib.request
f = urllib.request.urlopen('http://www.python.org/', timeout=3)
print(f.read().decode('utf-8')[:100])
In [57]:
import requests
resp = requests.get('http://www.python.org/', timeout=3)
print(resp.text[:100])
Пример, демонстрирующий почему requests гораздо удобнее в использовании:
In [53]:
import urllib.request
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(
realm='PDQ Application',
uri='https://mahler:8092/site-updates.py',
user='user',
passwd='pass'
)
opener = urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)
#urllib.request.urlopen('http://www.example.com/login.html')
vs
In [54]:
import requests
requests.get('https://api.github.com/user', auth=('user', 'pass'))
Out[54]:
Dr. M. O. Faruque Sarker, Sam Washington: Learning Python Network Programming:
https://www.packtpub.com/networking-and-servers/learning-python-network-programming
In [ ]: