Một ổ cắm là điểm cuối của một liên kết giữa hai ứng dụng. Socket cho phép giao tiếp trong 1 tiến trình, giữa các tiến trình trên cùng 1 máy hoặc giữa nhiều máy với nhau
Trong hệ thống mạng có rất nhiều ứng dụng bao gồm chương trình khách và chương trình chủ ở 2 hệ thống cuối cùng khác nhau. Sau khi được kích hoạt, một tiến trình khách và chủ được tạo và đích của socket được sử dụng là để giúp 2 tiến trình này có thể truyền thông với nhau một cách dễ dàng
Ổ cắm được chia chủ yếu thành 2 loại
- Ổ cắm luồng. based on giao thức TCP, chỉ thực hiện trên 2 tiến trình đã thiết lập kết nối. Giao thức này đảm bảo dữ liệu truyền đến nơi nhận 1 cách tin cậy và đúng tuần tự. Còn được gọi là hướng kết nối ổ cắm
- ổ cắm datagram. based on UDP giao thức, không yêu cầu thiết lập kết nối. Giao thức này không chắc chắn dữ liệu truyền đến nơi nhận 1 cách tin cậy và toàn vẹn. Còn được gọi là hướng ổ cắm không kết nối
*Trong phạm vi bài viết này mình chỉ để cập nhật trình cắm sử dụng TCP/IP [Stream socket]
2. Lập trình ổ cắm với TCP/IP
Các process muốn truyền thông với nhau thì sẽ gửi message message qua các socket. Ổ cắm là cánh cửa của ứng dụng tiến trình và vận chuyển tầng giao thức [ở đây là TCP]
Để có thể tương tác với nhau và máy chủ có thể nhận liên lạc từ máy khách thì máy chủ phải luôn sẵn sàng. Điều này có 2 ý nghĩa, thứ nhất, giống như trường hợp của UDP, tiến trình của máy chủ phải được chạy trước khi máy khách khởi động liên lạc đến. Thứ hai, chương trình chủ phải tạo ra 1 ổ cắm để sẵn sàng tiếp nhận kết nối từ tiến trình khách
Khi tiến trình máy chủ đã chạy, lúc này tiến trình khách sẽ tạo ra 1 socket TCP để có thể kết nối với máy chủ. Trong khi máy khách đang tạo ổ cắm TCP, nó sẽ mô tả địa chỉ IP, số cổng của tiến trình chủ
Khi ổ cắm của tiến trình khách vừa được tạo, TCP trên máy khách sẽ tiến hành thực hiện quá trình bắt tay 3 bước và thiết lập kết nối TCP tới máy chủ
Trong quá trình bắt tay 3 bước, khi tiến trình chủ nhận thấy tiến trình khách, nó sẽ tự tạo ra 1 ổ cắm mới chỉ dành riêng cho tiến trình khách đó. Khi máy khách nhập vào cửa, chương trình kích hoạt với phương thức accept[]. Cuối cùng quá trình bắt tay 3 bước, một kết nối TCP tồn tại giữa ổ cắm của máy khách và ổ cắm của máy chủ
3. Ổ cắm mô-đun trong Python
Python cung cấp module socket giúp chúng ta dễ dàng thực hiện kết nối client server để giao tiếp với nhau
To could be used before the first ta must import module socket to program
import socket
Tạo một ổ cắm
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
với
- tham số đầu tiên là Dòng địa chỉ. connection type setting. Python support 3 format
- AF_INET. IPv4
- AF_INET6. IPv6
- AF_UNIX
- tham số thứ hai là Loại ổ cắm. cách thiết lập giao thức
- SOCK_STREAM. TCP
- SOCK_DGRAM. UDP
Một số phương thức được sử dụng trong chương trình
s. liên kết[[HOST, PORT]]
Đăng ký tên cho socket, ràng buộc địa chỉ vào sockets. lắng nghe[2]
Cho socket đang lắng nghe tối đa 2 kết nốiứng dụng khách, addr = s. Chấp nhận[]
dữ liệu = máy khách. recv[1024]
Nhận gói dữ liệustr_data = dữ liệu. giải mã["utf8"]
Phân vùng dữ liệu gói vừa nhậns. sendall[byte[tin nhắn, "utf8"]]
Gửi dữ liệu thông qua giao thức TCP. close[] That's a connection4. demo chương trình
Người phục vụ
import socket
HOST = '127.0.0.1'
PORT = 8000
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
s.bind[[HOST, PORT]]
s.listen[2]
while True:
client, addr = s.accept[]
try:
print['Connected by', addr]
while True:
data = client.recv[1024]
str_data = data.decode["utf8"]
if str_data == "quit":
break
"""if not data:
break
"""
print["Client: " + str_data]
msg = input["Server: "]
finally:
client.close[]
s.close[]
Khách hàng
import socket
HOST = '127.0.0.1'
PORT = 8000
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
server_address = [HOST, PORT]
print['connecting to %s port ' + str[server_address]]
s.connect[server_address]
try:
while True:
msg = input['Client: ']
s.sendall[bytes[msg, "utf8"]]
if msg == "quit":
break
data = s.recv[1024]
print['Server: ', data.decode["utf8"]]
finally:
s.close[]
Lời kết
Mình học môn mạng máy tính và mong mọi người góp ý với mình ở phần comment nha. Cảm ơn mọi người đã xem