semaphore demo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...

本文介绍了一个使用Dart语言实现的异步Whois域名信息查询程序。该程序通过Semaphore控制并发数,利用Future和Stream处理异步操作,演示了如何连接到Whois服务器并获取多个域名的注册信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import 'dart:async';
import 'package:semaphore/semaphore.dart';
import 'dart:io';
import 'dart:convert';

void main() async{
  List a = ['zizi.cn','wuwu.cn','baba.cn','hehe.cn','mama.cn','ququ.cn','kaka.cn','yuyu.cn','sasa.cn','sisi.cn','bubu.cn'];

  String host = 'whois.cnnic.net.cn';
  int port = 43;
  var maxCount = 1;
  var sm = LocalSemaphore(maxCount);

  List<Future> whoisToDoList = [];

  for(int i=0; i<a.length; i++){
    DomainModel dm = DomainModel(domain: a[i], server: host, port: port, status: Status.pending, dataFinished:false);
    whoisToDoList.add(doWork(sm, dm));
  }

  await Future.wait(whoisToDoList);
  print('finished');
}

Future doWork(LocalSemaphore sm, DomainModel dm)async{
  try {
    await sm.acquire();
    Whois w = Whois(domain: dm);
    await w.getWhois();
  } finally{
    await sm.release();
  }
}

enum Status {
  pending,
  checking,
  done,
}


class DomainModel{
  DomainModel({this.domain, this.server, this.port, this.status, this.dataFinished});
  String domain;
  String server;
  int port;
  Status status;
  bool dataFinished;
  String whois;
}

class Whois {
  Whois({this.domain});
  DomainModel domain;
  int i = 0;
  Socket socket;

  Future getWhois()async{
    await request();
    while(domain.status != Status.done){
      await Future.delayed(Duration(milliseconds:100));
    }
  }


  Future request() async{
    print('1. starting ${domain.domain}');
    socket = await Socket.connect(domain.server, domain.port);
    await socket.listen(onData, onDone: onDone, onError: onError);
    socket.write(domain.domain + '\n');
  }

  Future onData(value)async{
    domain.dataFinished = true;
    await Future.delayed(Duration(seconds: 1));
    var data = utf8.decode(value);
    domain.whois = data;
  }

  Future onDone () async{
    dispose();
    i = i + 1;
    if(domain.dataFinished == false){
      print('3. ${domain.domain} failed times: $i, will wait for 1 seconds to restart');
      await Future.delayed(Duration(seconds: 1));
      print('4. ${domain.domain} restart');
      await request();
    }else{
      print('set status as done');
      domain.status = Status.done;
    }
  }

  onError(e){
    print('${domain.domain} error');
  }

  dispose(){
    print('${domain.domain} socket destroyed');
    socket.destroy();
  }
}

  

转载于:https://www.cnblogs.com/pythonClub/p/10746885.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值