zoukankan      html  css  js  c++  java
  • unity3D中使用Socket进行数据通信(一)

    公司今年3D产品的工作中心主要集中在提高产品深度上,通过对竞争产品的分析,发现我们的缺陷在于多人在线与后台管理部分,多人在线使用unity自带的Network能够搞定,后台部分前段时间主要研究了下Sqlite。因为sqlite本身不带server,作为数据库仅仅是一个文件,sqlite放在server上与client通信的需求事实上就是多个client訪问同一个文件了。查了一些资料,有非常多方法,个人感觉socket不错。一来应用广泛。自己学习后也是一个充电,而来操作灵活,比作文件共享更自由。所以就学习学习了。

    基于TCP协议一个非常重要的概念就是socket(套接字)。记得大学时学的网络七层协议。当时是云里雾里,如今才算有了初步的了解,我们的编程仅仅负责七层协议中的应用层,至于有应用层怎样到传输层一直到最底层临时就不用关心了。仅仅须要知道socket帮我们搞定了底层一些东西。而我们程序相应socket的最重要的两个信息:ip地址和port号。

    ip非常easy理解。就相当于你家的门牌号,这是唯一的。port号就相当于你家的窗户,你想出去的话能够走门,也可走窗户,走1号窗户,走2号窗户。。。。

    (类似电脑中的数据通信)

    好了废话不多说,以下仅仅是一个简单的server与client连接的Demo。兴许会陆续放出数据发送与接收部分。我给出代码与測试部分。至于其它不懂的概念,能够自行百度。

    1、Socket服务端

    使用VS创建应用太控制程序,创建client。


    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("server监听启动......");
                while (true)//看上去是死循环,因为堵塞方法,大部分时间都在等待
                {
                    TcpClient remoteClient = tlistener.AcceptTcpClient();//接收已连接的client,堵塞方法
                    Console.WriteLine("client已连接!local:{0}<---Client:{1}", remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
                }
    
                //ConsoleKey key;
                //do
                //{
                //    key = Console.ReadKey(true).Key;
                //}
                //while (key != ConsoleKey.Q);
            }
        }
    }

    2、Socketclient

    Unity3D中建立client。

    创建脚本。将该脚本挂载到空场景的不论什么一个游戏物体上。

    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);//同步方法,连接成功、抛出异常、server不存在等之前程序会被堵塞
            }
            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);
            }
        }
    }
    



  • 相关阅读:
    Hibernate提供的内置标识符生成器
    ThreadLocal解析
    save()/saveOrUpdate()/merge()的区别
    Hibernate中主键生成策略
    session/SessionFactory线程非安全和线程安全
    load/get延迟加载和及时加载
    最长公共子序列:递归,非递归实现
    c语言,递归翻转一个单链表,c实现单链表
    最长递增子序列(Longest Increase Subsequence)
    求一串数字中——和最大的连续子序列; 求一串数字差值的绝对值最小的两个数字
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7233429.html
Copyright © 2011-2022 走看看