• Scoket 服务器监听多个客户端发来的图片


    这是服务器 直接上代码 都有详细注释 注意线程需要自己手动关闭 不然程序会卡死

    /*              #########                       
                  ############                     
                  #############                    
                 ##  ###########                   
                ###  ###### #####                  
                ### #######   ####                 
               ###  ########## ####                
              ####  ########### ####               
             ####   ###########  #####             
            #####   ### ########   #####           
           #####   ###   ########   ######         
          ######   ###  ###########   ######       
         ######   #### ##############  ######      
        #######  #####################  ######     
        #######  ######################  ######    
       #######  ###### #################  ######   
       #######  ###### ###### #########   ######   
       #######    ##  ######   ######     ######   
       #######        ######    #####     #####    
        ######        #####     #####     ####     
         #####        ####      #####     ###      
          #####       ###        ###      #        
            ###       ###        ###              
             ##       ###        ###               
    __________#_______####_______####______________
        身是菩提树,心如明镜台,时时勤拂拭,勿使惹尘埃。
                    我们的未来没有BUG              
    * ==============================================================================
    * Filename: SocketServers
    * Created:  $time$
    * Author:   WYC
    * Purpose:  scoket服务器监听端口脚本 
    * ==============================================================================
    */
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using UnityEngine;
    
    public class SocketServers : MonoBehaviour
    {
        //图片保存的地址与名字
        private string IpStr = "192.168.2.224";
        private Socket serverSocket;
        private Thread thread;
    
        void Start () {
            //desPathName.Replace("/","\");  
            //Debug.Log(desPathName);  
            IPAddress ip = IPAddress.Parse(IpStr);
            IPEndPoint ip_end_point = new IPEndPoint(ip, 8080);
            //创建服务器Socket对象,并设置相关属性  
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定ip和端口  
            serverSocket.Bind(ip_end_point);
            //设置最长的连接请求队列长度  
            serverSocket.Listen(10);
            Debug.Log("启动监听" + serverSocket.LocalEndPoint.ToString() + "成功");
            //在新线程中监听客户端的连接  
            Thread thread = new Thread(ClientConnectListen);
            thread.Start();
        }
        /// <summary>  
        /// 客户端连接请求监听  
        /// </summary>  
        private void ClientConnectListen()
        {
            while (true)
            {
                //为新的客户端连接创建一个Socket对象  
                Socket clientSocket = serverSocket.Accept();
                clientSocket.ReceiveBufferSize = 1024 * 1024 ;
    
                Debug.Log("客户端" + clientSocket.RemoteEndPoint.ToString() + "成功连接");
                //每个客户端连接创建一个线程来接受该客户端发送的消息  
                thread = new Thread(RecieveMessage);
                thread.Start(clientSocket);
            }
        }
        private static byte[] bttess1;
        private static byte[] bttess2;
        private static byte[] bttess3;
    
        /// <summary>  
        /// 接收指定客户端Socket的消息  
        /// </summary>  
        /// <param name="clientSocket"></param>  
        private static void RecieveMessage(object clientSocket)
        {
            Socket mClientSocket = (Socket)clientSocket;
    
            while (true)
            {
                try
                {
                    byte[] bytes = new byte[1536 * 2048];
                    int receiveNumber = mClientSocket.Receive(bytes);
                    Debug.Log("接收客户端" + mClientSocket.RemoteEndPoint.ToString().Substring(0, 11));
                    MemoryStream fs = new MemoryStream();
                    fs.Write(bytes, 0, receiveNumber);
    
                    if (mClientSocket.RemoteEndPoint.ToString().Substring(0, 12) == "192.168.2.41")
                    {
                        bttess1 = fs.ToArray();
                        dinosaur = Dinosaur.One;
                    }
                    if (mClientSocket.RemoteEndPoint.ToString().Substring(0, 13) == "192.168.2.224")
                    {
                        bttess2 = fs.ToArray();
                        dinosaur = Dinosaur.Two;
                    }
                    if (mClientSocket.RemoteEndPoint.ToString().Substring(0, 12) == "192.168.2.46")
                    {
                        bttess3 = fs.ToArray();
                        dinosaur = Dinosaur.Thress;
                    }
                    //Debug.Log("fs");
                    //从内存中再次将数据读出来并保存为jpg图片  
                    //注意 这里 无法保存在C盘  
                    //System.Drawing.Image Img = System.Drawing.Image.FromStream(fs);
                    //image = System.Drawing.Image.FromStream(fs);
                    //Img.Save(desPathName, ImageFormat.Jpeg);
                    Debug.Log("保存完毕!!!");
                    fs.Close();
                }
                catch (Exception ex)
                {
                    Debug.Log(ex.Message + "有一个退出了:这是一个异常");
                    dinosaur = Dinosaur.None;
                    mClientSocket.Shutdown(SocketShutdown.Both);
                    mClientSocket.Close();
                    break;
                }
                //这里开辟了1M的字节空间 也就是一次图片的传输最大是1M大小 
            }
        
            
        }
    
        
        public GameObject[] perfab;
        private static Dinosaur dinosaur = Dinosaur.None;
        private void Update()
        {
            switch (dinosaur)
            {
                case Dinosaur.None:
    
                    break;
                case Dinosaur.One:
                    Debug.Log("1");
                    GameObject obj = Instantiate(perfab[0],new Vector3(0,0,0),Quaternion.identity);
                    Texture2D texture = new Texture2D(1536, 2048);
                    texture.LoadImage(bttess1);
                    obj.transform.GetComponent<MerteiShader>().generateTexture(texture);
                    dinosaur = Dinosaur.None;
                    break;
                case Dinosaur.Two:
                    Debug.Log("2");
                    GameObject obj1 = Instantiate(perfab[1],new Vector3(0, 10, 0), Quaternion.identity);
                    Texture2D texture2 = new Texture2D(1536, 2048);
                    texture2.LoadImage(bttess2);
                    obj1.transform.GetComponent<MerteiShader>().generateTexture(texture2);
                    dinosaur = Dinosaur.None;
                    break;
                case Dinosaur.Thress:
                    Debug.Log("3");
                    GameObject obj2 = Instantiate(perfab[2],new Vector3(0, 20, 0), Quaternion.identity);
                    Texture2D texture3 = new Texture2D(1536, 2048);
                    texture3.LoadImage(bttess3);
                    obj2.transform.GetComponent<MerteiShader>().generateTexture(texture3);
                    dinosaur = Dinosaur.None;
                    break;
                default:
                    break;
            }
    
        }
        public void setAbort()
        {
            if (thread != null)
            {
                thread.Abort();
            }
        }
        void OnDestroy()
        {
            Debug.Log(" 脚本以关闭");
            setAbort();
        }
    }
    enum Dinosaur
    {
        None=0,
        One=1,
        Two=2,
        Thress=3
    }
    

      客户端处理是摄像机拍照转成byte[]字节流发送

    /*              #########                       
                  ############                     
                  #############                    
                 ##  ###########                   
                ###  ###### #####                  
                ### #######   ####                 
               ###  ########## ####                
              ####  ########### ####               
             ####   ###########  #####             
            #####   ### ########   #####           
           #####   ###   ########   ######         
          ######   ###  ###########   ######       
         ######   #### ##############  ######      
        #######  #####################  ######     
        #######  ######################  ######    
       #######  ###### #################  ######   
       #######  ###### ###### #########   ######   
       #######    ##  ######   ######     ######   
       #######        ######    #####     #####    
        ######        #####     #####     ####     
         #####        ####      #####     ###      
          #####       ###        ###      #        
            ###       ###        ###              
             ##       ###        ###               
    __________#_______####_______####______________
        身是菩提树,心如明镜台,时时勤拂拭,勿使惹尘埃。
                    我们的未来没有BUG              
    * ==============================================================================
    * Filename: CameraManger
    * Created:  $time$
    * Author:   WYC
    * Purpose:  
    * ==============================================================================
    */
    
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class CameraManger : MonoBehaviour
    {
        private string IpStr = "192.168.2.224";
        public Camera camera1;
        public Rect rect;
        private TcpClient client;
        private byte [] _byte;
        private bool bIsInCD = false;
        public float TimeSpeed = 3;
        public Image _Sprite;
        public Text Lable;
        public RawImage Phonte;
        public GameObject[] GameObj;
    
        public Text BaocaoLable;
        //关闭待机画面
        public void CloseStandby() {
            GameObj[0].SetActive(false);
           // OpenCamera.instance.cameraSwitch();
        }
        //重拍
        public void Rephotograph() {
            GameObj[1].SetActive(false);
            GameObj[2].SetActive(true);
            GameObj[3].SetActive(true);
            //OpenCamera.instance.Play();
        }
    
        //上传服务器
        public void SendStreamToServer()
        {
            Rephotograph();
            //try
            //{
            //    NetworkStream streamToServer = client.GetStream();//获得客户端的流  
            //    streamToServer.Write(_byte, 0, _byte.Length);//将转换好的二进制数据写入流中并发送 
            //    Debug.Log("发出图片");
            //    BaocaoLable.text = "发出图片成功";
            //}
            //catch (Exception ex)
            //{
            //    Debug.Log("服务端产生异常:" + ex.Message);
            //    BaocaoLable.text = "服务端产生异常:" + ex.Message;
            //}
            try
            {
               
    
                //发送数据  
                clientMsg.Send(_byte);
                BaocaoLable.text = "发出图片成功";
            }
            catch (SocketException e)
            {
                BaocaoLable.text = e.Data.ToString();
                clientMsg.Shutdown(System.Net.Sockets.SocketShutdown.Send);
                clientMsg.Close();
                clientMsg = null;
            }
        }
        //拍照
        public void GetPhonte()
        {
            bIsInCD = true;
            _Sprite.fillAmount = 1;
        }
        //倒计时开始拍照
        private void StartCD()
        {
            if (bIsInCD)
            {
                _Sprite.fillAmount -= (1f / TimeSpeed) * Time.deltaTime;//对图片按照时间进行360度的旋转剪切
                Lable.text = (TimeSpeed * _Sprite.fillAmount).ToString("F0");//改变冷却时间
                if (_Sprite.fillAmount <= 0.05f)
                {
                    bIsInCD = false;
                    _Sprite.fillAmount = 0;
                    Lable.text = "";
                    TakePhotos();
                }
            }
        }
        //拍照获取获取照片
        private void TakePhotos()
        {
            GameObj[2].SetActive(false);
            GameObj[3].SetActive(false);
            // 创建一个RenderTexture对象  
            RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
            // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机  
            camera1.targetTexture = rt;
            camera1.Render();
            // 激活这个rt, 并从中中读取像素。  
            RenderTexture.active = rt;
            Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
            screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素  
            screenShot.Apply();
            // 重置相关参数,以使用camera继续在屏幕上显示  
            camera1.targetTexture = null;
            RenderTexture.active = null; // JC: added to avoid errors  
            GameObject.Destroy(rt);
            _byte = screenShot.EncodeToPNG();
            Phonte.texture = screenShot;
            GameObj[1].SetActive(true);
            //OpenCamera.instance.Stop();
        }
    
        private Socket clientMsg;
        void Start()
        {
            IPEndPoint ipendpiont = new IPEndPoint(IPAddress.Parse(IpStr), 8080);
            clientMsg = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientMsg.Connect(ipendpiont);
            //client = new TcpClient();
            //try
            //{
            //    client.Connect(IPAddress.Parse("192.168.2.224"), 8080);//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被阻塞  
            //}
            //catch (Exception ex)
            //{
            //    Debug.Log("客户端连接异常:" + ex.Message);
            //    BaocaoLable.text = "客户端连接异常:" + ex.Message;
            //}
            //Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);
            //BaocaoLable.text = "LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint;
        }
        void Update()
        {
            StartCD();
        }
    }
    

      当时俩者之间传输  问题不断 我这个只能算是参考  谢谢指教

  • 相关阅读:
    sql函数
    sql日期
    Windows下串口编程
    Libreoffice/Office:禁止首字母自动大写功能
    convert:图片转pdf失败
    LibreOffice/Calc:单元格设置下拉菜单
    Ubuntu:查询计算机软硬件信息
    tar:文件打包归档
    中科大自主招生2018年笔试数学之五
    文件分割与合并
  • 原文地址:https://www.cnblogs.com/mclll520/p/7891737.html
Copyright © 2020-2023  润新知