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

    上一篇博客主要介绍了使用socket搭建服务端和client程序,这一篇来说说socket的数据传输,我们使用socket的目的是解决点对点之间的数据传输,之前提到了socket中一个重要的概念:port。而socket数据传输的方式就是port与port之间以流(stream)的方式数据传输,socket命名空间中提供了该流的一个功能类(NetworkStream),用起来非常方便,由于不论什么能够转换为二进制的数据都能够保存到流中,所以能够再client与server之前传输不论什么形式的数据。

    以下我们介绍最主要的传输数据,由client向服务端发送数据,服务端接收到数据后并显示!还是依照惯例,服务端使用VS的控制台应用程序。client使用Unity3D来整。核心语句都有凝视,重载方法能够再msdn上自行查看。

    如有错误,欢迎指正!

    1、服务端接收数据并显示:

    static void Main(string[] args)
            {
                const int bufferSize = 8792;//缓存大小,8192字节
                IPAddress ip = IPAddress.Parse("192.168.0.13");
    
                TcpListener tlistener = new TcpListener(ip, 10001);
                tlistener.Start();
                Console.WriteLine("server监听启动......");
                TcpClient remoteClient = tlistener.AcceptTcpClient();//接收已连接的client,堵塞方法
                Console.WriteLine("client已连接!local:{0}<---Client:{1}", remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
               
                //接收client发送的数据部分
                NetworkStream streamToClient = remoteClient.GetStream();//获得来自client的流
                byte[] buffer = new byte[bufferSize];//定义一个缓存buffer数组
                int byteRead = streamToClient.Read(buffer,0,bufferSize);//将数据搞入缓存中(有朋友说read是堵塞方法,測试中未发现程序堵塞)
                string msg = Encoding.Unicode.GetString(buffer, 0, byteRead);//从二进制转换为字符串相应的client会有从字符串转换为二进制的方法
                Console.WriteLine("接收数据:{0}[{1}byte]",msg,byteRead);
    
                ConsoleKey key;
                do
                {
                    key = Console.ReadKey(true).Key;
                }
                while (key != ConsoleKey.Q);
            }
    

    2、client封装字符串并发送:

    TcpClient client;
        private void Client()
        {
            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);
    
            //客户端发送数据部分
            string msg = "hello server";
            NetworkStream streamToServer = client.GetStream();//获得客户端的流
            byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制
            streamToServer.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入流中并发送
            Debug.Log("发出消息:"+msg);
    }
    

    注意:以上仅仅是基础的数据通信,真正项目中会存在两个问题:

    1、数据量过大超过自己定义的缓存大小,8192字节。一般发送字符串的话差点儿不可能超过8192字节,假设发送图片或者音效的话就会出现数据被截断的现象。

    2、以上程序仅仅是一个程序想服务端发送一次数据的过程。不能多次发送,更不能多个client想server发送数据。

    我上网查了下这两个问题,都应对应的解决方法。採用“分次读取,然后转存”的方式解决数据量过大,使用do/while双层嵌套能够解决多个client向server发送多个消息的问题。兴许会将方案再分享给大家,与大家一起学习进步!




  • 相关阅读:
    云主机装黑果实践(6):处理云主机上变色龙启动后置过程:驱动和黑屏
    云主机装黑果实践(5):重得到镜像和继续强化前置启动过程
    云主机装黑果实践(3):得到云主机安装镜像
    云主机装黑果实践(2):在deepin kvm下测试mbr方式安装的黑果10.15最新版
    百度贴吧私信群发软件
    eclipse 工程默认编码修改 JSP编码修改
    Jquery 对象转json ,Json转对象。兼容浏览器。
    让人操蛋的童工新闻
    Hibernate 只获取外键id,不获取内容
    Spring Data Jpa 规范接口表
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7301115.html
Copyright © 2011-2022 走看看