诛仙管理员连接Gdeliveryd服务器发送邮件的Java实现

2016-05-08· 6616 次浏览
连接Gdeliveryd服务器,可以通过Socket建立邮件信息,向角色发送带有物品装备的邮件,Socket是一个和语言无关的协议,大多数语言比如C/C++/PHP/VB等都支持Socket,这里使用Java实现,适用于诛仙2和诛仙3 诛仙给角色发送物品装备邮件的代码,通过Socket连接Gdeliveryd服务器,建立邮件信息: ``` package com.zhenzhigu.gm.zx;   import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException;   public class MailUtils {       /**      * 把0到255的整数转为十六进制      * 如果是1位则补到2位,如e补位之后是0e      */     private static String intToHex2(int n){         String hex = Integer.toHexString(n);         if(hex.length()==1){             hex = "0"+hex;         }         return hex;     }     /**      * 把0-65535的整数转为十六进制,补位到4位,例如e补位之后是0e:00      */     private static String intToHex4(int n){         String hex = Integer.toHexString(n);         if(hex.length()==1){             hex = "0"+hex+":00";         }else if(hex.length()==2){             hex += ":00";         }else if(hex.length()==3){             String a = hex.substring(0, 1);             String b = hex.substring(1,3);             hex = "0"+a+":"+b;         }else if(hex.length()==4){             String a = hex.substring(0, 2);             String b = hex.substring(2,4);             hex = a+":"+b;         }else{             System.out.println("err:"+hex+":"+n);         }         return hex;     }           /**      * 标题与内容转为十六进制      * @param str      * @return      */     private static String stringToHex(String str){         StringBuffer sb = new StringBuffer();         char[] crr = str.toCharArray();         for(int i=0;i<crr.length;i++){             int n = crr[i];             String hex = Integer.toHexString(n);             if(hex.length()==2){                 hex += ":00";             }else{                 String a = hex.substring(0, 2);                 String b = hex.substring(2,4);                 hex = b+":"+a;             }             sb.append(hex);             if(i<crr.length-1){                 sb.append(":");             }         }         return sb.toString();     }           private static String getHex(int receiver,int item,int number,String title,String text,int protect){         String pst = "00:00";         switch (protect) {         case 0:pst="00:00";break;//[无保护类型=00:00]         case 1:pst="00:40";break;//[装备后绑定=00:40]         case 2:pst="00:93";break;//[已绑定状态=00:93]         case 3:pst="02:53";break;//[下线后消失=02:53]         default:break;         }         String str =                  "90:76:xx:80:00:00:06:00:00:04:00:03:00:00:"                 + intToHex4(receiver)                                          //收件人                 + ":" + intToHex2(title.toCharArray().length*2)                  //标题长度                 + ":" + stringToHex(title)                                       //标题正文                 + ":" + intToHex2(text.toCharArray().length*2)                   //内容长度                 + ":" + stringToHex(text)                                        //内容正文                 + ":00:00:"                 + intToHex4(item)                                                 //物品ID                 + ":00:00:00:00:00:00:"                 + intToHex4(number)                 + ":00:00:"                 + intToHex4(number)                 + ":00:00:00:"                 + pst                   + ":00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00";           str=str.replaceAll("xx", intToHex2(((str.length()+1)/3)-3));                   return str;           }           /**      * 发送邮件      * @param receiver  收件人ID      * @param item       物品ID      * @param number 物品数量      * @param title      邮件标题      * @param text       邮件内容(不要超过100字)      * @param protect    保护类型:[0=无][1=装备后绑定][2=已绑定][3=下线后消失]      * @throws UnknownHostException      * @throws IOException      */     public static void send(int receiver,int item,int number,String title,String text,int protect) throws UnknownHostException, IOException{                   String hex = getHex(receiver, item, number, title, text,protect);         System.out.println(hex);         //连接Gdeliveryd服务器,建立邮件信息         Socket sc = new Socket("192.168.200.100", 29100);         OutputStream out = sc.getOutputStream();         byte[] bf = new byte[1024];         String[] srr = hex.split(":");         for(int i=0;i<srr.length;i++){             bf[i] = (byte) Integer.parseInt(srr[i], 16);           }                   out.write(bf, 0, srr.length);         out.close();     }           public static void main(String[] args) throws UnknownHostException, IOException {                   /**          * 强化真仙散仙用补天符:4006          * 强化白装用炼器符:685          * 强化神魔装用龙魂符:21200          * 强化封神装用天机符: 56030          *           * 仙豆:18794                                     * 龙牙草:20481(修炼宠物斗气=2仙豆)          * 天龙草:20484(修炼宠物斗气=50龙牙草)          * 九转阴阳幡:19183 (更改宠物前世)                        * 易筋断骨丹:16320 (更改宠物限界)          */                   int receiver = 1072; //角色ID         int item = 18794;        //物品ID         int number = 99;     //物品数量         String title = "鸿蒙快递,请查收";         String text = "这是您在鸿蒙宝库购买的商品,请查收!";                   MailUtils.send(receiver,item,number,title,text,0);         //MailUtils.send(1024, 8079, 9999, "恭喜您获得奖品", "这是GM发送给您的奖品,请注意查收附件!", 3);     }     } ```