我试图通过发送不同的广播消息来获得一个简单的网络程序。
首先是我的消息类:
[Serializable()]
public class Message<T>
{
public enum MessageType
{
Broadcast,
Unicast
}
private T _payload;
private readonly MessageType _type;
private readonly DateTime _createdOn = DateTime.Now;
public MessageType Type
{
get { return _type; }
}
public T Payload
{
get { return _payload; }
set { _payload = value; }
}
public DateTime CreatedOn
{
get { return _createdOn; }
}
private Message() { }
private Message(T setPayload, MessageType type)
{
_payload = setPayload;
_type = type;
}
public class Builder
{
private readonly T _payload;
private MessageType _messageType = MessageType.Unicast;
public Builder(T payload)
{
_payload = payload;
}
public Builder Broadcast()
{
_messageType = MessageType.Broadcast;
return this;
}
public Message<T> Build()
{
Message<T> result = new Message<T>(_payload, _messageType);
return result;
}
}
}
然后我有我的课程:
[Serializable()]
public class HelloWorld
{
public String HelloString { get; set; }
public HelloWorld() { }
}
[Serializable()]
class HelloWorld2
{
public String HelloString2 { get; set; }
public HelloWorld2() { }
}
现在我有两种方法SendHelloWorld()
和SendHelloWorld2()
.
我正在为包含 typeName 的字符串保留我的 Memorystream 的前 32 个字节。
internal void SendHelloWorld()
{
HelloWorld helloWorld = new HelloWorld();
var message = new Message<HelloWorld>.Builder(helloWorld).Broadcast().Build();
// implement broadcasting
Stream memoryStream = new MemoryStream();
byte[] buffer = ASCIIEncoding.ASCII.GetBytes("Messages.HelloWorld");
memoryStream.Write(buffer, 0, buffer.Length);
SerializationService.Serialize(memoryStream, message);
SendBroadcastMessage(memoryStream);
}
SendBroadCastMessage 只是将流转换为 byte[] 并广播消息。
收到它们时,我必须检查消息是 Typeof HelloWorld 还是 HelloWorld2
但我还没有找到让它工作的方法,字符串被接受为类型,我不想使用 switch-case,因为之后会添加更多类型的消息。
private void UdpListener()
{
UdpClient listener = new UdpClient(9050, AddressFamily.InterNetwork);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
Stream inputStream = new MemoryStream(listener.Receive(ref iep));
byte[] buffer = new byte[32];
inputStream.Read(buffer, 0, 32);
string type = ASCIIEncoding.ASCII.GetString(buffer,0,32);
Message<type> message = _service.Deserialize<Message<HelloWorld>>(inputStream);
Received(message.Payload);
listener.Close();
}