Tôi gặp sự cố khi kết nối (thông qua các lớp Socket và XMLSocket) với trình nghe TCP sau khi hết thời gian chờ kết nối.Ổ cắm ActionScript 3.0 không thể kết nối lại
Tôi có một applet flash cần duy trì kết nối TCP với máy chủ. Tôi đã triển khai thời gian chờ bằng Timers, hệ thống ping-pong, v.v. Tuy nhiên, có một vấn đề. Khi gọi Socket.connect(), trình phát flash (9.0.115 và nhiều chuồng khác trước đó) gửi 3 yêu cầu kết nối theo cách của gói SYN, với một số thời gian ở giữa. Nếu không có câu trả lời nào trong số đó được trả lời (ví dụ: vì máy chủ không hoạt động), tôi không thể tải applet để [cố gắng] kết nối với máy chủ. Không bao giờ. Đó là, trong vòng đời của applet.
Để làm rõ và/hoặc tóm tắt:
Đối với bất kỳ máy chủ/cặp cổng cho Socket.connect() hoặc XMLSocket.connect(), nếu cuộc gọi thất bại, kết nối bất kỳ tiếp theo() các cuộc gọi đến bất kỳ ổ cắm khác (hoặc XMLSocket) trường hợp trong vòng đời của ứng dụng Flash đến cùng một cặp máy chủ/cổng bị bỏ qua. (Ít nhất theo như tôi có thể nói bằng cách sử dụng gói sniffer.)
Tôi đã thử gọi nhiều phương thức Socket, hủy và tái tạo các đối tượng, sử dụng một nhóm Ổ cắm và nhiều phương pháp khác mà tôi không thể nhớ ngay bây giờ ; Tất cả không có kết quả.
Giải pháp hiện tại của tôi là thông báo cho trang web mẹ thông qua cuộc gọi JavaScript và để cho nó tải lại applet của tôi. Nó không phải là một giải pháp khá, và tôi không phải thực hiện cách giải quyết cho các vấn đề nó gây ra, chỉ vì Flash không thể xử lý các kết nối ổ cắm đúng cách.
Tôi phải thiếu điều gì đó rất đơn giản.
Bất kỳ ý tưởng nào?
1: Tôi biết bạn không thể phá hủy các đối tượng; Tôi chỉ xóa tất cả các tham chiếu đến họ và hy vọng điều tốt nhất. Tôi đã không cố gắng gọi GC một cách rõ ràng trong trường hợp này. (Mặc dù tôi nghĩ rằng tôi đã thử đặt Socket bên trong một mảng và sử dụng xóa.)
Vâng, nó hoạt động như mong đợi nếu kết nối thành công (thậm chí nếu kết nối giảm sau này.)
Sự kiện duy nhất để kích hoạt trường hợp này là khi máy chủ không phản hồi; nó giống như Flash đánh dấu sự kết hợp máy chủ/cổng là "ngoại tuyến" và không bận tâm gửi bất kỳ gói nào khác cho nó trong suốt vòng đời của applet.
Tôi nghi ngờ từ chối hoạt động của kết nối (ví dụ: máy chủ đang trực tuyến nhưng không nghe cổng) không gây ra điều này.
Tôi không nhận được thông báo lỗi hoặc phản hồi của bất kỳ loại nào khác từ Ổ cắm.
Bạn đã bao giờ gọi kết nối() nhiều hơn một lần cho cùng một cặp máy chủ/cổng, khi lần đầu tiên không thành công? Làm cách nào bạn biết kết nối đầu tiên() không thành công? Và trước khi các cuộc gọi connect() tiếp theo, bạn có làm gì để đặt lại socket không?
Kết nối có thành công chính xác không nếu máy chủ có sẵn? Khi thất bại sau 3 lần, bạn có nhận được thông báo lỗi không? Tôi đã làm rất nhiều việc với Sockets và chưa bao giờ gặp phải vấn đề này. –