您的位置:首页 > 理论基础 > 计算机网络

【c#源码】安卓客户端通过TCP通信与Windows服务器进行文件传输

2015-03-12 09:56 726 查看
NetworkComms网络通信框架序言

APK文件 (对应的windows服务器端已经架设好,可以直接下载进行测试)

源码 数据库文件

在前面一篇文章:【源码】c#编写的安卓客户端与Windows服务器程序进行网络通信 中我们探讨了,如何通过xamarin技术,完成安卓客户端与Windows服务器的通信,这篇文章,我们探讨一下使用场景非常多的文件传输.

先谈一下为什么使用xamarin.android技术吧,之前有开发过一个公文系统,c#语言开发,服务器部署在Windows Server 2003上,客户端采用Winform技术(.net2.0),使用了一段时间后,客户提出希望系统能够支持安卓移动端。首先想到了用java语言进行开发,用java写安卓程序应该是最好不过了,但是难点出现了,就是如何让java编写的安卓客户端与现有的Windows服务器上的程序通信,探索多日无果,于是想起了xamarin.adnroid技术,使用此技术,可以集成原有的C#通信框架,TCP通信这一块就解决了.这样做还有一个好处,即能够与原有的服务器端程序无缝集成,服务器端程序同时支持Windows客户端与安卓客户端。

学习Xamarin.Android的时间不长,水平有限,希望本文能够抛砖引玉,对xamarin开发有经验的朋友请多多指点,不足之处敬请批评指正。

本Demo效果图如下



当用户点击“从服务器获取文件”按钮后,服务器端会收到相应的请求,并开始通过TCP连接发送数据,本例中,服务器发送一张图片(大小为20k),客户端收到后,新建一个名称为"msdc"的文件夹,并把文件存储在此文件夹中。`

我们来看一下开发过程:

第一步:在Main.axml文件中,增加一个按钮

<Button
android:id="@+id/btnGetFile"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="从服务器获取文件" />


第二步:

客户端的MainActivity.cs文件中,编写该按钮相对应的方法

Button buttonGetFile = FindViewById<Button>(Resource.Id.btnGetFile);

buttonGetFile.Click += new EventHandler(buttonGetFile_Click);


void buttonGetFile_Click(object sender, EventArgs e)
{
GetFileFromServer();
}


public void GetFileFromServer()
{
//传递的参数为本地保存的路径
string filePath = GetFileSavePath(this);

//发送一个请求给服务器,服务器收到该请求后,开始发送文件
newTcpConnection.SendObject ("GetFileFromServer", filePath);

}



GetFileSavePath


checkSDCard
检查是否存在SD卡

第三步:看一下服务器端的处理程序

NetworkComms.AppendGlobalIncomingPacketHandler<string>("GetFileFromServer", IncomingReqMobileUpFile);


private void IncomingReqMobileUpFile(PacketHeader header, Connection connection, string filePath)
{
//在此Demo中,我们直接指定一个文件,进行发送
string filename = AppDomain.CurrentDomain.BaseDirectory + "Files\\" + "msdc.jpg";

string fileID = FileIDCreator.GetNextFileID(NetworkComms.NetworkIdentifier.ToString());

SendFile sendFile = new SendFile(fileID, filename, filePath, connection, customOptions  );

sendFile.NowSendFile();

}



SendFile方法

第四步:客户端接收服务器发来的文件

//处理文件数据 <2>
NetworkComms.AppendGlobalIncomingPacketHandler<byte[]>("PartialFileData", IncomingPartialFileData);
//处理文件信息 <3>
NetworkComms.AppendGlobalIncomingPacketHandler<SendInfo>("PartialFileDataInfo", IncomingPartialFileDataInfo);



IncomingPartialFileData


IncomingPartialFileDataInfo

MainActivity.cs中添加相应的字典变量

//接收文件字典

Dictionary<string, ReceivedFile> receivedFiles = new Dictionary<string, ReceivedFile>();
/// <summary>
/// Incoming partial data cache. Keys are ConnectionInfo, PacketSequenceNumber. Value is partial packet data.
/// </summary>
Dictionary<ConnectionInfo, Dictionary<long, byte[]>> incomingDataCache = new Dictionary<ConnectionInfo, Dictionary<long, byte[]>>();

/// <summary>
/// Incoming sendInfo cache. Keys are ConnectionInfo, PacketSequenceNumber. Value is sendInfo.
/// </summary>
Dictionary<ConnectionInfo, Dictionary<long, SendInfo>> incomingDataInfoCache = new Dictionary<ConnectionInfo, Dictionary<long, SendInfo>>();



ReceivedFile

第五步:另外在Mobile.Entity类库中还添加了一个SendInfo方法,用于服务器发送文件给客户端是,传递文件相关信息


SendInfo

感谢大家关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: