gpt4 book ai didi

c# - Networkcomms.net 库发送自定义类

转载 作者:可可西里 更新时间:2023-11-01 02:39:43 27 4
gpt4 key购买 nike

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

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

我怀疑类(class)写错了?

最佳答案

您需要使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com