几天前,我开始在c_中使用这个library。我在尝试发送自定义类时遇到错误,下面是我的代码:
Main.cs

    private void button3_Click(object sender, EventArgs e)
    {
        listBox1.Items.Add("Sending message to server saying '" + textBox2.Text + "'");

        TCPConnection connection = TCPConnection.GetConnection(new ConnectionInfo(serverIP, serverPort));
        SendReceiveOptions options = connection.ConnectionDefaultSendReceiveOptions.Clone() as SendReceiveOptions;
        options.DataProcessors.Add(DPSManager.GetDataProcessor<RijndaelPSKEncrypter>());
        RijndaelPSKEncrypter.AddPasswordToOptions(options.Options, "Your strong PSK");

        if (connection.SendReceiveObject<string>("Payload", "Ack", 1000, new PayloadFile(textBox2.Text)) != null) // <-- Giving an exception here, "Type is not expected, and no contract can be inferred: TCP_Client.PayloadFile"
        {
            listBox1.Items.Add("Done");
        }
    }

PayloadFile.cs
public class PayloadFile
{
    public string FileName;
    public string FileLocation;
    public FileStream FileContent;

    public PayloadFile(string FileToLoad)
    {
        if (!File.Exists(FileToLoad))
        {
            throw new FileNotFoundException();
        }

        FileInfo PayloadInfo = new FileInfo(FileToLoad);
        FileName = PayloadInfo.Name;
        FileLocation = PayloadInfo.DirectoryName;
        FileContent = File.OpenRead(FileToLoad);
    }
}

消息引发的异常:
Type is not expected, and no contract can be inferred: TCP_Client.PayloadFile

我怀疑这门课写错了?

最佳答案

您需要用protobuffer属性来修饰您的类,以使其工作。
我使用以下从示例中获取的服务器脚本进行了一些测试。
另外,不能序列化流对象,需要改用字节数组。

void Main()
{
    //Trigger the method PrintIncomingMessage when a packet of type 'Message' is received
    //We expect the incoming object to be a string which we state explicitly by using <string>
    NetworkComms.AppendGlobalIncomingPacketHandler<PayloadFile>("Payload", PrintIncomingMessage);
    //Start listening for incoming connections
    TCPConnection.StartListening(true);

    //Print out the IPs and ports we are now listening on
    Console.WriteLine("Server listening for TCP connection on:");
    foreach (System.Net.IPEndPoint localEndPoint in TCPConnection.ExistingLocalListenEndPoints())
        Console.WriteLine("{0}:{1}", localEndPoint.Address, localEndPoint.Port);

    //Let the user close the server
    Console.WriteLine("\nPress any key to close server.");
    Console.ReadLine();

    //We have used NetworkComms so we should ensure that we correctly call shutdown
    NetworkComms.Shutdown();

}


        /// <summary>
        /// Writes the provided message to the console window
        /// </summary>
        /// <param name="header">The packetheader associated with the incoming message</param>
        /// <param name="connection">The connection used by the incoming message</param>
        /// <param name="message">The message to be printed to the console</param>
        private static void PrintIncomingMessage(PacketHeader header, Connection connection, PayloadFile message)
        {
            connection.SendObject("Ack", "Ok");
            Console.WriteLine("\nA message was recieved from " + connection.ToString() + " which said '" + message + "'.");
        }


// Define other methods and classes here

    [ProtoContract]
    public class PayloadFile
    {
        [ProtoMember(1)]
        public string FileName { get; set; }

        [ProtoMember(2)]
        public string FileLocation { get; set; }

        [ProtoMember(3)]
        public byte[] FileContent { get; set; }

        public PayloadFile()
        {
        }

        public override string ToString()
        {
            var sb = new StringBuilder();
            sb.AppendLine(string.Format("FilaName: {0}", FileName));
            sb.AppendLine(string.Format("FileLocation: {0}", FileLocation));
            sb.AppendLine(string.Format("FileContent: {0}", System.Text.Encoding.UTF8.GetString(FileContent)));
            return sb.ToString();
        }

    }

这个客户端脚本
void Main()
{
    var serverIP = "::1";
    var serverPort = 10000;

    TCPConnection connection = TCPConnection.GetConnection(new ConnectionInfo(serverIP, serverPort));
    SendReceiveOptions options = connection.ConnectionDefaultSendReceiveOptions.Clone() as SendReceiveOptions;
    options.DataProcessors.Add(DPSManager.GetDataProcessor<RijndaelPSKEncrypter>());
    RijndaelPSKEncrypter.AddPasswordToOptions(options.Options, "Your strong PSK");

    if (connection.SendReceiveObject<string>("Payload", "Ack", 1000,
        new PayloadFile("c:\\CONFIGURACAO.INI")) != null)
    {
        Console.WriteLine("Done");
    }

}

[ProtoContract]
public class PayloadFile
{
    [ProtoMember(1)]
    public string FileName { get; set; }

    [ProtoMember(2)]
    public string FileLocation { get; set; }

    [ProtoMember(3)]
    public byte[] FileContent { get; set; }

    public PayloadFile()
    {
    }

    public PayloadFile(string FileToLoad)
    {
        if (!File.Exists(FileToLoad))
        {
            throw new FileNotFoundException();
        }
        FileInfo PayloadInfo = new FileInfo(FileToLoad);
        FileName = PayloadInfo.Name;
        FileLocation = PayloadInfo.DirectoryName;
        using (var stream = File.OpenRead(FileToLoad))
        {
            FileContent = unchecked((new BinaryReader(stream)).ReadBytes((int)stream.Length));
        }
    }

}

关于c# - Networkcomms.net库发送自定义类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18840409/

10-09 15:55