来自c#接收nil的lua socket通信

时间:2015-04-29 10:13:16

标签: c# tcp lua luasocket

我试图使用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#end

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检查它似乎永远不会找到&#39;收到&#39;不是没有。我对lua脚本非常陌生,所以希望它简单易懂,我不能理解语法,但我似乎找不到很多文档。

任何建议都会非常感激。

0 个答案:

没有答案