C# 移动端与PC端的数据交互

  小记:针对目前功能越来越强大的智能手机来说,在PC端支持对手机中的用户数据作同步、备份以及恢复等保护措施的应用已经急需完善。不仅要对数据作保护,而且用户更希望自己的手机跟PC能够一体化,以及和远程服务器的一体化。用户希望在手机端的操作能够转移到PC端,对于PC端大屏幕的电脑来说,完成同样的操作可以大量的节省用户的时间。对于功能强大的手机来说,有近1/2的应用可以在PC端同步。所以对PC端应用的规划要以系统的角度来对待。同时要保证手机端和PC端的主流交互模式应保持一致。个人观点:数据的一体化和管理的多元化是以后发展的一个趋势。下面进行今天的学习,今天的实验室移动端和PC端的数据交互及解析。

1,如何实现移动端和PC端的数据交互?

  答:1,蓝牙   2,NFC技术 3,红外 4,Socket.

NFC和蓝牙的异同点:

  相同点:都是近距离传输。

  不同点: NFC优于红外和蓝牙传输方式。作为一种面向消费者的交易机制,NFC比红外更快、更可靠而且简单得多,不用向红外那样必须严格的对齐才能传输数据。与蓝牙相比,NFC面向近距离交易,适用于交换财务信息或敏感的个人信息等重要数据;蓝牙能够弥补NFC通信距离不足的缺点,适用于较长距离数据通信。因此,NFC和蓝牙互为补充,共同存在。事实上,快捷轻型的NFC 协议可以用于引导两台设备之间的蓝牙配对过程,促进了蓝牙的使用。但是要实现远距离的数据传输那就只能用Socket了,

下面进行代码的分析:

首先在PC上建立服务端Server.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace TcpServer
{
    class Program
    {
        public static Socket serverSocket;
        static Thread threadSend;
        static Thread sendDataToClient;
        static int count = 1;
        static void Main(string[] args)
        {
            //确定端口号
            int port = 121;

            //设定连接IP
            string host = "192.168.1.100";

            //将IP地址字符串转化为IP地址实例
            IPAddress ip = IPAddress.Parse(host);

            //将网络端点表示为 IP 地址和端口号
            IPEndPoint ipe = new IPEndPoint(ip, port);

            //建立Socket
            //addressFamily 参数指定 Socket 类使用的寻址方案
            //socketType 参数指定 Socket 类的类型
            //protocolType 参数指定 Socket 使用的协议。
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //socket与本地终结点建立关联
            socket.Bind(ipe);
            while (true)
            {
                //开始监听端口
                socket.Listen(0);

                Console.WriteLine("服务已开启,请等待....." + DateTime.Now.ToString() + DateTime.Now.Millisecond.ToString());

                //为新建的连接建立新的Socket目的为客户端将要建立连接
                serverSocket = socket.Accept();
                Console.WriteLine("连接已建立......" + DateTime.Now.ToString() + DateTime.Now.Millisecond.ToString());
                Console.WriteLine("客户端IP:"+serverSocket.RemoteEndPoint);
                string recStr =string.Empty;
                //定义缓冲区用于接收客户端的数据
                byte[] recbyte = new byte[1024];

                ReceiveData();

                sendDataToClient = new Thread(sendData);
                sendDataToClient.Start();

            }
        }

        public static void sendData()
        {

            while (true)
            {
                Console.WriteLine("send to client\n");
                //服务端给客户端回送消息
                string strSend = "Hello Android Client!" + DateTime.Now.Second;
                //string strSend = "HelloClient1HelloClient2HelloClient3HelloClient4HelloClient5HelloClient6HelloClient7HelloClient8HelloClient9HelloClient10HelloClient11HelloClien12HelloClien13HelloClien14HelloClien15HelloClient16";
                byte[] sendByte = new byte[1024];
                //将发送的字符串转换为byte[]
                sendByte = UTF8Encoding.UTF8.GetBytes(strSend);
                //服务端发送数据

                serverSocket.Send(sendByte, sendByte.Length, 0);
                Thread.Sleep(1000);
            }
        }

        #region
        /// <summary>
        /// 异步连接
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <param name="clientSocket"></param>
        public static void Connect(IPAddress ip, int port)
        {
            serverSocket.BeginConnect(ip, port, new AsyncCallback(ConnectCallback), serverSocket);
        }

        private static void ConnectCallback(IAsyncResult ar)
        {
            try
            {
                Socket handler = (Socket)ar.AsyncState;
                handler.EndConnect(ar);
            }
            catch (SocketException ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="data"></param>
        public static void Send(string data)
        {
            //Send(System.Text.Encoding.UTF8.GetBytes(data));
            Send(UTF8Encoding.UTF8.GetBytes(data));
        }
        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="byteData"></param>
        private static void Send(byte[] byteData)
        {
            try
            {
                int length = byteData.Length;
                byte[] head = BitConverter.GetBytes(length);
                byte[] data = new byte[head.Length + byteData.Length];
                Array.Copy(head, data, head.Length);
                Array.Copy(byteData, 0, data, head.Length, byteData.Length);
                serverSocket.BeginSend(data, 0, data.Length, 0, new AsyncCallback(SendCallback), serverSocket);
            }
            catch (SocketException ex)
            { }
        }

        private static void SendCallback(IAsyncResult ar)
        {
            try
            {
                Socket handler = (Socket)ar.AsyncState;
                handler.EndSend(ar);
            }
            catch (SocketException ex)
            {
                throw ex;
            }
        }

        static byte[] MsgBuffer = new byte[128];

        /// <summary>
        /// 接收消息
        /// </summary>
        public static void ReceiveData()
        {
            if (serverSocket.ReceiveBufferSize > 0)
            {
                serverSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallback), null);
            }
        }

        private static void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                int REnd = serverSocket.EndReceive(ar);
                Console.WriteLine("长度:" + REnd);
                if (REnd > 0)
                {
                    byte[] data = new byte[REnd];
                    Array.Copy(MsgBuffer, 0, data, 0, REnd);

                    int Msglen = data.Length;
                    //在此次可以对data进行按需处理

                    serverSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallback), null);
                    //Console.WriteLine("接收服务端的信息:{0}", Encoding.ASCII.GetString(MsgBuffer, 0, Msglen));

                    Console.WriteLine("接收服务端的信息:{0}", UTF8Encoding.UTF8.GetString(data, 0, Msglen));
                }
                else
                {
                    dispose();
                }
            }
            catch (SocketException ex)
            { }
        }

        private static void dispose()
        {
            try
            {
                serverSocket.Shutdown(SocketShutdown.Both);
                serverSocket.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion
    }
}

