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); }
第三步:看一下服务器端的处理程序
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(); }
第四步:客户端接收服务器发来的文件
//处理文件数据 <2> NetworkComms.AppendGlobalIncomingPacketHandler<byte[]>("PartialFileData", IncomingPartialFileData); //处理文件信息 <3> NetworkComms.AppendGlobalIncomingPacketHandler<SendInfo>("PartialFileDataInfo", 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>>();
第五步:另外在Mobile.Entity类库中还添加了一个SendInfo方法,用于服务器发送文件给客户端是,传递文件相关信息
感谢大家关注