Tôi có một ổ cắm không chặn trong Python gọi là Show
Đây là tập lệnh tôi kiểm tra với (từ đây):
Nếu ngang hàng đóng kết nối, ổ cắm này được cho là tăng ____10 trên Tôi kiểm tra nó theo cách này, sử dụng hai thiết bị đầu cuối: Đã hỏi ngày 2 tháng 1 năm 2021in Pythonby (50,2k điểm) Jan 2, 2021 in Python by (50.2k points) Từ phân tích, tôi đã kết luận rằng trong ba trường hợp sau đây, ổ cắm.recv (recv_size) sẽ trở lại. Sau khi kết nối được đóng lại. Ví dụ: phía máy khách được gọi là socket.close () hoặc bất kỳ lỗi ổ cắm nào xảy ra, nó sẽ trả về một chuỗi trống. Một số thông tin đến, kích thước của dữ liệu nhiều hơn recv_size. Đối với một số bản ghi, kích thước của dữ liệu ít hơn recv_size và không có thêm dữ liệu nào sau một thời gian ngắn (tôi thấy 0.1 sẽ hoạt động).
AAAAA EOF #Khi tôi chạy client2.py, server.py echos: Answer12345 EOF Jan 2, 2021 by vinita (108k points) Kết luận của tôi có đúng không? & NBSP; 1 câu trả lời Đã trả lời ngày 2 tháng 1 năm 2021by Vinita (108k điểm) Vâng, phán đoán của bạn là chính xác. Ổ cắm.recv là một tín hiệu chặn. Socket.Recv (1024) sẽ đọc ở mức tối đa 1024 byte, chặn nếu không có thông tin nào đang chờ được đọc. Nếu bạn không thu thập tất cả dữ liệu, một cuộc gọi khác đến socket.recv sẽ không chặn.Làm thế nào để ngăn máy chủ ổ cắm Python gửi tin nhắn trống?Tôi đã thiết lập một tập lệnh máy chủ/máy chủ ổ cắm cơ bản - hy vọng bằng cách nào đó thực hiện nó trong trang web và đã thấy rằng có thể thực hiện ứng dụng ứng dụng? Dù sao, dường như không thể ngăn người dùng gặp sự cố máy chủ hoặc máy khách nếu họ nhập một tin nhắn trống (tức là nhấn trả về mà không cần nhập bất kỳ văn bản/dữ liệu nào). Có một cách dễ dàng để ngăn chặn điều này? Madmartin | 362 Bài viết | Ngày 25 tháng 7 năm 2020, 7:16 sáng | permalink July 25, 2020, 7:16 a.m. | permalink server.py
Madmartin | 362 Bài viết | Ngày 25 tháng 7 năm 2020, 7:17 sáng | permalink July 25, 2020, 7:17 a.m. | permalink Khách hàng PY: Nhập ổ cắm def client_program (): host = socket.gethostname () # vì cả hai mã đang chạy trên cùng một cổng PC = 8000 # số cổng máy chủ ổ cắm
Nếu name == 'Main': client_program ()name == 'main': client_program() Madmartin | 362 Bài viết | Ngày 25 tháng 7 năm 2020, 7:18 sáng | permalink July 25, 2020, 7:18 a.m. | permalink Điều này hoạt động tốt (đã thêm: Nhập ổ cắm vào dòng trên cùng của máy chủ.py) - Nếu người dùng hoạt động chính xác nhưng nếu một người truy cập trả lại sai thời điểm hoặc thử gửi hai tin nhắn thì toàn bộ điều đó chỉ bị treo Vì vậy, tôi muốn sửa nó và sau đó bằng cách nào đó thêm nó vào trang web/ứng dụng của tôi - điều đó có thể được thực hiện không? Madmartin | 362 Bài viết | Ngày 25 tháng 7 năm 2020, 7:20 sáng | permalink July 25, 2020, 7:20 a.m. | permalink Đừng chỉ gửi tin nhắn. Kiểm tra xem nó không trống và sau đó quyết định xem đó có phải là tin nhắn mà bạn muốn gửi hay nếu đó chỉ là một sự trở lại. Tôi không sử dụng được tôi hiểu ý của bạn khi gửi 2 tin nhắn cùng một lúc. Tôi không thấy bất cứ điều gì trong mã cho phép gửi đồng thời 2 tin nhắn. Glenn | 8448 Bài viết | Nhân viên Pythonany ở đâu | Ngày 25 tháng 7 năm 2020, 9:24 sáng | permalink July 25, 2020, 9:24 a.m. | permalink Tôi đã thử các phương pháp khác nhau cho điều đó, cho Ex tôi đã chèn:
vv ... tất cả các loại kết hợp và không ai trong số họ thực hiện thủ thuật tôi làm gì sai ở đây? Madmartin | 362 Bài viết | Ngày 25 tháng 7 năm 2020, 10:35 sáng | permalink July 25, 2020, 10:35 a.m. | permalink Đã thử điều này ngay bây giờ: server.py
Madmartin | 362 Bài viết | Ngày 25 tháng 7 năm 2020, 10:53 sáng | permalink July 25, 2020, 10:53 a.m. | permalink client.py
Điều này không thực sự sắp xếp nó Madmartin | 362 Bài viết | Ngày 25 tháng 7 năm 2020, 10:54 sáng | permalink July 25, 2020, 10:54 a.m. | permalink Bạn có chắc rằng dữ liệu không có gì khi người dùng không nhập tin nhắn? Ngoài ra, bạn không thay đổi bất cứ điều gì - bạn vẫn đang chạy mã gửi tin nhắn khi dữ liệu không có (giả sử nó là bao giờ). Nỗ lực đầu tiên của bạn có vẻ như nó có thể hoạt động nếu dữ liệu là một chuỗi trống khi người dùng chỉ truy cập trở lại. Glenn | 8448 Bài viết | Nhân viên Pythonany ở đâu | Ngày 25 tháng 7 năm 2020, 11 giờ sáng | permalink July 25, 2020, 11 a.m. | permalink Ổ cắm recv trả lại Python là gì?Cuộc gọi recv () chỉ áp dụng cho các ổ cắm được kết nối. Cuộc gọi này trả về độ dài của tin nhắn hoặc dữ liệu đến. Nếu một gói datagram quá dài để phù hợp với bộ đệm được cung cấp, các ổ cắm Datagram sẽ loại bỏ các byte dư thừa.the length of the incoming message or data. If a datagram packet is too long to fit in the supplied buffer, datagram sockets discard excess bytes.
SOCKED có phải chờ dữ liệu không?Nếu không có dữ liệu đến có sẵn tại ổ cắm, các khối cuộc gọi RECV và chờ dữ liệu đến theo các quy tắc chặn được xác định cho WSARECV với cờ MSG_PARTIAL không được đặt trừ khi ổ cắm không chặn.Trong trường hợp này, giá trị của socket_error được trả về với mã lỗi được đặt thành wsaewouldblock.
Có phải socket nghe chặn python?Tất cả các phương pháp ổ cắm đang chặn.Ví dụ: khi nó đọc từ ổ cắm hoặc ghi vào nó, chương trình không thể làm gì khác.Một giải pháp khả thi là ủy thác làm việc với khách hàng để tách các chủ đề.. For example, when it reads from a socket or writes to it the program can't do anything else. One possible solution is to delegate working with clients to separate threads.
Không phải là gìKhi bạn thực hiện một ổ cắm không chặn bằng cách gọi SetBlocking (0), nó sẽ không bao giờ chờ đợi hoạt động hoàn tất.Vì vậy, khi bạn gọi phương thức gửi (), nó sẽ đặt càng nhiều dữ liệu trong bộ đệm càng tốt và trả về.Vì điều này được đọc bởi kết nối từ xa, dữ liệu được xóa khỏi bộ đệm.it will never wait for the operation to complete. So when you call the send() method, it will put as much data in the buffer as possible and return. As this is read by the remote connection, the data is removed from the buffer. |