Обновление потоков в C # / Unity3D для подключения к клиентскому серверу TCP / IP - PullRequest
0 голосов
/ 16 мая 2018

У меня следующая проблема:

Мой код должен устанавливать соединение между C # -скриптом в Unity3D (= клиент) и сервером на локальной машине. Моя цель - отправлять сообщения через единство на сервер, где его обрабатывает чат-бот. После этого он должен отправить ответ обратно к единству. Проблема в том, что чат-сервер закрывает соединение каждый раз, когда отправляет ответ. Вот почему клиент должен открывать его каждый раз, когда получает сообщение от сервера. Сначала я попытался решить эту проблему с помощью фонового потока, но быстро наткнулся на проблему многопоточности, так как новый поток открывается при каждом цикле обновления. До сих пор я не нашел эффективного способа либо просто «обновить» поток, что означает, что новый поток не создается, а обновляется только соединение между клиентом и сервером, либо просто закрыть существующий поток после каждого цикла обновления.

Может быть, кто-то может дать мне подсказку, как я могу изменить свой код для правильной работы. Большое спасибо заранее!

using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;

public class UnityClient2 : MonoBehaviour {     
private TcpClient socketConnection;     
private Thread clientReceiveThread;     
// Use this for initialization  
void Start () {
    ConnectToTcpServer("open");     
}
// Update is called once per frame
void Update () { 
    ConnectToTcpServer("open");         
    if (Input.GetKeyDown(KeyCode.Space)) {             
        SendMessage(); 
        ConnectToTcpServer("close"); 
    }
}   
/// <summary>   
/// Setup socket connection.    
/// </summary>  

private void ConnectToTcpServer (string state) {        
    if (state == "close") {             
        clientReceiveThread.Abort();    
    }       
    else if (state == "open") {
        clientReceiveThread = new Thread (new ThreadStart(ListenForData));          
        clientReceiveThread.IsBackground = true;            
        clientReceiveThread.Start(); 
    }   
    else {
        return;
    } 
}   
/// <summary>   
/// Runs in background clientReceiveThread; Listens for incomming data.     
/// </summary>     
private void ListenForData() {      
    try {           
        socketConnection = new TcpClient("127.0.0.1", 1024);            
        Byte[] bytes = new Byte[1024];             
        while (true) {              
            // Get a stream object for reading              
            using (NetworkStream stream = socketConnection.GetStream()) {                   
                int length;                     
                // Read incomming stream into byte array.                   
                while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) {                       
                    var incommingData = new byte[length];                       
                    Array.Copy(bytes, 0, incommingData, 0, length);                         
                    // Convert byte array to string message.                        
                    string serverMessage = Encoding.ASCII.GetString(incommingData);                         
                    Debug.Log("server message received as: " + serverMessage);                  
                }               
            }           
        }         
    }         
    catch (SocketException socketException) {             
        Debug.Log("Socket exception: " + socketException);         
    }     
}   
/// <summary>   
/// Send message to server using socket connection.     
/// </summary>  
private void SendMessage() {         
    if (socketConnection == null) {             
        return;         
    }       
    try {           
        // Get a stream object for writing.             
        NetworkStream stream = socketConnection.GetStream();            
        if (stream.CanWrite) {           
            //IMPORTANT: Message has to be a null terminated string, so that ChatScript can understand
            string clientMessage ="guest"+ char.MinValue+ ""+ char.MinValue+ ""+char.MinValue;              
            // Convert string message to byte array.                 
            byte[] clientMessageAsByteArray = Encoding.ASCII.GetBytes(clientMessage);               
            // Write byte array to socketConnection stream.                 
            stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length); 
            //                
            Debug.Log("Client sent his message - should be received by server");             
        }         
    }       
    catch (SocketException socketException) {             
        Debug.Log("Socket exception: " + socketException);         
    }     
} 

} `

...