11namespace KBEngine
22{
3- using UnityEngine ;
4- using System ;
5- using System . Net . Sockets ;
6- using System . Net ;
7- using System . Collections ;
3+ using UnityEngine ;
4+ using System ;
5+ using System . Net . Sockets ;
6+ using System . Net ;
7+ using System . Collections ;
88 using System . Collections . Generic ;
99 using System . Text ;
1010 using System . Text . RegularExpressions ;
1111 using System . Threading ;
12-
12+ using System . Runtime . Remoting . Messaging ;
13+
1314 using MessageID = System . UInt16 ;
1415 using MessageLength = System . UInt16 ;
15-
16- /*
17- 网络模块
18- 处理连接、收发数据
19- */
20- public class NetworkInterface
21- {
22- public const int TCP_PACKET_MAX = 1460 ;
23- public delegate void ConnectCallback ( string ip , int port , bool success , object userData ) ;
24-
25- protected Socket _socket = null ;
16+
17+ /// <summary>
18+ /// 网络模块
19+ /// 处理连接、收发数据
20+ /// </summary>
21+ public class NetworkInterface
22+ {
23+ public delegate void AsyncConnectMethod ( ConnectState state ) ;
24+ public const int TCP_PACKET_MAX = 1460 ;
25+ public delegate void ConnectCallback ( string ip , int port , bool success , object userData ) ;
26+
27+ protected Socket _socket = null ;
2628 PacketReceiver _packetReceiver = null ;
2729 PacketSender _packetSender = null ;
28-
30+
2931 public class ConnectState
3032 {
3133 // for connect
@@ -38,10 +40,21 @@ public class ConnectState
3840 public string error = "" ;
3941 }
4042
41- public NetworkInterface ( )
42- {
43- reset ( ) ;
44- }
43+ public NetworkInterface ( )
44+ {
45+ reset ( ) ;
46+ }
47+
48+ ~ NetworkInterface ( )
49+ {
50+ Dbg . DEBUG_MSG ( "NetworkInterface::~NetworkInterface(), destructed!!!" ) ;
51+ reset ( ) ;
52+ }
53+
54+ public virtual Socket sock ( )
55+ {
56+ return _socket ;
57+ }
4558
4659 public void reset ( )
4760 {
@@ -55,27 +68,35 @@ public void reset()
5568 _packetSender = null ;
5669 }
5770
58- public Socket sock ( )
59- {
60- return _socket ;
61- }
62-
63- public PacketReceiver packetReceiver ( )
71+
72+ public void close ( )
73+ {
74+ if ( _socket != null )
75+ {
76+ _socket . Close ( 0 ) ;
77+ _socket = null ;
78+ Event . fireAll ( "onDisableConnect" , new object [ ] { } ) ;
79+ }
80+
81+ _socket = null ;
82+ }
83+
84+ public virtual PacketReceiver packetReceiver ( )
6485 {
6586 return _packetReceiver ;
6687 }
6788
68- public bool valid ( )
89+ public virtual bool valid ( )
6990 {
7091 return ( ( _socket != null ) && ( _socket . Connected == true ) ) ;
7192 }
7293
7394 public void _onConnectStatus ( ConnectState state )
7495 {
7596 KBEngine . Event . deregisterIn ( this ) ;
76-
97+
7798 bool success = ( state . error == "" && valid ( ) ) ;
78- if ( success )
99+ if ( success )
79100 {
80101 Dbg . DEBUG_MSG ( string . Format ( "NetworkInterface::_onConnectStatus(), connect to {0} is success!" , state . socket . RemoteEndPoint . ToString ( ) ) ) ;
81102 _packetReceiver = new PacketReceiver ( this ) ;
@@ -85,13 +106,13 @@ public void _onConnectStatus(ConnectState state)
85106 {
86107 Dbg . ERROR_MSG ( string . Format ( "NetworkInterface::_onConnectStatus(), connect is error! ip: {0}:{1}, err: {2}" , state . connectIP , state . connectPort , state . error ) ) ;
87108 }
88-
89- Event . fireOut ( "onConnectStatus" , new object [ ] { success } ) ;
90-
109+
110+ Event . fireAll ( "onConnectStatus" , new object [ ] { success } ) ;
111+
91112 if ( state . connectCB != null )
92113 state . connectCB ( state . connectIP , state . connectPort , success , state . userData ) ;
93114 }
94-
115+
95116 private static void connectCB ( IAsyncResult ar )
96117 {
97118 ConnectState state = null ;
@@ -104,98 +125,103 @@ private static void connectCB(IAsyncResult ar)
104125 // Complete the connection.
105126 state . socket . EndConnect ( ar ) ;
106127
107- Event . fireIn ( "_onConnectStatus" , new object [ ] { state } ) ;
128+ Event . fireIn ( "_onConnectStatus" , new object [ ] { state } ) ;
108129 }
109130 catch ( Exception e )
110131 {
111132 state . error = e . ToString ( ) ;
112- Event . fireIn ( "_onConnectStatus" , new object [ ] { state } ) ;
133+ Event . fireIn ( "_onConnectStatus" , new object [ ] { state } ) ;
113134 }
114135 }
115-
116- public void connectTo ( string ip , int port , ConnectCallback callback , object userData )
136+
137+ /// <summary>
138+ /// 在非主线程执行:连接服务器
139+ /// </summary>
140+ private void _asyncConnect ( ConnectState state )
141+ {
142+ Dbg . DEBUG_MSG ( string . Format ( "NetWorkInterface::_asyncConnect(), will connect to '{0}:{1}' ..." , state . connectIP , state . connectPort ) ) ;
143+ try
144+ {
145+ state . socket . Connect ( state . connectIP , state . connectPort ) ;
146+ }
147+ catch ( Exception e )
148+ {
149+ Dbg . ERROR_MSG ( string . Format ( "NetWorkInterface::_asyncConnect(), connect to '{0}:{1}' fault! error = '{2}'" , state . connectIP , state . connectPort , e ) ) ;
150+ state . error = e . ToString ( ) ;
151+ }
152+ }
153+
154+ /// <summary>
155+ /// 在非主线程执行:连接服务器结果回调
156+ /// </summary>
157+ private void _asyncConnectCB ( IAsyncResult ar )
158+ {
159+ ConnectState state = ( ConnectState ) ar . AsyncState ;
160+ AsyncResult result = ( AsyncResult ) ar ;
161+ AsyncConnectMethod caller = ( AsyncConnectMethod ) result . AsyncDelegate ;
162+
163+ Dbg . DEBUG_MSG ( string . Format ( "NetWorkInterface::_asyncConnectCB(), connect to '{0}:{1}' finish. error = '{2}'" , state . connectIP , state . connectPort , state . error ) ) ;
164+
165+ // Call EndInvoke to retrieve the results.
166+ caller . EndInvoke ( ar ) ;
167+ Event . fireIn ( "_onConnectStatus" , new object [ ] { state } ) ;
168+ }
169+
170+ public void connectTo ( string ip , int port , ConnectCallback callback , object userData )
117171 {
118172 if ( valid ( ) )
119- throw new InvalidOperationException ( "Have already connected!" ) ;
120-
121- if ( ! ( new Regex ( @"((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))" ) ) . IsMatch ( ip ) )
173+ throw new InvalidOperationException ( "Have already connected!" ) ;
174+
175+ if ( ! ( new Regex ( @"((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))" ) ) . IsMatch ( ip ) )
122176 {
123- IPHostEntry ipHost = Dns . GetHostEntry ( ip ) ;
177+ IPHostEntry ipHost = Dns . GetHostEntry ( ip ) ;
124178 ip = ipHost . AddressList [ 0 ] . ToString ( ) ;
125179 }
126180
127181 // Security.PrefetchSocketPolicy(ip, 843);
128- _socket = new Socket ( AddressFamily . InterNetwork , SocketType . Stream , ProtocolType . Tcp ) ;
182+ _socket = new Socket ( AddressFamily . InterNetwork , SocketType . Stream , ProtocolType . Tcp ) ;
129183 _socket . SetSocketOption ( System . Net . Sockets . SocketOptionLevel . Socket , SocketOptionName . ReceiveBuffer , KBEngineApp . app . getInitArgs ( ) . getRecvBufferSize ( ) * 2 ) ;
130184 _socket . SetSocketOption ( System . Net . Sockets . SocketOptionLevel . Socket , SocketOptionName . SendBuffer , KBEngineApp . app . getInitArgs ( ) . getSendBufferSize ( ) * 2 ) ;
131185 _socket . NoDelay = true ;
132-
186+ //_socket.Blocking = false;
187+
133188 ConnectState state = new ConnectState ( ) ;
134189 state . connectIP = ip ;
135190 state . connectPort = port ;
136191 state . connectCB = callback ;
137192 state . userData = userData ;
138193 state . socket = _socket ;
139194 state . networkInterface = this ;
140-
195+
141196 Dbg . DEBUG_MSG ( "connect to " + ip + ":" + port + " ..." ) ;
142-
197+
143198 // 先注册一个事件回调,该事件在当前线程触发
144199 Event . registerIn ( "_onConnectStatus" , this , "_onConnectStatus" ) ;
145-
146- try
147- {
148- _socket . BeginConnect ( new IPEndPoint ( IPAddress . Parse ( ip ) , port ) , new AsyncCallback ( connectCB ) , state ) ;
149- }
150- catch ( Exception e )
151- {
152- state . error = e . ToString ( ) ;
153- Event . fireIn ( "_onConnectStatus" , new object [ ] { state } ) ;
154- }
155- }
156-
157- public void close ( )
158- {
159- if ( _socket != null )
160- {
161- _socket . Close ( 0 ) ;
162- _socket = null ;
163- Event . fireAll ( "onDisableConnect" , new object [ ] { } ) ;
164- }
165200
166- _socket = null ;
167- }
201+ var v = new AsyncConnectMethod ( this . _asyncConnect ) ;
202+ v . BeginInvoke ( state , new AsyncCallback ( this . _asyncConnectCB ) , state ) ;
203+ }
168204
169- public bool send ( byte [ ] datas )
170- {
171- if ( ! valid ( ) )
205+ public bool send ( MemoryStream stream )
206+ {
207+ if ( ! valid ( ) )
172208 {
173- throw new ArgumentException ( "invalid socket!" ) ;
209+ throw new ArgumentException ( "invalid socket!" ) ;
174210 }
175-
176- if ( _packetSender == null )
211+
212+ if ( _packetSender == null )
177213 _packetSender = new PacketSender ( this ) ;
178-
179- try
180- {
181- return _packetSender . send ( datas ) ;
182- }
183- catch ( SocketException err )
184- {
185- Dbg . ERROR_MSG ( string . Format ( "NetworkInterface::send(): socket error(" + err . ErrorCode + ")!" ) ) ;
186- close ( ) ;
187- }
188-
189- return false ;
190- }
191-
192- public void process ( )
193- {
194- if ( ! valid ( ) )
195- return ;
196-
197- if ( _packetReceiver != null )
198- _packetReceiver . process ( ) ;
199- }
214+
215+ return _packetSender . send ( stream ) ;
216+ }
217+
218+ public void process ( )
219+ {
220+ if ( ! valid ( ) )
221+ return ;
222+
223+ if ( _packetReceiver != null )
224+ _packetReceiver . process ( ) ;
225+ }
200226 }
201- }
227+ }
0 commit comments