В этом руководстве вы узнаете о сокетах в Python и о том, как использовать модуль сокетов для построения HTTP-серверов и клиентов в Python. Он также охватит Tornado, сетевую библиотеку Python, которая идеально подходит для длительных опросов, WebSockets и других приложений, для которых требуется длительное соединение с каждым пользователем.
Что такое сокеты?
Сокет — это связь между двумя приложениями, которые могут взаимодействовать друг с другом (локально на одном компьютере или удаленно между двумя компьютерами в разных местах).
По сути, сокеты действуют как канал связи между двумя объектами, то есть сервером и клиентом. Сервер выдаст информацию, запрашиваемую клиентом. Например, когда вы посетили эту страницу, браузер создал сокет и подключился к серверу.
Модуль розетки
 Чтобы создать сокет, вы используете socket.socket() , а синтаксис такой простой: 
| 
 1 
2 
 | 
 import socket 
s= socket.socket (socket_family, socket_type, protocol=0) 
 | 
Вот описание аргументов:
- socket_family : представляет семейство адресов (и протоколов). Это может быть AF_UNIX или AF_INET.
 - socket_type : представляет тип сокета и может быть SOCK_STREAM или SOCK_DGRAM.
 - протокол : это необязательный аргумент, обычно по умолчанию он равен 0.
 
После получения объекта сокета вы можете создать сервер или клиент по своему усмотрению, используя методы, доступные в модуле сокета.
Создать простой клиент
Прежде чем мы начнем, давайте посмотрим на методы клиентского сокета, доступные в Python.
-  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -   
s.connect():s.connect()соединение с сервером TCP. 
Чтобы создать новый сокет, вы сначала импортируете метод сокета класса сокета.
| 
 1 
 | 
 import socket 
 | 
Далее мы создадим сокет потока (TCP) следующим образом:
| 
 1 
 | 
 stream_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) 
 | 
  Аргумент AF_INET указывает, что вы запрашиваете сокет интернет-протокола (IP), в частности, IPv4.  Вторым аргументом является тип транспортного протокола SOCK_STREAM для сокетов TCP.  Кроме того, вы также можете создать сокет IPv6, указав аргумент сокета AF_INET6 . 
Укажите сервер.
| 
 1 
 | 
 server = «localhost» 
 | 
Укажите порт, с которым мы хотим общаться.
| 
 1 
 | 
 port =80 
 | 
Подключите сокет к порту, где сервер прослушивает.
| 
 1 
2 
 | 
 server_address = ((host, port)) 
stream_socket.connect(server_address) 
 | 
Важно отметить, что хост и порт должны быть кортежем.
Отправьте запрос данных на сервер:
| 
 1 
2 
 | 
 message = ‘message’ 
stream_socket.sendall(message) 
 | 
Получить ответ от сервера:
| 
 1 
2 
 | 
 data = sock.recv(10) 
print data 
 | 
Чтобы закрыть подключенный сокет, вы используете метод close:
| 
 1 
 | 
 stream_socket.close() 
 | 
Ниже приведен полный код клиента / сервера.
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
 | 
 import socket 
import sys 
# Create a TCP/IP socket 
stream_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
# Define host 
host = ‘localhost’ 
# define the communication port 
port = 8080 
# Connect the socket to the port where the server is listening 
server_address = ((host, port)) 
print «connecting» 
stream_socket.connect(server_address) 
# Send data 
message = ‘message’ 
stream_socket.sendall(message) 
# response 
data = stream_socket.recv(10) 
print data 
print ‘socket closed’ 
stream_socket.close() 
 | 
Создайте простой сервер
Теперь давайте посмотрим на простой сервер Python. Ниже приведены методы сервера сокетов, доступные в Python.
-  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -   
s.bind(): привязывает адрес (имя хоста, номер порта) к сокету. -   
s.listen(): устанавливает и запускает прослушиватель TCP. -   
s.accept(): принимает соединение с TCP-клиентом. 
Мы будем следовать следующим шагам:
- Создать сокет.
 - Свяжите сокет с портом.
 - Начните принимать соединения на сокете.
 
Вот серверная программа.
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
 | 
 import socket 
import sys 
# Create a TCP/IP socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
# Define host 
host = ‘localhost’ 
# define the communication port 
port = 8080 
# Bind the socket to the port 
sock.bind((host, port)) 
# Listen for incoming connections 
sock.listen(1) 
# Wait for a connection 
print ‘waiting for a connection’ 
connection, client = sock.accept() 
print client, ‘connected’ 
# Receive the data in small chunks and retransmit it 
data = connection.recv(16) 
print ‘received «%s»‘ % data 
if data: 
    connection.sendall(data) 
else: 
    print ‘no data from’, client 
# Close the connection 
connection.close() 
 | 
Сервер теперь готов к входящим соединениям.
Теперь запустите клиентские и серверные программы в отдельных окнах терминала, чтобы они могли общаться друг с другом.
Выход сервера
| 
 1 
2 
3 
4 
 | 
 $ python server.py 
waiting for a connection 
(‘127.0.0.1’, 47050) connected 
received «message» 
 | 
Выход клиента
| 
 1 
2 
3 
4 
 | 
 $ python client.py 
connecting 
message 
socket closed 
 | 
Каркас Торнадо
Среда Tornado — это одна из библиотек, доступных для сетевого программирования на Python. В этом разделе мы обсудим эту библиотеку и покажем, как использовать ее для создания WebSockets.
Tornado — это веб-фреймворк Python и библиотека асинхронных сетей. Tornado использует неблокирующий сетевой ввод-вывод и, следовательно, способен масштабировать до десятков тысяч открытых соединений. Эта особенность делает его идеальным для длительных опросов, WebSockets и других приложений, которым требуется долгоживущее соединение с каждым пользователем.
Давайте создадим простой Tornado WebSocket:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
 | 
 import tornado.ioloop 
import tornado.web 
class ApplicationHandler(tornado.web.RequestHandler): 
    def get(self): 
        self.message = message = «»»<html> 
<head> 
    <title>Tornado Framework</title> 
</head> 
<body 
    <h2>Welcome to the Tornado framework</h2> 
</body> 
</html>»»» 
        self.write(message) 
if __name__ == «__main__»: 
    application = tornado.web.Application([ 
        (r»/», ApplicationHandler), 
    ]) 
    application.listen(5001) 
    tornado.ioloop.IOLoop.instance().start() 
 | 
В приведенном выше коде:
-   Мы определяем класс 
ApplicationHandlerкоторый служит обработчиком для запроса и возвращает ответ, используя методwrite(). -   
mainметодом является запись для программы. -   
tornado.web.Applicationсоздает базу для веб-приложения и принимает набор обработчиков, т.е. ApplicationHandler. - Приложение прослушивает порт 5000, и клиент может общаться с этим приложением, используя тот же порт.
 -   
tornado.ioloop.IOLoop.instance().start()создает неблокирующий поток для приложения. 
Если мы запустим приложение, мы получим результат, как показано на скриншоте ниже.

Вывод
К настоящему времени вы, должно быть, уже поняли основы программирования сокетов в Python и как вы можете создать простой сервер и клиент. Не стесняйтесь экспериментировать, создав собственный клиент для чата. Для получения дополнительной информации посетите официальные документы Python.
Кроме того, не стесняйтесь посмотреть, что у нас есть в наличии для продажи и для изучения на рынке Envato , и не стесняйтесь задавать любые вопросы и предоставлять ценные отзывы, используя канал ниже.