移动端使用Unity3D写的脚本挂在mainCamera上,代码如下:

using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System.Net;
using System;
using System.Text;
using System.IO;

public class client : MonoBehaviour
{
    public GUIText text;
    public GUIText path;

    public static Socket clientSocket;
    // Use this for initialization
    void Start ()
    {
     //服务器IP
        string LocalIP = "192.168.1.100";     //端口号
        int port = 121;
        IPAddress ip =IPAddress.Parse(LocalIP);
        IPEndPoint ipe = new IPEndPoint(ip,port);
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立客户端Socket
        clientSocket.Connect(ipe);
        StartCoroutine("sendData"); //启动协同程序
        StartCoroutine("getInfo");  

    }

    // Update is called once per frame
    void Update ()
    {
        if(Input.GetKey(KeyCode.Escape)||Input.GetKey(KeyCode.Home))
        {
            Application.Quit();
        }
    }
    void OnGUI()
    {
        if(GUI.Button(new Rect(Screen.width/2-40,30,100,60),"截图"))
        {
            StartCoroutine("GetCapture");
        }
    }

    IEnumerator GetCapture ()
    {
        yield return new WaitForEndOfFrame();
        int width = Screen.width;
        int height = Screen.height;
        Texture2D tex = new Texture2D (width, height, TextureFormat.RGB24, false);
        tex.ReadPixels (new Rect (0, 0, width, height), 0, 0, true);
        byte[] imagebytes = tex.EncodeToPNG ();//转化为png图
        tex.Compress (false);//对屏幕缓存进行压缩
        //image.mainTexture = tex;//对屏幕缓存进行显示(缩略图)
        string PicPath="storage";
        File.WriteAllBytes (Application.persistentDataPath+"/"+Time.time+ ".png", imagebytes);//存储png图
        path.text = Application.persistentDataPath+"/";
    }

    /// <summary>
    /// 向服务器发送消息
    /// </summary>
    /// <returns>The data.</returns>
    public IEnumerator sendData()
    {
        int i=0;
        while(true)
        {
            string sendStr = i.ToString()+"你好 server,I am Android";
            byte[] sendBytes = UTF8Encoding.UTF8.GetBytes(sendStr);
            clientSocket.Send(sendBytes);
            i++;
            yield return new WaitForSeconds(1f);
        }
    }
    /// <summary>
    /// 得到服务器回应
    /// </summary>
    /// <returns>The info.</returns>
    public IEnumerator getInfo()
    {
        while(true)
        {
            byte[] revBytes = new byte[1024];
            int bytes = clientSocket.Receive(revBytes, revBytes.Length, 0);
            string revStr ="";
            //revStr += Encoding.ASCII.GetString(revBytes, 0, bytes);
            revStr += UTF8Encoding.UTF8.GetString(revBytes,0,bytes);
            Debug.Log ("接收到服务器消息:"+revStr);
            text.text = "From Server:"+revStr;
            yield return null;
        }
  }
}

服务器端运行结果:

服务器回送消息代码:string strSend = "Hello Android Client!" + DateTime.Now.Second;

局域网下测试没有什么问题,以后无论是做应用还是网络游戏肯定少不了的是Socket网络数据传输,多了解点网络知识还是很有必要的尤其是TCP协议,如有错误,欢迎指正。

