在开发一个Server端需要处理Clinet端发送过来的报文。由于走的是UDP协议,所以为了防止丢包Clinet端会将同样个报文连续发送3份给Server端,但是作为Server端来说当接受到一份报文后应该将其他的两份报文丢弃。防止跑重复的业务。
同样的报文具有同样的SessionId可以用来识别。难点1.SessionId在极短时间内不会重复,但时间久了依然会重复.
难点2.Clinet端什么时候发送报文过来是不可预知的.
难点3.具有同时并发很多报文的可能性.我本来打算使用MAP来实现,接到一个报文后将报文的SessionId放入KEY中,而值放入Value中,如果收到新的报文则先拿到SessionID去和KEY中以存在的SessionID比较,但是这样做不行。请教各位前辈有什么合理的好的解决办法非常感谢.

解决方案 »

  1.   

    SessionId在极短时间内不会重复,但时间久了依然会重复. 
    这是LZ自已提出的问题,可以不用SessionId作为KEY
    LZ的思路可以实现,但KEY的选择上可以换一换,用一个更可靠的来作KEY
    比如说机能ID+XXX或者用发送时间+XXX 三个包统一用第一个包的发送时间,或其它的什么方式,这个不难解决
      

  2.   

    MD5, SHA可以很好的处理这一问,使用
    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(bytes);
    md.digest();
      

  3.   

    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;public class Encoder {
    private char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
    '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    private MessageDigest md; public Encoder(String algorithm) {
    try {
    md = MessageDigest.getInstance(algorithm);
    } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
    }
    } public String encode(String str) {
    md.update(str.getBytes());
    return bytesToHexString(md.digest());
    } private String bytesToHexString(byte[] bytes) {
    StringBuffer sb = new StringBuffer(bytes.length * 2);
    for (int i = 0; i < bytes.length; ++i) {
    appendHexPair(bytes[i], sb);
    } return sb.toString();
    } private void appendHexPair(byte b, StringBuffer sb) {
    char c0 = hexDigits[(b & 0xF0) >> 4];
    char c1 = hexDigits[b & 0x0F];
    sb.append(c0);
    sb.append(c1);
    } public static void main(String[] args) {
    Encoder t1 = new Encoder("MD5");
    System.out.println(t1.encode("").length()); // 32
    System.out.println(t1.encode("Biao"));
    System.out.println(t1.encode("Huang"));
    System.out.println(t1.encode("Biao"));
    System.out.println(t1.encode("Wang bin"));

    Encoder t2 = new Encoder("SHA");
    System.out.println(t2.encode("Biao").length()); // 40
    System.out.println(t2.encode("Biao"));
    System.out.println(t2.encode("Huang"));
    System.out.println(t2.encode("Biao"));
    System.out.println(t2.encode("Wang bin"));
    }
    }
      

  4.   


    显然,楼主对网络通信协议不熟悉。
    这个问题其实更多的是一个C/S双方的应用层协议是如何设计的?楼主的这个问题其实是一个具体的实现问题。若:协议本身就有缺陷,则怎么实现都已是不行了。
    其实从用层协议角度看,楼主的现在的协议,问题是严重的,不仅仅是重复ID这个问题而已。
    楼主有空看一下TFTP协议吧,这是前辈们早已解决的问题,略为修改,应该能满足楼主的要求