用BCB发送文件的问题 高分求救

来源:百度知道 编辑:UC知道 时间:2024/06/07 05:57:17
两边用ClientSocket和ServerSocket建立连接 A向B发送文件的请求 接到B的回复消息"/R"时A发送准备发送文件的信号"/S",然后启动发送文件的线程,B收到"/S"后启动接受文件的线程,ClientSocket和ServerSocket都可以向对方发送文件,通过Socket->Active判断本机是用哪个,下面是ClientSocket的OnRead事件,在这里对收到的Text进行分析
AnsiString ReceMsg;
ReceMsg=CSocket->Socket->ReceiveText();
if(ReceMsg.SubString(1,2)=="/N")
{
AnsiString ReceFileName,ReceFileLength,ShowMsg;
ReceFileName=ReceMsg.SubString(3,ReceMsg.Pos("/L")-3);
ReceFileLength=ReceMsg.SubString(ReceMsg.Pos("/L")+2,ReceMsg.Length()-ReceMsg.Pos("/L")-1);
ShowMsg="对方向你发送文件 "+ReceFileName+",大小:"+ReceFileLength.c_str()+"KB,是否接收?";
if(Application->MessageBox(ShowMsg.c_str(),"消息",MB_YESNO)==IDYES)
{
if(SaveDialog->Execute())
{
CSocket->Socket->SendText("/R");
}
}
return;
}
if(ReceMsg.SubString

A向B发送文件的请求 接到B的回复消息"/R"时A发送准备发送文件的信号"/S",然后启动发送文件的线程,B收到"/S"后启动接受文件的线程,
--------------------------------
个人觉得你先简化一下C/S握手协议,在A向B发送文件请求后,B同意接收后发送消息"/R"回给A,同时,B就启动接收线程,不需要等待A的"/S"消息,同样,A收到B的同意接收文件的"/R"消息后就直接开始发送文件线程,不需要再发"/S"消息.

在代码中,你试着将开启接收线程的代码调整到
SSocket->Socket->Connections[0]->SendText("/R");
下面,略过发送和接收"/S"消息的代码试试.
因为在你的服务端好象没看到有"/S"消息的发送,导致客户端收不到"/S"消息而无法启动接收线程.
=========================================
接收线程接收数据:
阻塞方法:接收线程开启后,直接使用recvfrom或者recv从服务端"读",这样会使接收线程一直阻塞到读到数据为止.
非阻塞方法:使用SELECT方法建立多路IO复用,使数据到达客户端时通知接收线程来"读"
具体的方法你可以在网上自己搜索一下,还有,我建议你学点更底层的东西,因为BCB对SOCKET套接口进行了一次封装,你学一下基本的套接口函数,对于开发网络程序非常有帮助,你可以给我你的邮件地址,我发一个我以前学习的资料给你自己学习....