unity3D中使用Socket进行数据通信(一)
今年3D产品的工作中心主要集中在提高产品深度上,通过对竞争产品的分析,发现我们的缺陷在于多人在线与后台管理部分,多人在线使用unity自带的Network可以搞定,后台部分前段时间主要研究了下Sqlite。由于sqlite本身不带服务器,作为数据库只是一个文件,sqlite放在服务器上与客户端通信的需求其实就是多个客户端访问同一个文件了,查了一些资料,有很多方法,个人感觉socket不错,一来应用广泛,自己学习后也是一个充电,而来操作灵活,比作文件共享更自由。所以就学习学习了。
基于TCP协议一个很重要的概念就是socket(套接字),记得大学时学的网络七层协议,当时是云里雾里,现在才算有了初步的了解,我们的编程只负责七层协议中的应用层,至于有应用层如何到传输层一直到最底层暂时就不用关心了,只需要知道socket帮我们搞定了底层一些东西。而我们程序对应socket的最重要的两个信息:ip地址和端口号。ip很容易理解,就相当于你家的门牌号,这是唯一的。端口号就相当于你家的窗户,你想出去的话可以走门,也可走窗户,走1号窗户,走2号窗户。。。。(类似电脑中的数据通信)
好了废话不多说,下面只是一个简单的服务器与客户端连接的Demo,后续会陆续放出数据发送与接收部分。我给出代码与测试部分,至于其他不懂的概念,可以自行百度。
1、Socket服务端
使用VS创建应用太控制程序,创建客户端。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
IPAddress ip = IPAddress.Parse("192.168.0.13");
//IPAddress ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
TcpListener tlistener = new TcpListener(ip, 10001);
tlistener.Start();
Console.WriteLine("服务器监听启动......");
while (true)//看上去是死循环,由于阻塞方法,大部分时间都在等待
{
TcpClient remoteClient = tlistener.AcceptTcpClient();//接收已连接的客户端,阻塞方法
Console.WriteLine("客户端已连接!local:{0}<---Client:{1}", remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
}
//ConsoleKey key;
//do
//{
// key = Console.ReadKey(true).Key;
//}
//while (key != ConsoleKey.Q);
}
}
}
2、Socket客户端
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System;
public class SocketClient : MonoBehaviour
{
void Start()
{
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
Client();
}
if (Input.GetKeyDown(KeyCode.Alpha2))
{
SimulateMultiUserClient();
}
}
private void Client()
{
TcpClient client = new TcpClient();
try
{
client.Connect(IPAddress.Parse("192.168.0.13"), 10001);//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被阻塞
}
catch (Exception ex)
{
Debug.Log("客户端连接异常:" + ex.Message);
}
Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);
}
private void SimulateMultiUserClient()
{
TcpClient client;
for (int i = 0; i < 2; i++)
{
client = new TcpClient();
try
{
client.Connect(IPAddress.Parse("192.168.0.13"), 10001);
}
catch (Exception ex)
{
Debug.Log("客户端连接异常:" + ex.Message);
}
Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);
}
}
}