1

我正在尝试使用 lua 脚本从程序中提取一些数据,然后将该数据发送到 ac# 脚本,然后该脚本对其进行处理并返回一些简单的消息供 lua 脚本传递给程序。

lua脚本如下

-- Socket decls
local socket = require("socket")
local host, port = "127.0.0.1", 3000
local tcp = assert(socket.tcp())
tcp:connect(host,port)
tcp:settimeout(0)
tcp:send("Stream starting...")

function sendEventInfoToServer(string)

    tcp:send(string)

end

function processEventInfo()
    local received, status = tcp:receive()

    if received ~= nil then
        print(received, status);
    end

end

while true do

     -- unrelated logic

    processEventInfo();
end

在 C# 端

public class SimpleTCPListener
{
    private TcpListener tcpListener;
    private TcpClient _tcpClient;
    private Thread listenThread;

    private NetworkStream clientStream;

    List<string> eventsWaiting;
    public List<string> EventsWaiting { 
        get {
            List<string> tempList = new List<string>();
            for (int i = 0; i < eventsWaiting.Count; i++)
                tempList.Add(eventsWaiting[i]);
            EventsWaiting = new List<string>();
            return tempList;
    } 
        private set { eventsWaiting = value; }
    }

    public SimpleTCPListener()
    {
        EventsWaiting = new List<string>();
        this.tcpListener = new TcpListener(IPAddress.Any, 3000);
        this.listenThread = new Thread(new ThreadStart(ListenForClients));
        this.listenThread.Start();
    }

    private void ListenForClients()
    {
        this.tcpListener.Start();

        while(true)
        {
            // blocks until a client has connected to the server
            TcpClient client = this.tcpListener.AcceptTcpClient();

            // create a thread to handle communication
            // with connected client
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientCom));
            clientThread.Start(client);

            clientStream = client.GetStream();
        }
    }

    public void SendSavestateLoadRequest()
    {
        if(clientStream != null)
        {
            ASCIIEncoding encoder = new ASCIIEncoding();
            byte[] buffer = encoder.GetBytes("HelloLua!\n");
            Console.WriteLine("Sending data back to lua");
            if (clientStream.CanWrite)
                clientStream.Write(buffer, 0, buffer.Length);
            else
                Console.WriteLine("Connection close!");
            //clientStream.Flush();
        }
    }

    private void HandleClientCom(object client)
    {
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();

        byte[] message = new byte[4096];
        int bytesRead;

        while(true)
        {
            bytesRead = 0;

            try
            {
                // blocks until a client sends a message
                bytesRead = clientStream.Read(message, 0, 4096);
            }
            catch
            {
                // a socket error has occured
                break;
            }

            if(bytesRead == 0)
            {
                // the client disconnected
                break;
            }

            // message has been recieved
            ASCIIEncoding encoder = new ASCIIEncoding();
            System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
            string s = encoder.GetString(message, 0, bytesRead);
            Console.WriteLine(s);

            if (!string.IsNullOrEmpty(s))
                eventsWaiting.Add(s);
        }

        tcpClient.Close();
    }
}

现在,Lua 与 C# 线程对话没有问题,并且 C# 在将数据发送回 lua 时不会报告任何错误,但是在 lua 端它不断收到 nil,但是如果我删除 nil 检查它有时会收到和打印字符串,但是使用 nil 检查它似乎永远不会发现“收到”不是 nil。我对 lua 脚本真的很陌生,所以希望它很简单,我不了解语法,但我似乎找不到很多文档。

任何建议将不胜感激。

4

0 回答 0