⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slidewindow.java

📁 短信平台CMPP30 的JAVA程序,(含SQL数据库)
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// Decompiled by Jad v1.5.7g. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi 
// Source File Name:   SlideWindow.java

package com.SGIP12.sgiputil;

import com.SGIP12.sgipdata.*;
import com.log.CTime;
import java.io.*;
import java.util.Vector;
import javax.swing.JTextArea;

// Referenced classes of package com.SGIP12.sgiputil:
//            SlideWindowData, SGIPPacket, SGIPConfig, SGIPLog, 
//            SGIPQueue

public class SlideWindow
{

    private long SPNum;
    public static final int SUCCESS = 0;
    private int freePosBegin;
    private int freePosEnd;
    private int haveSendPosBegin;
    private int haveSendPosEnd;
    private String logFile;
    private String loginName;
    private String loginPwd;
    private int maxReSendTime;
    private int maxSendCounts;
    private int notSendPosBegin;
    private int notSendPosEnd;
    private JTextArea packetArea;
    private SGIPQueue recvQueue;
    private SGIPQueue sendQueue;
    private int size;
    private Vector slideWindow;
    private JTextArea stateArea;

    public SlideWindow(SGIPConfig con, SGIPQueue sendQ, SGIPQueue recvQ)
    {
        size = 100;
        stateArea = null;
        packetArea = null;
        slideWindow = new Vector();
        size = con.getSlideWindowSize() + 1;
        freePosBegin = 0;
        freePosEnd = 0;
        SPNum = con.getNodeID();
        loginName = con.getGateWayUser();
        loginPwd = con.getGateWayPwd();
        maxSendCounts = con.getPacketsMaxSendCounts();
        maxReSendTime = con.getPacketsReSendTime();
        haveSendPosBegin = haveSendPosEnd = 0;
        notSendPosBegin = notSendPosEnd = 0;
        for(int i = 0; i < size; i++)
            slideWindow.addElement(null);

        sendQueue = sendQ;
        recvQueue = recvQ;
        logFile = "Send";
    }

    public void SetTextArea(JTextArea sa, JTextArea pa)
    {
        stateArea = sa;
        packetArea = pa;
    }

    public synchronized long deSlideWindow(long seq_1, int seq_2, int seq_3)
    {
        if(haveSendPosEnd - haveSendPosBegin == 0)
        {
            SGIPLog.WriteLog(-1, "SLIDEWINDOW WARNING:滑动窗口中没有已经发送的包!", logFile);
            return -1L;
        }
        int startPos = ((haveSendPosEnd - 1) + size) % size;
        int endPos = ((haveSendPosBegin - 1) + size) % size;
        int i = startPos;
        long localId = -1L;
        for(; i != endPos; i = ((i - 1) + size) % size)
        {
            long iival_1 = ((SlideWindowData)slideWindow.elementAt(i)).getPacket().sequence_1;
            int iival_2 = ((SlideWindowData)slideWindow.elementAt(i)).getPacket().sequence_2;
            int iival_3 = ((SlideWindowData)slideWindow.elementAt(i)).getPacket().sequence_3;
            if(iival_1 != seq_1 || iival_2 != seq_2 || iival_3 != seq_3)
                continue;
            localId = ((SlideWindowData)slideWindow.elementAt(i)).getPacket().localId;
            SlideWindowData swd = (SlideWindowData)slideWindow.elementAt(startPos);
            slideWindow.setElementAt(swd, i);
            slideWindow.setElementAt(null, startPos);
            break;
        }

        if(i != endPos)
        {
            haveSendPosEnd = ((haveSendPosEnd + size) - 1) % size;
            freePosBegin = haveSendPosEnd;
            return localId;
        } else
        {
            SGIPLog.WriteLog(-1, "SLIDEWINDOW WARNING: 回复包的序列号(seqId)与已发送的所有包的序列号均不同!可能此包已被抛弃。", logFile);
            System.out.println("SLIDEWINDOW WARNING: 回复包的序列号(seqId)与已发送的所有包的序列号均不同!");
            localId = -1L;
            return localId;
        }
    }

