2017-03-28 54 views
4

我有两个不同的可执行文件在运行Windows操作系统的同一台计算机上运行。他们都是在Unity中构建的。我想从一个发送消息到其他而不使用网络在Unity中将消息从一个程序发送到另一个程序

如何从EXE程序发送消息到Unity中的另一个EXE程序?

这可能与integrated Mono/.net functionality或其他?

+0

Ramdisk是一个快速 –

回答

7

您可以使用命名管道它采用共享内存的,同一机上与其他应用程序进行通信。

转到文件 - >构建设置...选择PC,苹果机& Linux的独立然后点击播放器设置...。现在,将Api兼容级别更改为.NET 2.0

关闭并重新打开Visual Studio。现在,您可以导入using System.IO.Pipes;并能够使用NamedPipeServerStreamNamedPipeClientStream

下面是一个非常简单的服务器和客户端。你必须Thread做到这一点,也应该处理异常。

如果您不想使用Thread,还有一个异步参数(PipeOptions.Asynchronous),使其成为非阻塞运算符。它从那里变得复杂,你必须寻找MS doc上的一些例子。

简单的服务器

//Create Server Instance 
NamedPipeServerStream server = new NamedPipeServerStream("MyCOMApp", PipeDirection.InOut, 1); 
//Wait for a client to connect 
server.WaitForConnection(); 
//Created stream for reading and writing 
StreamString serverStream = new StreamString(server); 
//Send Message to Client 
serverStream.WriteString("Hello From Server"); 
//Read from Client 
string dataFromClient = serverStream.ReadString(); 
UnityEngine.Debug.Log("Received from Client: " + dataFromClient); 
//Close Connection 
server.Close(); 

简单的客户端

//Create Client Instance 
NamedPipeClientStream client = new NamedPipeClientStream(".", "MyCOMApp", 
       PipeDirection.InOut, PipeOptions.None, 
       TokenImpersonationLevel.Impersonation); 

//Connect to server 
client.Connect(); 
//Created stream for reading and writing 
StreamString clientStream = new StreamString(client); 
//Read from Server 
string dataFromServer = clientStream.ReadString(); 
UnityEngine.Debug.Log("Received from Server: " + dataFromServer); 
//Send Message to Server 
clientStream.WriteString("Bye from client"); 
//Close client 
client.Close(); 

MS DocStreamString类:

public class StreamString 
{ 
    private Stream ioStream; 
    private UnicodeEncoding streamEncoding; 

    public StreamString(Stream ioStream) 
    { 
     this.ioStream = ioStream; 
     streamEncoding = new UnicodeEncoding(); 
    } 

    public string ReadString() 
    { 
     int len = 0; 

     len = ioStream.ReadByte() * 256; 
     len += ioStream.ReadByte(); 
     byte[] inBuffer = new byte[len]; 
     ioStream.Read(inBuffer, 0, len); 

     return streamEncoding.GetString(inBuffer); 
    } 

    public int WriteString(string outString) 
    { 
     byte[] outBuffer = streamEncoding.GetBytes(outString); 
     int len = outBuffer.Length; 
     if (len > UInt16.MaxValue) 
     { 
      len = (int)UInt16.MaxValue; 
     } 
     ioStream.WriteByte((byte)(len/256)); 
     ioStream.WriteByte((byte)(len & 255)); 
     ioStream.Write(outBuffer, 0, len); 
     ioStream.Flush(); 

     return outBuffer.Length + 2; 
    } 
} 
+1

谢谢!这是我正在寻找的解决方案 – mcelik

+0

我实施了您提供的代码。但它引发此错误: NotImplementedException:单声道不支持ACL 我搜索了一个解决方案,但找不到答案。 – mcelik

+0

你正在windows上运行这个,对吧?请从下往上开始评论以查看哪一行代码导致了该错误。 – Programmer

1

你可以有一个文件,他们都写和读。 你可以把一个时间戳与它表明,当最后的消息写入

+1

当您在SSD上反复执行此操作时听起来不错但很糟糕。 – Programmer

+0

True @Programmer你可以像使用一个数据库那样使用一个消息列来添加行,但对于一件非常小的事情来说这是相当多的工作 –

+2

Year。任何使用RAM进行存储的数据库都应该这样做。我认为那里几乎没有。虽然,这就像喝桶水一样。 – Programmer

相关问题