Một socket mỗi trao đổi trò chuyện (tiếp tục)
Như bạn có thể thấy từ code getsockname() làm việc tốt so với cả listening và connected sockets, và trong cả hai
trường hợp, nó cho phép bạn tìm ra cổng TCP địa phương gì socket đang sử dụng. Để biết địa chỉ của máy khách tới
nó nột connected socket được liên kết, bạn có thể chạy phương thức getpeername() tại bất cứ lúc nào, hay bạn có
thể lưu giữ tên socket cái được trả về như giá trị trả về thứ hai từ accept(). Khi bạn chạy máy chủ này, bạn thấy
rằng cả hai giá trị cung cấp cho bạn cùng địa chỉ.
$ python tcp_sixteen.py server “”
Listening at (‘0.0.0.0’, 1060)
Waiting to accept a new connection
We have accepted a connection from (‘127.0.0.1’, 57971)
Socket name: (‘127.0.0.1’, 1060)
Socket peer: (‘127.0.0.1′, 57971)
Incoming sixteen-octet message: b’Hi there, server’
Reply sent, socket closed
Waiting to accept a new connection
Có máy khách làm một kết nối tới máy chủ, giống cái này, sinh ra đầu ra đi trước:
$ python3 tcp_sixteen.py client 127.0.0.1
Client has been assigned socket name (‘127.0.0.1′, 57971)
The server said b’Farewell, client’
Bạn có thể thấy từ phần còn lại của server code cái một lần một connected socket vừa được trả về bởi accept(), nó
làm việc chính xác như một client socket với không bằng chứng bất đối xứng xa hơn trong mô hình trao đổi thông tin
của chúng. Lời gọi recv() trả về dữ liệu khi nó trở nên có sẵn, và sendall() là cách thức tốt nhất để gửi toàn bộ
một khối dữ liệu khi bạn muốn đảm bảo nó tất cả được truyền.
Bạn sẽ chúy ý rằng một đối số số nguyên được cung cấp tới listen() khi nó được gọi trên server socket. Số này
chỉ có bao nhiêu kết nối đang chờ, cái vẫn chưa có các sockets được tạo cho chúng bởi các lời gọi accept(), nên
được phép chia tầng trước khi hệ điều hành bắt đầu bỏ qua các kết nối mới và ngăn cản nhiều hơn three-way handshakes.
Tôi đang sử dụng value1 rất nhỏ ở đây trong các ví dụ vì tôi hỗ trợ chỉ một máy khách ví dụ kết nối tại một thời
điểm, nhưng tôi sẽ xem xét các giá trị lớn hơn cho lời gọi này khi tôi nói về thiết kế máy chủ mạng trong học phần
sau.
Một khi máy khách và máy chủ đã nói mọi thứ cái chúng cần, chúng close() cuối socket của chúng cái thông báo hệ điều
hành truyền dữ liệu còn lại vẫn để lại trong bộ nhớ đệm đầu ra của chúng và sau đó kết thúc phiên làm việc TCP
với gói dữ liệu FIN đóng thủ tục đề cập trước kia.