# aardio 范例: 异步非阻塞客户端



```aardio
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=660;bottom=381)
winform.add(
edit={cls="edit";left=19;top=14;right=641;bottom=363;edge=1;multiline=1;z=1}
)
/*}}*/

import wsock.tcp.asyncClient;
var tcpClient = wsock.tcp.asyncClient(); 

var file = io.file("/test.zip","w+b");//注意 io.file 默认是文本方式写入的,b指定二进制模式


/*
recv,recvBuffer函数与 read前缀的读数据函数有所区别，
recv不保证每次一定会读完数据，所以在onClose事件里要一直读到没有任何数据。

onReceive里不能多次调用recv，如果希望每次都把接收缓冲区中的数据读完，
请在 onRead事件中调用read前缀的系列函数接收数据。
*/
var buffer = raw.buffer(0x100000);
tcpClient.onReceive = function(err){
    
	var readSize = tcpClient.recvBuffer(buffer);
	
	if( readSize ) {
		file.writeBuffer(buffer,readSize);
		winform.edit.log("已下载",math.size64( file.seek() ).format(),'\r\n')
	} 		
}

//如果用recv,recvBuffer函数收取数据，必须在onClose事件中继续收取最后的数据
tcpClient.onClose = function(err){
	for(readSize,remainSize in tcpClient.eachReadBuffer(buffer) ){ 
		file.writeBuffer(buffer,readSize);
		winform.edit.log("已下载",math.size64( file.seek() ).format(),'\r\n')
	}
	winform.edit.log("服务端已断开",err);
}


tcpClient.connect("127.0.0.1",7510) //因为是异步套接字,这里不需要检查返回值 

winform.show(); 
win.loopMessage();
```

