2015-02-26 14 views
7

Tôi đang sử dụng Dart 1.8.5 trên máy chủ. Tôi muốn triển khai TCP Socket Server lắng nghe các kết nối đến, gửi một số dữ liệu tới mọi máy khách và dừng để tạo dữ liệu khi máy khách ngắt kết nối.Làm cách nào để xử lý ngắt kết nối trong Dart?

Đây là mẫu mã

void main() { 
    ServerSocket.bind(
     InternetAddress.ANY_IP_V4, 
     9000).then((ServerSocket server) { 
    runZoned(() { 
     server.listen(handleClient); 
    }, onError: (e) { 
     print('Server error: $e'); 
    }); 
    }); 
} 

void handleClient(Socket client) { 
    client.done.then((_) { 
    print('Stop sending'); 
    }); 
    print('Send data'); 
} 

Mã này chấp nhận kết nối và in "Gửi dữ liệu". Nhưng nó sẽ không bao giờ in "Dừng gửi" ngay cả khi khách hàng đã biến mất.

Câu hỏi đặt ra là: cách thu hút khách hàng ngắt kết nối trong trình nghe?

+2

Đối với tôi, điều này giống như một lỗi. Vui lòng tạo sự cố tại http://dartbug.com –

+2

https://code.google.com/p/dart/issues/detail?id=22583 – lig

+0

Bạn có thể xem ví dụ trong câu trả lời của tôi. Nó hiển thị 'Ngừng gửi' và trong các detals giải phóng vấn đề được tìm thấy trong SDK Dart. – mezoni

Trả lời

4

Ổ cắm là hai chiều, nghĩa là nó có luồng đầu vào và bồn rửa đầu ra. Tương lai trở lại bằng cách thực hiện được gọi là khi bồn rửa đầu ra được đóng lại bằng cách gọi Socket.close().

Nếu bạn muốn được thông báo khi luồng đầu vào đóng lại, hãy thử sử dụng Socket.drain() để thay thế.

Xem ví dụ bên dưới. Bạn có thể kiểm tra nó bằng telnet. Khi bạn kết nối với máy chủ, nó sẽ gửi chuỗi "Gửi". mỗi giây. Khi bạn đóng telnet (ctrl-], rồi gõ gần). Máy chủ sẽ in "Dừng".

import 'dart:io'; 
import 'dart:async'; 

void handleClient(Socket socket) { 

    // Send a string to the client every second. 
    var timer = new Timer.periodic(
     new Duration(seconds: 1), 
     (_) => socket.writeln('Send.')); 

    // Wait for the client to disconnect, stop the timer, and close the 
    // output sink of the socket. 
    socket.drain().then((_) { 
    print('Stop.');  
    timer.cancel(); 
    socket.close(); 
    }); 
} 

void main() { 
    ServerSocket.bind(
     InternetAddress.ANY_IP_V4, 
     9000).then((ServerSocket server) { 
    runZoned(() { 
     server.listen(handleClient); 
    }, onError: (e) { 
     print('Server error: $e'); 
    }); 
    }); 
} 
Các vấn đề liên quan