さまざまなブロードキャスト メッセージを送信することで、単純なネットワーク プログラムを動作させようとしています。
最初の私のメッセージクラス:
[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() { }
}
今、私は2つの方法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 であるかどうかを確認する必要があります
しかし、私はそれを機能させる方法をまだ見つけていません。文字列はタイプとして受け入れられます。スイッチケースを使用したくありません。その後、さらに多くのタイプのメッセージが追加されるためです。
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();
}