早教吧作业答案频道 -->其他-->
socket异步的实现机制?1.调用beginsend之后,是马上执行sendCallback回调,还是发送完成了执行?2.调用beginReceive()之后,一收到数据就执行ReceiveCallback回调,还是缓冲区满了时,还是收到数据缓冲区未满超
题目详情
socket异步的实现机制?
1.调用beginsend之后,是马上执行sendCallback回调,还是发送完成了执行?
2.调用beginReceive()之后,一收到数据就执行ReceiveCallback回调,还是缓冲区满了时,还是收到数据缓冲区未满超过某个时间执行回调?
3.发送完成之后是客户端最后一次调用beginSend()之后发送端关闭socket先,还是接收端收到最后一次数据,然后接收端关闭 socket先再轮到发送端关闭socket?
最后,如果有C# socket 异步传输文件的例子就最好啦,
1.调用beginsend之后,是马上执行sendCallback回调,还是发送完成了执行?
2.调用beginReceive()之后,一收到数据就执行ReceiveCallback回调,还是缓冲区满了时,还是收到数据缓冲区未满超过某个时间执行回调?
3.发送完成之后是客户端最后一次调用beginSend()之后发送端关闭socket先,还是接收端收到最后一次数据,然后接收端关闭 socket先再轮到发送端关闭socket?
最后,如果有C# socket 异步传输文件的例子就最好啦,
▼优质解答
答案和解析
1.发送完了执行.(假设你要发送一个很大的文件,要分好几次发送,第一次还没发完就回调了,在回调函数中再来第二次发送不就出异常了).
2.数据接收完毕或者缓冲区满了时.(如果没有数据发过来,这个线程会一直挂起,没有“超过某个时间就回调”的说法).
3.数据发送完毕和关闭Socket有什么联系呢,数据发送完了,Socket连接还在呀,除非你调用了Socket.ShutDown(SocketShutdown.Both)时就不能收发数据了,Socket.Close()才会关闭Socket,Socket的关闭是由你来控制的.
例子:(随便写了几句代码,给你加点注释)
int i;
int size = 1024;
byte buffer = new byte[size];
//读文件
FileStream fs =new FileStream(filename,FileMode.Open,FileAccess.Read);
//将文件转化成二进制流(不然怎么传)
BinaryReader br = new BinaryReader(fs);
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,ProtocolType.Tcp);
//连接对方主机的ip地址和侦听端口
sock.Connect(ip,port);
//将文件的二进制流读入缓冲区
br.Read(buffer,0,size);
//将缓冲区的内容异步发送出去,委托回调函数EndSendFile()在后面
sock.BeginSend(buffer,0,size,SocketFlags.None,
new AsyncCallback(EndSendFile),null);
private void EndSendFile(IAsyncResult AR)
{
//结束挂起的异步发送
sock.EndSend(AR);
//判断文件是否读完,没读完继续读到缓冲区
if ((i = br.Read(buffer,0,size)) != 0)
{
//发送缓冲区内容,你看清楚回调函数(就是本函数)
//就是说这次发送完后又调用这个函数来判断和发送
sock.BeginSend(buffer,0,size,SocketFlags.None,
new AsyncCallback(EndSendFile),null);
}
}
这是我随便写的几句代码,不过我以前都实践过的,应该是对的,你想运行它的话,还要自己加点东西,还要写个接收程序(异步接收的话就用你说的BeginReceive()试一试).
2.数据接收完毕或者缓冲区满了时.(如果没有数据发过来,这个线程会一直挂起,没有“超过某个时间就回调”的说法).
3.数据发送完毕和关闭Socket有什么联系呢,数据发送完了,Socket连接还在呀,除非你调用了Socket.ShutDown(SocketShutdown.Both)时就不能收发数据了,Socket.Close()才会关闭Socket,Socket的关闭是由你来控制的.
例子:(随便写了几句代码,给你加点注释)
int i;
int size = 1024;
byte buffer = new byte[size];
//读文件
FileStream fs =new FileStream(filename,FileMode.Open,FileAccess.Read);
//将文件转化成二进制流(不然怎么传)
BinaryReader br = new BinaryReader(fs);
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,ProtocolType.Tcp);
//连接对方主机的ip地址和侦听端口
sock.Connect(ip,port);
//将文件的二进制流读入缓冲区
br.Read(buffer,0,size);
//将缓冲区的内容异步发送出去,委托回调函数EndSendFile()在后面
sock.BeginSend(buffer,0,size,SocketFlags.None,
new AsyncCallback(EndSendFile),null);
private void EndSendFile(IAsyncResult AR)
{
//结束挂起的异步发送
sock.EndSend(AR);
//判断文件是否读完,没读完继续读到缓冲区
if ((i = br.Read(buffer,0,size)) != 0)
{
//发送缓冲区内容,你看清楚回调函数(就是本函数)
//就是说这次发送完后又调用这个函数来判断和发送
sock.BeginSend(buffer,0,size,SocketFlags.None,
new AsyncCallback(EndSendFile),null);
}
}
这是我随便写的几句代码,不过我以前都实践过的,应该是对的,你想运行它的话,还要自己加点东西,还要写个接收程序(异步接收的话就用你说的BeginReceive()试一试).
看了 socket异步的实现机制?...的网友还看了以下:
讽刺夸张一般用A.A升调B.B降调C.C平调D.D曲调 2020-03-31 …
函数y=x^3+12x+1在定义域内?A单调增加B单调减少C为凹函数D为凸函数函数y=x^3+12 2020-07-02 …
4列调查中,适宜采用抽样调查方式如是()A.调查我市中学生每天体育锻炼的时间B.调查某班学生的视力 2020-07-09 …
在同一架钢琴上.弹奏C调的3(mi)和1(dou)这两个音说法正确的是:A音色一定不同B音调一定不 2020-07-24 …
有两个物体A和B,它们的质量为Ma和Mb...A在B上面,A对B的压力为N,如果让它们一起做自由落 2020-07-29 …
高中数学问题A∩B=B∩A是集合A交集合B等于集合B交集合A的意思吗,还有别的意思吗A∪B=B∪A 2020-08-02 …
请问EX表格怎么设置当A格=1时B格等于5,A=2-3时B=6,A=4-5时B=7,A=6-7时B= 2020-11-01 …
1、关于电位器,下列说法错误的是()A、电位器实质上是一种变阻器B、调节耳机音量的器件其实是一种数字 2020-12-07 …
计算题(重金悬赏)A欠B合计人民币535元,A通过多方筹集得到500元,如若将500还以B则还差B人 2020-12-14 …
重视调研是中国政府决策的最大特点。“十三五”规划编制期间,中国开展了基础调查、信息搜集、重点课题调研 2020-12-19 …