using CommonLang.Net;
using CommonLang.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;

namespace CommonNetwork.Net
{

    public delegate void OnSessionOpenedHandler(INetSession session);
    public delegate void OnSessionClosedHandler(INetSession session);
    public delegate void OnMessageReceivedHandler(INetSession session, Object data);
    public delegate void OnMessageSentHandler(INetSession session, Object data);
    public delegate void OnErrorHandler(INetSession session, Exception err);
    public delegate void OnUpdateHandler(INetSession session);

    public interface INetSession : AbstractSession, IDisposable
    {
        string URL { get; }
        IPEndPoint RemoteAddress { get; }

        bool IsConnected { get; }

        long TotalSentBytes { get; }
        long TotalRecvBytes { get; }
        long TotalSentPackages { get; }
        long TotalRecvPackages { get; }

        bool Open(string url, INetPackageCodec codec, INetSessionListener listener);

        bool Close();

        /// <summary>
        /// 发送一个消息,该方法将立即返回。
        /// </summary>
        /// <param name="data"></param>
        void Send(Object data);

        void SendResponse(IMessage rsponse, int requestMessageID);

        event OnSessionOpenedHandler OnSessionOpened;
        event OnSessionClosedHandler OnSessionClosed;
        event OnMessageReceivedHandler OnMessageReceived;
        event OnMessageSentHandler OnMessageSent;
        event OnErrorHandler OnError;

    }
}