基于Socket简单实现分离式控制三维场景

作者:为梦齐舞

      首先我们来介绍下Socket这个概念,根据百度百科的介绍,Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
      介绍完Socket这个概念,那我们来谈下本文的实现,就是使用移动设备来控制PC端的三维场景,本文使用iOS和.NET程序进行交互。
      一、服务端部分实现
      1、 首先在vs2012环境下使用SuperMap iObjects .NET 8C搭建一个的三维场景,至于如何搭建,这个小编就不做具体介绍了,可以参考SuperMap官方文档。
这里写图片描述

      2、 在此WinForm程序中搭建Socket服务器,用于接收消息,首先需要引用System.Net动态库至工程中。

      3、 这里使用IP设定为本机IP,设置端口号为8885,在程序启动时编写如下代码:

	 IPAddress ip = IPAddress.Parse("192.168.15.47");
     serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     serverSocket.Bind(new IPEndPoint(ip, 8885));  //绑定IP地址:端口  
     serverSocket.Listen(10);    //设定最多10个排队连接请求  

      4、 启动一个线程来监听客户的连接情况,在步骤3的代码中添加线程启动代码:

   Thread myThread = new Thread(ListenClientConnect);
   myThread.Start();
   Console.ReadLine(); 

            实现方法ListenClientConnect,并在连接后添加监听消息接收的线程。

	private  void ListenClientConnect()
    {
        while (true)
        {
            Socket clientSocket = serverSocket.Accept();
            clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));
            Thread receiveThread = new Thread(ReceiveMessage);
            receiveThread.Start(clientSocket);
        }
    }

      5、实现线程ReceiveMessage来接收消息

    private  void ReceiveMessage(object clientSocket)
    {
        Socket myClientSocket = (Socket)clientSocket;
        while (true)
        {
            try
            {
                //通过clientSocket接收数据  
                int receiveNumber = myClientSocket.Receive(result);
                String info = Encoding.ASCII.GetString(result, 0, receiveNumber
            }
            catch (Exception ex)
            {
            }
        }
     }

      6、消息接收的服务器就已经搭建好了,接下来我们需要根据接收到的消息来控制三维场景,在步骤5中的添加如下代码:

    switch (info)
         {
              case "up":
                  sceneControl.Scene.Pan(0, 5);
                  break;
               case "down":
                  sceneControl.Scene.Pan(0, -5);
                  break;
               case "left":
                  sceneControl.Scene.Pan(5, 0);
                  break;
               case "right":
                  sceneControl.Scene.Pan(-5, 0);
                  break;
               default:
                  break;
         }

      7、到此一步,我们就可以根据接收到的消息来控制三维场景了,接下来我们需要搭建一个消息发送器。

二、客户端部分实现

      1、这里使用iOS端来实现,实现之前我们先介绍本文中使用到的第三方库CocoaAsyncSocket,CocoaAsyncSocket是谷歌的开发者,基于BSD-Socket写的一个开源框架,它给Mac和iOS提供了易于使用的、强大的异步套接字库,向上封装出简单易用OC接口。省去了我们面向Socket以及数据流Stream等繁琐复杂的编程。下载地址:https://github.com/robbiehanson/CocoaAsyncSocket

      2、在Xcode中新建iOS工程,解压CocoaAsyncSocket资源包,将资源包Source/GCD下的文件拷贝并引用到新建工程中,添加CFNetwork.framework资源库。
这里写图片描述

      3、在程序启动时建立连接,在viewDidLoad中添加如下代码:

    scoket=[[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    NSError *err;
    [scoket connectToHost:@"xxx.xxx.xxx.xxx" onPort:8885 error:&err];
    if (err!=nil)
    {
        NSLog(@"%@",err);
        return;
    }
    [scoket readDataWithTimeout:-1 tag:0];

      4、在界面中添加4个按钮,分别命名up、down、left、rigth,分别代表上下左右,添加Action,在事件中添加如下代码:

	UIButton *button=(UIButton *)sender;
	NSData *data=[button.titleLabel.text dataUsingEncoding:NSUTF8StringEncoding];
	scoket writeData:data withTimeout:30 tag:0]; 

      5、到此客户端的搭建就已经完成了,运行之前的WinForm程序,然后运行客户端,就可以使用手机或者ipad控制三维球上下左右旋转了。
这里写图片描述

实现过程是不是超级简单,有兴趣的话赶紧试试吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值