c# - C#Unity和C服务器中的TcpClient

标签 c# c multithreading unity3d tcp

我正在尝试创建一个C#TCP客户端,它可以接收来自C服务器的消息并将其发送给它。
但是我有一个问题。
我可以读取服务器发送的第一条消息,但是如果我向服务器发送消息,它想向我发送KO,但我从未收到过KO。
但是它可以与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();
    }
}


就像您看到的那样,我认为我正在阅读一会儿,因为这样做比较麻烦。
如果有人可以帮助我。
谢谢。

最佳答案

变量“ stop”永远不会设置为false。 (应用退出时除外)

我认为你需要设定

stop = false;


就在它说Debug.Log(“ After while”);的行之前;

此外,您可以在失败的情况下重试,但是在x次失败重试之后,您应该执行“某些操作”,例如记录问题或退出应用程序。仅1毫秒后重试对我来说似乎有点太快了。

关于c# - C#Unity和C服务器中的TcpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50772571/

相关文章:

c# - 对象发送者作为验证当前文本框的参数

c# - 监视多个可变数量的进程的启动和退出

c# - SqlDataReader 已经在不同的命令中打开

c - Lua错误没有传递 bool 值

c - 线程间通信,线程之间的切换

c - 在二维数组的一行上运行的并行化函数(C、OpenMP、CilkPlus)

c++ - QObject::moveToThread:小部件不能移动到新线程

c# - Linq 和返回类型

C99 - 为什么 false 和 true 定义为 0 和 1 而不是 ((bool)0) 和 ((bool)1)?

c++ - c/c++ 中是否有一个函数可以获取整数符号并删除值?