    public synchronized void enSlideWindow(SlideWindowData slideWindowData)
    {
        if((((freePosEnd - freePosBegin) + size) - 1) % size == 0)
        {
            SGIPLog.WriteLog(-1, "SLIDEWINDOW WARNING:滑动窗口中已满,没有位置给新包!", logFile);
            return;
        } else
        {
            slideWindow.setElementAt(slideWindowData, ((freePosEnd - 1) + size) % size);
            notSendPosBegin = ((notSendPosBegin + size) - 1) % size;
            freePosEnd = ((freePosEnd + size) - 1) % size;
            return;
        }
    }

    public int getFreeWindowSize()
    {
        return (((freePosEnd - freePosBegin) + size) - 1) % size;
    }

    public Vector getPacketsHaveSend()
    {
        Vector v = new Vector();
        for(int i = haveSendPosBegin; i < haveSendPosEnd; i++)
        {
            SlideWindowData swd = (SlideWindowData)slideWindow.elementAt(i);
            v.add(swd.getPacket());
        }

        return v;
    }

    public int getPacketsNumToSend()
    {
        return ((notSendPosEnd - notSendPosBegin) + size) % size;
    }

    public int getPacketsNumWaitForResp()
    {
        return ((haveSendPosEnd - haveSendPosBegin) + size) % size;
    }

    public Vector getPacketsToSend()
    {
        Vector v = new Vector();
        for(int i = notSendPosBegin; i < notSendPosEnd; i++)
        {
            SlideWindowData swd = (SlideWindowData)slideWindow.elementAt(i);
            v.add(swd.getPacket());
        }

        return v;
    }

    public static String getSendPacketInfo(SGIPPacket pkt)
    {
        if(pkt == null)
            return "包体为空";
        String info;
        switch(pkt.CommandId)
        {
        case 1: // '\001'
            info = "BIND 连接包:";
            break;

        case -2147483647: 
            info = "BIND_RESP 连接应答包:";
            break;

        case 2: // '\002'
            info = "UNBIND 链路断开包:";
            break;

        case -2147483646: 
            info = "UNBIND_RESP 链路断开回复包:";
            break;

        case 3: // '\003'
            info = "SUBMIT 提交短信包:";
            break;

        case -2147483644: 
            info = "DELIVER_RESP 接收短信回复包:";
            break;

        case 4096: 
            info = "TRACE 查询短信包:";
            break;

        case -2147483643: 
            info = "REPORT_RESP Report命令回复包:";
            break;

        case -2147483631: 
            info = "USERRPT_RESP Userrpt命令回复包:";
            break;

        default:
            info = "错误的CommandId号: " + pkt.CommandId;
            break;
        }
        return info;
    }

    public boolean havePacketToSend()
    {
        return notSendPosEnd != notSendPosBegin;
    }

    public boolean haveSpaceForNewPacket()
    {
        return (((freePosEnd - freePosBegin) + size) - 1) % size > 0;
    }

