自己封装了一个.Net的异步socket
在Server端写了一个对象池来提供服务.
然后为在网络中传递的数据写了一个Pack和Unpack方法.
打算放到Socket类中
基本的思路是:在Send以前调用PackMessage
在Message(以Byte数组的方式存在)前面加上一些附加信息.
例如发送的消息字节数.
然后在Receive端接收打了包的字节流,解析出Pack在前面的大小信息.
再根据这个大小判断是否接收到完整的数据.
还可以写得更复杂,加上一些别的东西.
但暂时就是这样,也觉得代码写得不好...最近好象没有什么状态.
测试代码如下:
1#include "stdafx.h"
2
3#using <mscorlib.dll>
4
5using namespace System;
6const int ADDITIONINFO=10;
7
8Byte 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
26Byte 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
39int _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#using <mscorlib.dll>
4
5using namespace System;
6const int ADDITIONINFO=10;
7
8Byte 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
26Byte 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
39int _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
这个是用C++Managed写的.