Skip to content

Commit 9c63f11

Browse files
committed
网络层更新
1 parent 4bcb1e4 commit 9c63f11

File tree

4 files changed

+281
-255
lines changed

4 files changed

+281
-255
lines changed

Bundle.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void send(NetworkInterface networkInterface)
8383
for(int i=0; i<streamList.Count; i++)
8484
{
8585
stream = streamList[i];
86-
networkInterface.send(stream.getbuffer());
86+
networkInterface.send(stream);
8787
}
8888
}
8989
else

NetworkInterface.cs

Lines changed: 124 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
11
namespace 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

Comments
 (0)