using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CommonNetwork_ICE.Util;
using CommonLang.Protocol;
using CommonNetwork_ICE.Common;
using Slice;
using CommonNetwork_ICE.Client;
using CommonNetwork.Net;
using System.Collections;
using CommonLang.IO;
using CommonLang.Log;
using System.Net;
namespace CommonNetwork_ICE.Session
{
///
/// 网络会话对象实现,通过会话对象可以发送消息,存储会话级变量
///
public abstract class IceClientNetSession : INetSession
{
protected string mHost = "127.0.0.1";
protected int mPort = 80;
protected IceClientConnector iceConnector = null;
protected INetPackageCodec mCodec;
protected INetSessionListener mListener;
private IExternalizableFactory sl;
protected IPEndPoint mRemoteAddress;
private Hashtable mAttributes = new Hashtable();
public long mSendBytes = 0;
public long mRecvBytes = 0;
public long mSendPacks = 0;
public long mRecvPacks = 0;
private object closeLock = new object();
public IceClientNetSession()
{
}
public void SetBattleMessageFactory(IExternalizableFactory externalizableFactory)
{
sl = externalizableFactory;
}
public long TotalSentBytes { get { return mSendBytes; } }
public long TotalRecvBytes { get { return mRecvBytes; } }
public long TotalSentPackages { get { return mSendPacks; } }
public long TotalRecvPackages { get { return mRecvPacks; } }
public string URL { get { return (mHost + ":" + mPort); } }
public string Host { get { return mHost; } }
public int Port { get { return mPort; } }
public IPEndPoint RemoteAddress { get { return mRemoteAddress; } }
///
/// 判断当前网络是否已经连接
///
///
public bool IsConnected
{
get {
if(iceConnector == null)
{
return false;
}
return iceConnector.IsConnected;
}
}
public abstract bool Open(string url, INetPackageCodec codec, INetSessionListener listener);
public bool Close()
{
bool ret = false;
lock (closeLock)
{
if(iceConnector == null)
{
return true;
}
}
iceConnector.Close();
iceConnector = null;
return ret;
}
public void Dispose()
{
Close();
}
//-------------------------------------------------------------------------------------
///
/// 发送一个消息,该方法将立即返回。
///
///
public void Send(Object data)
{
if (data == null)
{
return;
}
if (IsConnected)
{
iceConnector.SendMessage(data as IMessage);
}
}
public void SendResponse(IMessage rsponse, int requestMessageID)
{
rsponse.MessageID = requestMessageID;
Send(rsponse);
}
//-------------------------------------------------------------------------------------
public void PutAttribute(Object key, Object value)
{
mAttributes[key] = value;
}
public Object GetAttribute(Object key)
{
return mAttributes[key];
}
override public string ToString()
{
return "Session[" + URL + "](" + GetHashCode() + ")";
}
//-------------------------------------------------------------------------------------
public void onClose()
{
if (mListener != null)
{
mListener.sessionClosed(this);
}
if (mOnSessionClosed != null)
{
mOnSessionClosed.Invoke(this);
}
}
public void onOpen()
{
mListener.sessionOpened(this);
if (mOnSessionOpened != null)
{
mOnSessionOpened.Invoke(this);
}
}
public void onReceive(Object message, int recvBytes)
{
mRecvPacks++;
mRecvBytes += recvBytes;
mListener.messageReceived(this, message);
if (mOnMessageReceived != null)
{
mOnMessageReceived.Invoke(this, message);
}
}
public void onSent(Object message, int sentBytes)
{
mSendPacks++;
mSendBytes += sentBytes;
mListener.messageSent(this, message);
if (mOnMessageSent != null)
{
mOnMessageSent.Invoke(this, message);
}
}
public void onException(Exception err)
{
mListener.onError(this, err);
if (mOnError != null)
{
mOnError.Invoke(this, err);
}
}
//-------------------------------------------------------------------------------------
private OnSessionOpenedHandler mOnSessionOpened;
private OnSessionClosedHandler mOnSessionClosed;
private OnMessageReceivedHandler mOnMessageReceived;
private OnMessageSentHandler mOnMessageSent;
private OnErrorHandler mOnError;
private OnUpdateHandler mOnUpdate;
public event OnSessionOpenedHandler OnSessionOpened { add { mOnSessionOpened += value; } remove { mOnSessionOpened -= value; } }
public event OnSessionClosedHandler OnSessionClosed { add { mOnSessionClosed += value; } remove { mOnSessionClosed -= value; } }
public event OnMessageReceivedHandler OnMessageReceived { add { mOnMessageReceived += value; } remove { mOnMessageReceived -= value; } }
public event OnMessageSentHandler OnMessageSent { add { mOnMessageSent += value; } remove { mOnMessageSent -= value; } }
public event OnErrorHandler OnError { add { mOnError += value; } remove { mOnError -= value; } }
public event OnUpdateHandler OnUpdate { add { mOnUpdate += value; } remove { mOnUpdate -= value; } }
///
/// Ice传输解码器
///
internal class IceClientMessageCodecImpl : IceMessageCodec
{
public static int DEFAULT_BUFFER_SIZE = 1024;
private INetPackageCodec codec = null;
private IceClientNetSession client;
public IceClientMessageCodecImpl(INetPackageCodec codec, IceClientNetSession client)
{
this.codec = codec;
this.client = client;
}
public bool doDecode(TransMessage transMessage, out CommonLang.Protocol.IMessage message)
{
int length = transMessage.length;
using (MemoryStream ms = new MemoryStream(transMessage.data))
{
object msg;
if (codec.doDecode(client, ms, out msg))
{
message = msg as IMessage;
return true;
}
}
message = null;
return false;
}
public void doEncode(CommonLang.Protocol.IMessage message, out TransMessage transMessage)
{
transMessage = new TransMessage();
IMessage nm = (IMessage)message;
using (MemoryStream ms = new MemoryStream(DEFAULT_BUFFER_SIZE))
{
if (codec.doEncode(client, ms, message))
{
int length = (int)ms.Position;
transMessage.data = new byte[length];
Array.Copy(ms.GetBuffer(), transMessage.data, length);
transMessage.length = length;
transMessage.type = 1;
}
}
}
}
}
}