自己封装了一个.Net的异步socket
在Server端写了一个对象池来提供服务.
然后为在网络中传递的数据写了一个Pack和Unpack方法.
打算放到Socket类中
基本的思路是:在Send以前调用PackMessage
在Message(以Byte数组的方式存在)前面加上一些附加信息.
例如发送的消息字节数.
然后在Receive端接收打了包的字节流,解析出Pack在前面的大小信息.
再根据这个大小判断是否接收到完整的数据.
还可以写得更复杂,加上一些别的东西.
但暂时就是这样,也觉得代码写得不好...最近好象没有什么状态.
测试代码如下:
1
#include "stdafx.h"
2
3
#using <mscorlib.dll>
4
5
using namespace System;
6
const int ADDITIONINFO=10;
7
8
Byte PackMessage(String * message) []
9
{
10
Byte btRealMessage[]=Text::Encoding::ASCII->GetBytes(message);
11
int iSize=btRealMessage->Length;
12
String *strSize=iSize.ToString();
13
Console::WriteLine("RealMessage Length:{0}",strSize);
14
15
Byte btSizeBuffer[]=Text::Encoding::ASCII->GetBytes(strSize);
16
17
Byte btAdditionInfo[]=new Byte[ADDITIONINFO];
18
Array::Copy(btSizeBuffer,0,btAdditionInfo,0,btSizeBuffer->Length);
19
Byte btPackedMessage[]=new Byte[ADDITIONINFO+iSize];
20
Array::Copy(btAdditionInfo,0,btPackedMessage,0,ADDITIONINFO);
21
Array::Copy(btRealMessage,0,btPackedMessage,ADDITIONINFO,iSize);
22
return btPackedMessage;
23
};
24
25
26
Byte UnPackMessage(Byte btPackedMessage[])[]
27
{
28
Byte btSize[]=new Byte[ADDITIONINFO];
29
Array::Copy(btPackedMessage,0,btSize,0,ADDITIONINFO);
30
String *strSize=Text::Encoding::ASCII->GetString(btSize);
31
Console::WriteLine("The message Length is {0}",strSize);
32
33
Byte btRealMessage[]=new Byte[Convert::ToInt32(strSize)];
34
Array::Copy(btPackedMessage,ADDITIONINFO,btRealMessage,0,Convert::ToInt32(strSize));
35
36
return btRealMessage;
37
}
38
39
int _tmain()
40
{
41
// TODO: 请用您自己的代码替换下面的示例代码。
42
Console::WriteLine("Please input Message:");
43
String *buffer=Console::ReadLine();
44
Byte btResult[]=PackMessage(buffer);
45
Console::WriteLine("The message after pack is:");
46
47
System::Collections::IEnumerator* myEnumerator = btResult->GetEnumerator();
48
while ( myEnumerator->MoveNext() )
49
{
50
Console::Write( "-{0}", myEnumerator->Current );
51
}
52
Console::WriteLine();
53
54
Byte realMessage[]=UnPackMessage(btResult);
55
56
Console::WriteLine("The Message after unpack is:");
57
System::Collections::IEnumerator* myEnumerator1 = realMessage->GetEnumerator();
58
while ( myEnumerator1->MoveNext() )
59
{
60
Console::Write( "-{0}", myEnumerator1->Current );
61
}
62
Console::WriteLine();
63
64
65
return 0;
66
}
67

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

这个是用C++Managed写的.