Exemplo n.º 1
0
  public synchronized void sendPacket(Packet pt, String sub_fileID, int i, String filename) {
    long start = System.currentTimeMillis();
    byte[] messages = null;
    String file_name = null;
    if (filename != null && filename != "")
      file_name = filename.substring(filename.lastIndexOf("/") + 1);
    try {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ObjectOutputStream oos = new ObjectOutputStream(baos);
      oos.writeObject(pt);
      messages = baos.toByteArray(); // Packet类中除去data,其它字段的大小是261左右个字节,实验得出的。
      baos.close();
      oos.close();

      packet = new DatagramPacket(messages, messages.length, addr, port);
      socket.send(packet);
      if (pt.islast == true)
        System.out.println("@@@@@@@@ 发送本节点最后一个文件的最后一个包 ---pt.islast:  " + pt.islast);

      System.out.println("发送ING-- " + file_name + "-- " + sub_fileID + "---packet:" + i);
      if (pt.islast == true) // 判断每一个包,如果它的islast标志是true,说明是我们要找的最后一个文件的最后一个包
      {
        System.out.println("@@@@@@@@@ 发完最后一个文件的最后一个包,开始发送 nextIP+end");
        // 知道发送方自己的IP,从savedMap中找到这个IP对应的下一个IP,下一个IP就是下一个要发送的节点
        synchronized (FileSharing.savedMap) {
          String ip = BrowserActivity.getIp();
          Iterator it = FileSharing.savedMap.keySet().iterator();
          String nextip;
          while (it.hasNext()) {
            String key;

            key = (String) it.next();
            if (ip.equals(key)) {
              if (it.hasNext()) // 如果有下一个,发送end+nextip,让下一个IP接着发送
              {
                nextip = (String) it.next();
                System.out.println("@@@@ 发送完最后一个文件后,发送nextIP:  " + nextip);
                String infos = nextip;
                requestSyncFunction rsf = new requestSyncFunction(3, null, infos);
                rsf.start();
                break;
              } else // 如果找不到下一个说明这是savedMap中最后一个发送文件的,发完同步就结束了
              {
                // 将同步标志改回来,删除sync表
                System.out.println("本次同步结束了");
              }
            }
          }
          // 一个节点发完自己该发的最后一个文件后,且找到了下一个,对于这个结点来说,savedmap的使命就完成了,这时应该清空
          // 要不就和下一次同步的内容混了,
          FileSharing.savedMap.clear();
        }
      }

    } catch (SocketException e) {
      return;
    } catch (Exception e) {
      e.printStackTrace();
    }
    FileSharing.total_sending_length += messages.length;
    long end = System.currentTimeMillis();
    FileSharing.total_sending_timer += (end - start);

    String[] bb = sub_fileID.split("-");
    // FileSharing.writeLog("send-one-packet:"+bb[1]+"--"+bb[bb.length-1]+"---"+i+",
    //	"+(end-start)+"ms,	"+"\r\n");
  }