ソケットを使ってクライアントサーバプログラムを作成するための C# ライブラリ
Révision | 03db556f2cfe46bfa6a81ea34d28a05eb97dc069 (tree) |
---|---|
l'heure | 2015-08-15 12:04:23 |
Auteur | tsntsumi <tsntsumi@tsnt...> |
Commiter | tsntsumi |
Packet クラスをリファクタリング
ヘッダの構造が、デフォルトのヘッダ長 4 バイト、フッタ長 0 バ
イト、ペイロード長 = ヘッダ 4 バイトとは異なる場合、必ず
Packet クラスを継承してプロパティ・メソッドをオーバライドし
なければならなかったが、ヘッダ長とフッタ長とペイロード長の取
得方法が変わった程度の場合ならオーバライドしないでも良いよう
に変更した。
@@ -15,8 +15,6 @@ namespace SampleChatClient | ||
15 | 15 | /// </summary> |
16 | 16 | public class ChatMessage: Packet |
17 | 17 | { |
18 | - public override int HeaderLength { get { return 2; } } | |
19 | - | |
20 | 18 | /// <summary> |
21 | 19 | /// メッセージを送受信する接続を取得または設定します。 |
22 | 20 | /// </summary> |
@@ -30,7 +28,7 @@ namespace SampleChatClient | ||
30 | 28 | /// <summary> |
31 | 29 | /// コンストラクタ。 |
32 | 30 | /// </summary> |
33 | - public ChatMessage() | |
31 | + public ChatMessage() : base(2, 0) | |
34 | 32 | { |
35 | 33 | } |
36 | 34 |
@@ -40,6 +38,7 @@ namespace SampleChatClient | ||
40 | 38 | /// <param name="message">メッセージ文字列。</param> |
41 | 39 | /// <param name="connection">接続。</param> |
42 | 40 | public ChatMessage(string message, TcpConnection connection = null) |
41 | + : base(2, 0) | |
43 | 42 | { |
44 | 43 | Message = message; |
45 | 44 | Connection = connection; |
@@ -50,6 +49,10 @@ namespace SampleChatClient | ||
50 | 49 | /// </summary> |
51 | 50 | /// <returns>ペイロード長。</returns> |
52 | 51 | /// <param name="header">ヘッダ。</param> |
52 | + /// <remarks> | |
53 | + /// ベースクラスの Packet.ObtainPayloadLength() と同じことをしているため、 | |
54 | + /// 本来ならオーバライドする必要はないが、サンプルとして提供するため実装した。 | |
55 | + /// </remarks> | |
53 | 56 | public override int ObtainPayloadLength(byte[] header) |
54 | 57 | { |
55 | 58 | int payloadLength = header[0] << 8 | header[1]; |
@@ -18,12 +18,23 @@ namespace SocketNet | ||
18 | 18 | /// <summary> |
19 | 19 | /// ヘッダ長を取得します。 |
20 | 20 | /// </summary> |
21 | - public virtual int HeaderLength { get { return 4; } } | |
21 | + public virtual int HeaderLength { get; private set; } | |
22 | 22 | |
23 | 23 | /// <summary> |
24 | 24 | /// フッタ長を取得します。 |
25 | 25 | /// </summary> |
26 | - public virtual int FooterLength { get { return 0; } } | |
26 | + public virtual int FooterLength { get; private set; } | |
27 | + | |
28 | + /// <summary> | |
29 | + /// コンストラクタ。 | |
30 | + /// </summary> | |
31 | + /// <param name="headerLength">ヘッダ長。</param> | |
32 | + /// <param name="footerLength">フッタ長。</param> | |
33 | + public Packet(int headerLength = 4, int footerLength = 0) | |
34 | + { | |
35 | + HeaderLength = headerLength; | |
36 | + FooterLength = footerLength; | |
37 | + } | |
27 | 38 | |
28 | 39 | /// <summary> |
29 | 40 | /// 指定されたヘッダからペイロード長を取得します。 |
@@ -34,10 +45,11 @@ namespace SocketNet | ||
34 | 45 | { |
35 | 46 | int payloadLength = 0; |
36 | 47 | |
37 | - if (header.Length < HeaderLength) | |
38 | - { | |
39 | - return 0; | |
40 | - } | |
48 | + // header は必ず HeaderLength の長さで送られてくるためチェックする必要はない。 | |
49 | + // if (header.Length < HeaderLength) | |
50 | + // { | |
51 | + // return 0; | |
52 | + // } | |
41 | 53 | for (int i = 0; i < HeaderLength; i++) |
42 | 54 | { |
43 | 55 | payloadLength = (payloadLength << 8) | header[i]; |