Передача данных по TCP / IP блокирует единство при передаче - PullRequest
1 голос
/ 09 июня 2019

Я работаю над проектом Unity, где пользователь может отправлять данные с клиента на сервер, используя TCP / IP. Я могу отправить данные. Но мое единство останавливается или останавливается, пока данные не будут прочитаны из сетевого потока.

Код сервера: чтение данных.

   public void StartServer (){
        // Start TcpServer background thread        
        tcpListenerThread = new Thread (new ThreadStart(ListenForIncommingRequests));       
        tcpListenerThread.IsBackground = true;      
        tcpListenerThread.Start();


        startServerButton.interactable = false;

        path =  UnityEditor.EditorUtility.SaveFolderPanel ("Any type of File.", "", ""); //  Path.Combine(path,"D:\\Siva\\TCPDownloadfiles");  

    }



    // Update is called once per frame
    void Update () {        
        if (Input.GetKeyDown(KeyCode.Space)) {             
            SendMessage();         
        }   
    }  




    /// <summary>   
    /// Runs in background TcpServerThread; Handles incomming TcpClient requests    
    /// </summary>  
    private void ListenForIncommingRequests () {

        Thread threadForDownloading = new Thread (new ThreadStart(DownloadingStreamData));      
        threadForDownloading.IsBackground = true;       
        threadForDownloading.Start();

        //DownloadingStreamData ();

    }


    private void DownloadingStreamData()
    {
        try {       
            fileCount++;

            int fileNameLen;
            byte[] incommingData = new byte[1024];
            string ext = "";

            // Create listener on localhost port 8052.          
            tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8052);          
            tcpListener.Start();              
            Debug.Log("Server is listening");              
            bytes = new Byte[Int32.MaxValue];  // 2221024           
            while (true) {              
                using (connectedTcpClient = tcpListener.AcceptTcpClient()) {                    
                    // Get a stream object for reading                  
                    using (stream = connectedTcpClient.GetStream()) {   



                        Debug.Log("Befor Stream Read.........."); 
                        IAsyncResult result = stream.BeginRead(bytes, 0, bytes.Length, MessageReceived,  stream);
                        result.AsyncWaitHandle.WaitOne();


                        // Read incomming stream into byte arrary.                      
                        do{
                            //length = stream.Read(bytes, 0, bytes.Length);
                            //length = s_bytesReceived;

                            Debug.Log("After Stream Read.........."+length); 

                            incommingData = new byte[length];   
                            Array.Copy(bytes, 0, incommingData, 0, length - 4);  

                            // Convert byte array to string message.    
                            fileNameLen = BitConverter.ToInt32(incommingData, 0);
                            string clientMessage = Encoding.ASCII.GetString(incommingData,4, fileNameLen); 
                            ext = Path.GetExtension(clientMessage);

                            //Debug.Log("client message received as: " + clientMessage);            
                            //File.WriteAllBytes(path + "\\temp"+fileCount.ToString()+ext, incommingData);

                            BinaryWriter bWrite = new BinaryWriter(File.Open(path + "\\temp"+fileCount.ToString()+ext, FileMode.Create)); ;
                            bWrite.Write(incommingData, 4 + fileNameLen, length - 4 - fileNameLen);
                            bWrite.Flush();
                            bWrite.Close();

                        } while(stream.DataAvailable); 

                        //Debug.Log("Bytes length2 :>>>"+"   "+fileNameLen +" Incoming data length"  +incommingData.Length);
                        //connectedTcpClient.Close();
                        //stream.Flush();
                        //stream.Close();
                        //Debug.Log("GETTING FILE NAME THROUGH BUFFER ::"+stream);
                    } 

                }

            }       
        }       
        catch (SocketException socketException) {           
            Debug.Log("SocketException " + socketException.ToString());         
        }
    }

Я пытался использовать метод stream.BeginRead, но это вызывает исключение, как будто поток / сокет уже был удален и пытается получить к нему доступ в коде клиента.

Но метод stream.Read работает так, как я ожидал, но он останавливает / блокирует единицу, пока не получит данные. Пожалуйста, дайте мне лучшее решение для этой проблемы. Заранее спасибо.

Код клиента: отправка данных

 if (stream.CanWrite) { 
string path = UnityEditor.EditorUtility.OpenFilePanel ("Any type of File.", "", "");
                WWW www = new WWW ("file:///" + path);

                 byte[] fileNameBytes = Encoding.ASCII.GetBytes(path); 
                 byte[] fileDataBytes = www.bytes;
                 byte[] fileNameLength = BitConverter.GetBytes(fileNameBytes.Length);
                 clientData = new byte[4 + fileNameBytes.Length + fileDataBytes.Length];
                 fileNameLength.CopyTo(clientData, 0);
                 fileNameBytes.CopyTo(clientData, 4);
                 fileDataBytes.CopyTo(clientData, 4 + fileNameBytes.Length);
                 Debug.Log ("FIle sends to server path : "+path);
             //stream.BeginRead(clientData, 0, clientData.Length, MessageReceived,  stream);

             try {
                 stream.Write(clientData, 0, clientData.Length);  
                 //stream.BeginWrite(clientData, 0, clientData.Length, MessageReceived,  stream);
             }catch (Exception e) {             
                 Debug.Log("SocketException " + e.ToString());         
             }
...