Hướng dẫn network programming python

Vietnamese [Tiếng Việt] translation by Dai Phong [you can also view the original English article]

Giới thiệu về Lập trình Mạng trong Python

Bài hướng dẫn này sẽ giới thiệu về socket trong Python và cách sử dụng mô đun socket để xây dựng các máy chủ và máy khách HTTP trong Python. Nó cũng sẽ khái quát Tornado, một thư viện kết nối mạng trong Python, lý tưởng cho long polling, WebSocket và các ứng dụng khác yêu cầu kết nối lâu dài với mỗi người dùng.

Socket là gì?

Một socket là một liên kết giữa hai ứng dụng có thể giao tiếp với nhau [hoặc cục bộ trên một máy đơn lẻ hoặc từ xa giữa hai máy ở các vị trí riêng biệt].

Về cơ bản, socket hoạt động như một liên kết giao tiếp giữa hai thực thể, tức là máy chủ và máy khách. Một máy chủ sẽ trả về thông tin được yêu cầu bởi một máy khách. Ví dụ, khi bạn truy cập trang này, trình duyệt tạo một socket và kết nối với máy chủ.

Mô-đun socket

Để tạo một socket, bạn sử dụng hàm socket.socket[] và cú pháp đơn giản như sau:

import socket
s= socket.socket [socket_family, socket_type, protocol=0]

Đây là mô tả của các đối số:

  • socket_family: Đại diện cho họ địa chỉ [và giao thức]. Nó có thể là AF_UNIX hoặc AF_INET.
  • socket_type: Đại diện cho loại socket và có thể là SOCK_STREAM hoặc SOCK_DGRAM.
  • protocol: Đây là một đối số tùy chọn, và nó thường mặc định là 0.

Sau khi lấy đối tượng socket, bạn có thể tạo một máy chủ hoặc máy khách theo ý mình bằng cách sử dụng các phương thức có sẵn trong mô đun socket.

Tạo một máy khách đơn giản

Trước khi bắt đầu, chúng ta hãy tìm hiểu các phương thức socket của client có sẵn trong Python.

  • s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
  • s.connect[]: Khởi tạo một kết nối máy chủ TCP.

Để tạo một socket mới, trước tiên bạn import phương thức socket của lớp socket.

import socket

Tiếp theo, chúng ta sẽ tạo một socket stream [TCP] như sau:

stream_socket = socket.socket[ socket.AF_INET, socket.SOCK_STREAM ]

Tham số AF_INET cho biết bạn đang yêu cầu một socket Internet Protocol [IP], cụ thể là IPv4. Tham số thứ hai là transport protocol type SOCK_STREAM cho các socket TCP. Ngoài ra, bạn cũng có thể tạo một socket IPv6 bằng cách chỉ định tham số AF_INET6 của socket.

Chỉ định máy chủ.

server = "localhost"

Chỉ định cổng mà chúng ta muốn liên lạc.

port =80

Kết nối socket tới cổng nơi máy chủ đang lắng nghe.

server_address = [[host, port]]
stream_socket.connect[server_address]

Điều quan trọng cần lưu ý là máy chủ và cổng phải là một tuple.

Gửi yêu cầu dữ liệu đến máy chủ:

message = 'message'
stream_socket.sendall[message]

Nhận phản hồi từ máy chủ:

data = sock.recv[10]
print data

Để đóng một kết nối socket, bạn sử dụng phương thức close:

stream_socket.close[]

Dưới đây là code đầy đủ cho Client/Server.

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[]

Xây dựng một máy chủ đơn giản

Bây giờ chúng ta hãy tìm hiểu một máy chủ Python đơn giản. Sau đây là các phương thức máy chủ của socket có sẵn trong Python.

  • s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
  • s.bind[]: Ràng buộc địa chỉ [tên máy chủ, số cổng] vào socket.
  • s.listen[]: Thiết lập và khởi động TCP listener.
  • s.accept[]: Chấp nhận kết nối TCP client.

Chúng ta sẽ làm theo các bước sau:

  • Tạo một socket.
  • Ràng buộc socket với một cổng.
  • Bắt đầu chấp nhận các kết nối trên socket.

Đây là chương trình máy chủ.

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[]

Máy chủ hiện đã sẵn sàng cho các kết nối đến.

Bây giờ hãy chạy chương trình máy khách và máy chủ trong các cửa sổ terminal riêng biệt, để chúng có thể giao tiếp với nhau.

Đầu ra Máy chủ

$ python server.py 
waiting for a connection
['127.0.0.1', 47050] connected
received "message"

Đầu ra Máy khách

$ python client.py 
connecting
message
socket closed

Framework Tornado

Framework Tornado là một trong các thư viện có sẵn cho lập trình mạng bằng Python. Trong phần này, chúng ta sẽ thảo luận về thư viện này và cách sử dụng nó để xây dựng WebSocket.

Tornado là một web framework bằng Python và thư viện kết nối mạng không đồng bộ. Tornado sử dụng I/O mạng không chặn, và do đó có khả năng mở rộng tới hàng chục nghìn kết nối mở. Đặc điểm này làm cho nó trở nên lý tưởng cho kết nối long-polling, WebSocket và các ứng dụng khác yêu cầu kết nối lâu dài với mỗi người dùng.

Hãy tạo một WebSocket Tornado đơn giản:

import tornado.ioloop
import tornado.web


class ApplicationHandler[tornado.web.RequestHandler]:

    def get[self]:
        self.message = message = """

    Tornado Framework


Chủ Đề