作者:为梦齐舞
首先我们来介绍下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控制三维球上下左右旋转了。
实现过程是不是超级简单,有兴趣的话赶紧试试吧!