2010-09-05 47 views
5

vì vậy - tôi có ứng dụng Socket (không phải là XMLSocket, chỉ Socket) này. Tôi cũng có một kịch bản PHP tùy chỉnh trên máy chủ của tôi, mà lắng nghe trên cổng X. Khách hàng của tôi cố gắng kết nối với nó.Lỗi ổ cắm - đôi khi?

Mọi thứ hoạt động tốt, bảo mật và liên lạc, đồng bộ hóa và mọi thứ khác. Nhưng - Flash Player (thời gian chạy AIR thực sự) bắn một lỗi khi cố gắng kết nối, nhưng CHỈ khi máy chủ không chạy ... Cái gì? Nó thực sự là lạ - lỗi thực sự được xử lý bởi try catch (IOError), và thậm chí còn hơn nữa, dòng được xác định trong đầu ra là dòng lỗi là dòng mà tôi chỉ TẠO Socket ...?

Hm ...

Output:

Error #2044: Unhandled IOErrorEvent:. text=Error #2031: Socket Error. 
    at ---.server::Client()[---/server/Client.as:167] 
    at Function/<anonymous>()[---_fla.MainTimeline::frame1:430] 
    at Function/<anonymous>() 
    at Function/<anonymous>()[---_fla.MainTimeline::frame1:375] 

Code:

try { 
    Sock = new Socket(); // THIS is line 167 
} catch (e:IOError){ 
    log("Could not connect!"); 
    status = "disconnected"; 
} 

Nó không thực sự quan trọng - máy chủ được cho là vẫn còn trên mạng, các lỗi sẽ không hiển thị ... Nhưng bỏ qua một lỗi là không tốt.

Một điều nữa: khi tôi nhận xét dòng mà tôi thực sự kết nối bằng Sock.connect (...) - nó không ném lỗi, nhưng rõ ràng là nó không hoạt động ... Ngoài ra, phần kết nối là cũng trong khối try catch (IOError) ...

Tại sao Flash lại nói vấn đề ở trên đường 167 khi nó rõ ràng ở nơi khác? Và/hoặc những gì có thể là vấn đề?

Trả lời

9

Điều này có thể không rõ ràng nếu bạn chưa từng làm việc với Flash trước đây, nhưng nhiều lỗi trong api thực là không đồng bộ. Có nghĩa là, bạn không thể bắt chúng với một khối catch, bởi vì lỗi không được ném khi bạn thực hiện các phương pháp kết nối, nhưng tại một điểm sau này.

Trong thực tế, thông báo lỗi cho biết bạn có một số vô hình IOErrorEvent không phải là IOError.

này được đề cập ở đây:

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/net/Socket.html#connect()

Về cơ bản, bạn cần phải thêm một handler cho IOErrorEvent (thêm một cho SecurityErrorEvent là một ý tưởng tốt cũng). Một cái gì đó như thế này:

private function connect():void { 
    socket = new Socket(host,port); 
    // handle asynchronous errors in these handlers 
    socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
    socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
    try { 
     socket.connect(); 
    } catch(ioError:IOError) { 
    // handle synchronous errors here 
    } catch(secError:SecurityError) { 
    // and here 
    } 
} 

private function ioErrorHandler(event:IOErrorEvent):void { 
    trace("ioErrorHandler: " + event); 
} 

private function securityErrorHandler(event:SecurityErrorEvent):void { 
    trace("securityErrorHandler: " + event); 
} 
+0

Ồ - Mặc dù về việc thêm trình xử lý đó, nhưng sau đó tôi cho rằng đã quá muộn - tôi chỉ có thể thêm chúng sau khi khởi chạy ... Nhưng vâng - lỗi được thực hiện bởi .connect(). Dù sao cũng cảm ơn. –

0

Tôi đã gặp một lỗi tương tự. Nó đã xảy ra vì tôi đã gỡ bỏ trình xử lý ioErrorHandler (removeEventListener) trước khi phát hành một sock.close(). sock.close() có thể ném một IoErrorEvent.

Mặc dù ioErrorEvent được ném bởi sock.close(), trình gỡ lỗi đã hiển thị lỗi này là lỗi chưa được xử lý ở dòng nơi hàm tạo socket được gọi.

Gọi removeEventListener() sau khi sock.close() giải quyết được sự cố.

Hy vọng điều này sẽ hữu ích.

0

Tôi gặp lỗi trong cùng một tình huống với trình hướng dẫn và đã sửa lỗi bằng cách thay đổi thứ tự đóng và xóa trình xử lý sự kiện.