TcpClient в C # Unity с сервером C - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь создать клиент ac # tcp, чтобы он мог получать сообщение с сервера c и отправлять его на него.Но у меня есть проблема.я могу прочитать первое сообщение, отправленное моим сервером, но если я отправлю сообщение на мой сервер, оно захочет отправить мне нокаут, но я никогда не получу нокаут.Но это работает с netcat ... Мой код ниже:

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

 /*
 ** @brief Permit to create and keep the server connection
 **
 ** @param Void
 ** @return Void
 */

public class TCPClients : MonoBehaviour {

    private TcpClient socketConnection;
    private Thread clientReceiveThread;
    private bool stop = true;
   // private MapModification map;

    /*
    ** @brief Permit to start code
    **
    ** @param Void
    ** @return Void
    */
    void Start ()
    {
        ConnectToTcpServer();
    }

    /*
    ** @brief to call function at each frame
    **
    ** @param Void
    ** @return Void
    */  
    void Update ()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            SendMessages("CLIENT_GFX");
        }
    }

    /*
    ** @brief Permit to create and keep the server connection
    **
    ** @param Void
    ** @return Void
    */
    private void ConnectToTcpServer ()
    {
        try 
        {
            clientReceiveThread = new Thread (new ThreadStart(ListenForData));
            clientReceiveThread.IsBackground = true;
            clientReceiveThread.Start();
        }
        catch (Exception e) 
        {
            Debug.Log("On client connect exception " + e);
        }
    }

    /*
    ** @brief Permit to connect and listen server
    **
    ** @param Void
    ** @return Void
    */
    private void ListenForData()
    {
        try {
            socketConnection = new TcpClient("192.168.1.47", 4244);
        }
        catch (SocketException socketException) {
            Debug.Log("Socket exception: " + socketException);
        }
        using (NetworkStream stream = socketConnection.GetStream())
        {
            while (stop) {
                Byte[] bytes = new Byte[1024];
                int length;
                if (stream.DataAvailable) 
                {
                    while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) //block here
                    {
                        Debug.Log("Length = " + length);
                        var incommingData = new byte[length];   
                        Array.Copy(bytes, 0, incommingData, 0, length);
                        string serverMessage = Encoding.ASCII.GetString(incommingData);
                        Debug.Log("Message from server :" + serverMessage);
                    }
                    Debug.Log("After while");
                }
                Thread.Sleep(1);
            }
        }
    }

    /*
    ** @brief Permit to send a massage to the server
    **
    ** @param string message -> contain the message 
    ** that will be send to the server
    ** @return Void
    */
    private void SendMessages(string message)
    {
        if (socketConnection == null)
        {
            return;
        }
        try 
        {
            NetworkStream stream = socketConnection.GetStream();
            if (stream.CanWrite)
            {
                string clientMessage = message;
                byte[] clientMessageAsByteArray = Encoding.ASCII.GetBytes(clientMessage);
                stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length);
                Debug.Log("Message send = " + clientMessage);
            }
        } 
        catch (SocketException socketException) 
        {
            Debug.Log("Socket exception: " + socketException);
        }
    }

    /*
    ** @brief Permit to close socket and stop loop at application quit
    **
    ** @param Void
    ** @return Void
    */
    private void OnApplicationQuit()
    {
        stop = false;
        socketConnection.GetStream().Close();
        socketConnection.Close();
    }
}

Как вы видите, я думаю, что я блокирую во время чтения, потому что это плохо.Если кто-нибудь может мне помочь.Thx.

1 Ответ

0 голосов
/ 09 июня 2018

Переменная «стоп» никогда не устанавливается в ложь.(За исключением случаев, когда приложение закрывается)

Я думаю, что вам нужно установить

stop = false;

прямо перед строкой, где написано Debug.Log ("After while");

Кроме того, вы повторяете попытку в случае сбоя, что нормально, но после неудачных попыток x вы должны сделать что-то, например, зарегистрировать проблему или выйти из приложения.Повторная попытка всего через 1 миллисекунду кажется мне слишком быстрой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...