时间: 2024-10-06 15:55:11

C# 移动端与PC端的数据交互的相关文章

使用vue实现简单键盘,支持移动端和pc端

常看到各种app应用中使用自定义的键盘,本例子中使用vue2实现个简单的键盘,支持在移动端和PC端使用,欢迎点赞 实现效果: Keyboard.vue <template> <div class="keyboard" v-show="showKeyboard" v-clickoutside="closeModal"> <p v-for="keys in keyList"> <templ

私有云车牌识别支持app端、pc端、H5端接口调用

关键词 私有云车牌识别技术.服务器端车牌识别技术.云端车牌识别技术.私有化车牌识别技术.服务器端车牌识别.私有化车牌识别.私有云车牌识别. 什么叫私有云车牌识别呢? 私有云车牌识别即服务器端车牌识别,是一款基于服务器平台的车牌OCR识别服务程序,企业可以将该识别服务部署在自有服务器上(云服务器或本地服务器),部署完成后,APP端.PC客户端.web端.微信H5端等均可发送识别请求,通过Web Service接口调用该识别服务,上传车牌图像在服务器端完成识别后,返回标准XML识别结果,整个识别过程

JavaScript判断移动端及pc端访问不同的网站

http://www.html-js.com/article/2677 现在很多网站都是分为两个版本,一个pc端的一个移动端的(响应式除外),针对这两个版本,就需要对访问的设备进行判断,如果是pc,就直接访问pc网站,否则就访问移动端网站. 对于这个问题可以通过判断UA来解决,前端js可以判断,后端判断也行,这里我们主要讨论的是如何通过js来处理. 假如我们有一个网站,pc端通过www.test.com访问,而移动端通过m.test.com来访问.我们需要做的就是当移动端访问www.test.c

iis 如何搭建url 重定向,实现无线端和pc端不同的跳转

第一步,下载安装ARR(Application Request Routing), http://www.iis.net/downloads/microsoft/application-request-routing 第二步,简要设置ARR: 安装完成后,IIS里会多出两个图标,分别是Application Request Routing和URL重写.2.0版本(也就是2008或者Win7系统)需要双击ApplicationRequest Routing以后,在右侧Server Proxy Se

html与css的移动端与pc端需要注意的事项

一个移动端与pc端之间最主要的也就是尺寸问题,苹果与安卓的机型尺寸大小相差甚多,一个尺寸都会影响用户的体验.那么我们来了解一下一些常用的解决方法. 一般在网页中都会在头部有一些这样的代码 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"> 1)首先 nam

前端:移动端和PC端的区别

在阿里的几次面试中,总是被问到移动端和PC端有什么区别,当时回答的时候主要是回答了在兼容性.网速.适配.页面布局等方面的不同,但是还是很不系统,所以这里做一个总结. 第一: PC考虑的是浏览器的兼容性,而移动端开发考虑的更多的是手机兼容性,因为目前不管是android手机还是ios手机,一般浏览器使用的都是webkit内核,所以说做移动端开发,更多考虑的应该是手机分辨率的适配,和不同操作系统的略微差异化. 第二: 在部分事件的处理上,移动端多出来的事件是触屏事件,而缺少的是hover事件. 另外

js判断游览器是移动端还是PC端

js判断网页游览器是移动端还是PC端 1 <script type="text/javascript"> 2 function browserRedirect() { 3 var sUserAgent = navigator.userAgent.toLowerCase(); 4 var bIsIpad = sUserAgent.match(/ipad/i) == "ipad"; 5 var bIsIphoneOs = sUserAgent.match(/

移动端访问PC端网页时跳转到对应的移动端网页

不想通过CSS自适应在PC端和移动端分别显示不同的样式,那么只能通过在移动端访问PC端网页时跳转到对应的移动端网页了,那么怎么跳转呢,网上也有很多文章说明,下面是本人测试有效的方式. 1.效果图 PC端访问显示: 移动端访问显示: 2.实现: 不考虑移动端搜索引擎优化的话,只需要通过JS判断是否移动端,然后确定是否跳转到指定页面就行了,主要JS如下: //判断是否移动端,如果是则跳转到指定的URL地址 function browserRedirect(url) { //只读的字符串,声明了浏览器

关于移动端和PC端的交互的区别

对于现在的移动端设备的普及,移动端上的用户体验成了一个重要的关注点. 看了一些网上的关于移动端的交互和用户体验的知识,这里总结了一些.若有不足的地方,希望大家能够积极补充. PC端和移动端的产品的设计区别 屏幕与适配的问题考虑: 操作系统(windows,mac,android,iOS等)的区别: 网络环境(并不是每一个移动端设备随时随地都有网络): 使用场景(站着,坐着,躺着,蹲着,趴着,走着等等): 传感器的使用(摇一摇功能,地图实时导航,语音输入等): 操作方式不同(PC端是点击,移动端是