    public synchronized int increWaitedTime(int increWaitedTime)
    {
        if(((haveSendPosEnd - haveSendPosBegin) + size) % size == 0)
            return 0;
        int startPos = ((haveSendPosEnd - 1) + size) % size;
        int endPos = ((haveSendPosBegin - 1) + size) % size;
        for(int i = startPos; i != endPos; i = ((i - 1) + size) % size)
        {
            SlideWindowData swd = (SlideWindowData)slideWindow.elementAt(i);
            if(swd == null)
            {
                SGIPLog.WriteLog(-2, "在试图为正在等待回应的包增加等待时间时,碰到了空包体!!", logFile);
            } else
            {
                swd.increWaitedTime(increWaitedTime);
                if(swd.getHaveWaitedTime() >= maxReSendTime)
                {
                    SGIPLog.WriteLog(-1, "超时重发 -- " + getSendPacketInfo(swd.getPacket()) + " 在规定的最大时间(" + maxReSendTime + "ms)内未能接收到回应包,将重新发送!", logFile);
                    System.out.println("超时重发 -- " + getSendPacketInfo(swd.getPacket()) + " 在规定的最大时间(" + maxReSendTime + "ms)内未能接收到回应包,将重新发送!");
                    deSlideWindow(swd.getPacket().sequence_1, swd.getPacket().sequence_2, swd.getPacket().sequence_3);
                    if(swd.getHaveSendCounts() >= maxSendCounts)
                    {
                        if(swd.getPacket().CommandId == 3)
                        {
                            SGIPPacket packet = new SGIPPacket();
                            packet.CommandId = 100;
                            packet.localId = swd.getPacket().localId;
                            if(packet.localId == -1L)
                            {
                                SGIPLog.WriteLog(-2, "系统提供的短信包没有提供系统内部消息流水号(localId)!", logFile);
                                System.out.println("系统提供的短信包没有提供系统内部消息流水号(localId)!");
                            }
                            SubmitResult submitResult = new SubmitResult();
                            submitResult.localId = packet.localId;
                            SubmitResult _tmp = submitResult;
                            submitResult.result = 2;
                            packet.submitResult = submitResult;
                            recvQueue.EnQueue(packet);
                        }
                        SGIPLog.WriteLog(-2, "SEND FAILURE: " + getSendPacketInfo(swd.getPacket()) + " 超时重发次数已经达到最大次数,且在规定最大时间内仍未能接收到回应包,此包将被抛弃!!!", logFile);
                        System.out.println("SEND FAILURE: " + getSendPacketInfo(swd.getPacket()) + " 超时重发次数已经达到最大次数,且在规定最大时间内仍未能接收到回应包,此包将被抛弃!!!");
                    } else
                    {
                        swd.increSendCountsByOne();
                        enSlideWindow(swd);
                    }
                }
            }
        }

        return 0;
    }

    public synchronized int sendPacket(InputStream input, OutputStream out)
        throws Exception
    {
        if(notSendPosEnd - notSendPosBegin == 0)
        {
            SGIPLog.WriteLog(-1, "SLIDEWINDOW WARNING:滑动窗口中没有需要发送的包!", logFile);
            return 0;
        }
        SlideWindowData slideWindowData = (SlideWindowData)slideWindow.elementAt(((notSendPosEnd - 1) + size) % size);
        slideWindowData.setWaitedTimeZero();
        SGIP_Command sgip = new SGIP_Command();
        try
        {
            switch(slideWindowData.getPacket().CommandId)
            {
            case 1: // '\001'
                System.out.println("--Bind--");
                Bind command = slideWindowData.getPacket().bindPacket;
                int err = command.write(out);
                if(packetArea != null)
                {
                    packetArea.append(CTime.getStringDate() + "--SGIP12--Bind: (SP->SMG)\n");
                    packetArea.append("TotalLength: " + command.getTotalLength() + "\n");
                    packetArea.append("CommandID: " + command.getCommandID() + "\n");
                    packetArea.append("SequenceID_1: " + command.getSeqno_1() + "\n");
                    packetArea.append("SequenceID_2: " + command.getSeqno_2() + "\n");
                    packetArea.append("SequenceID_3: " + command.getSeqno_3() + "\n");
                    packetArea.append("LoginType: " + command.GetLoginType() + "\n");
                    packetArea.append("LoginName: " + command.GetLoginName() + "\n");
                    packetArea.append("LoginPassword: " + command.GetLoginPassword() + "\n\n");
                }
                if(err == 0)
                {
                    slideWindowData.increSendCountsByOne();
                    slideWindowData.getPacket().sequence_1 = command.getSeqno_1();
                    slideWindowData.getPacket().sequence_2 = command.getSeqno_2();
                    slideWindowData.getPacket().sequence_3 = command.getSeqno_3();
                    haveSendPosBegin = ((haveSendPosBegin + size) - 1) % size;
                    notSendPosEnd = haveSendPosBegin;
                } else
                {
                    SGIPLog.WriteLog(-2, err + " 发送Bind出错", logFile);
                    System.out.println("err: " + err + " 发送Bind出错");
                    throw new Exception("err: " + err + " 发送Bind出错");
                }
                SGIP_Command tmp = sgip.read(input);
                if(sgip.getCommandID() == 0x80000001)
                {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -