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

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

 

感谢大家关注

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值