1 #Region "Microsoft.VisualBasic::7a8bf67890c25f2a47b3165bb957f4bf, Microsoft.VisualBasic.Core\ApplicationServices\Tools\Network\Protocol\Abstract.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Interface ISerializable
35     
36     '         Function: Serialize
37     
38     '     Class RawStream
39     
40     '         Properties: _rawStreamType
41     
42     '         Constructor: (+2 OverloadsSub New
43     '         FunctionGetRawStream
44     '         Operators: <=, >=
45     
46     
47     ' /********************************************************************************/
48
49 #End Region
50
51 Imports Microsoft.VisualBasic.Serialization
52
53 Namespace Net.Protocols
54
55     ''' <summary>
56     ''' 支持序列化的对象,则这个对象可以被应用于<see cref="RequestStream"/>数据载体的网络传输操作过程
57     ''' </summary>
58     Public Interface ISerializable
59         ''' <summary>
60         ''' Transform this .NET object into a raw stream object for the network data transfer. 
61         ''' </summary>
62         ''' <returns></returns>
63         Function Serialize() As Byte()
64     End Interface
65
66     ''' <summary>
67     ''' 原始串流的基本模型,这个流对象应该具备有两个基本的方法:
68     ''' 1. 从原始的字节流之中反序列化构造出自身的构造函数
69     ''' 2. 将自身序列化为字节流的<see cref="ISerializable.Serialize()"/>序列化方法
70     ''' </summary>
71     <Serializable> Public MustInherit Class RawStream : Implements ISerializable
72
73         ''' <summary>
74         ''' You should overrides this constructor to generate a stream object.(必须要有一个这个构造函数来执行反序列化)
75         ''' </summary>
76         ''' <param name="rawStream"></param>
77         Sub New(rawStream As Byte())
78
79         End Sub
80
81         Public Sub New()
82         End Sub
83
84         ''' <summary>
85         ''' <see cref="ISerializable.Serialize"/>序列化方法
86         ''' </summary>
87         ''' <returns></returns>
88         Public MustOverride Function Serialize() As Byte() Implements ISerializable.Serialize
89
90         ''' <summary>
91         ''' 按照类型的定义进行反序列化操作
92         ''' </summary>
93         ''' <typeparam name="TRawStream"></typeparam>
94         ''' <param name="rawStream"></param>
95         ''' <returns></returns>
96         Public Shared Function GetRawStream(Of TRawStream As RawStream)(rawStream As Byte()) As TRawStream
97             Dim value As Object = Activator.CreateInstance(GetType(TRawStream), {rawStream})
98             Return DirectCast(value, TRawStream)
99         End Function
100
101         Protected Shared ReadOnly Property _rawStreamType As Type = GetType(Byte())
102
103         Public Const INT64 As Integer = 8
104         ''' <summary>
105         ''' Single/Integer
106         ''' </summary>
107         Public Const INT32 As Integer = 4
108         ''' <summary>
109         ''' System.Double
110         ''' </summary>
111         Public Const DblFloat As Integer = 8
112         Public Const ShortInt As Integer = 2
113         Public Const SingleFloat As Integer = 4
114         Public Const DecimalInt As Integer = 12
115
116         ''' <summary>
117         ''' 
118         ''' </summary>
119         ''' <param name="addr">IPEndPoint string value likes 127.0.0.1:8080</param>
120         ''' <param name="raw"></param>
121         ''' <returns></returns>
122         ''' <![CDATA[
123         '''
124         ''' Dim rep As RequestStream =
125         '''    "127.0.0.1:80" <= New RequestStream With {
126         '''           ...
127         '''     }
128         ''' ]]>
129         Public Shared Operator <=(addr As String, raw As RawStream) As RequestStream
130             Dim ep As New IPEndPoint(addr)
131             Dim invoke As New AsynInvoke(ep)
132             Dim rep As RequestStream = New RequestStream(invoke.SendMessage(raw.Serialize))
133             Return rep
134         End Operator
135
136         Public Shared Operator >=(addr As String, raw As RawStream) As RequestStream
137             Throw New NotSupportedException
138         End Operator
139     End Class
140 End Namespace