Mingcong / DOS_Twitter

0 stars 0 forks source link

client code #4

Open huixiangufl opened 9 years ago

huixiangufl commented 9 years ago

package twitterclient

import akka.util.Timeout import scala.concurrent.duration. import scala.concurrent.ExecutionContext.Implicits.global import akka.actor.{ ActorSystem, Actor, Props, ActorRef } import akka.actor. import scala.collection.mutable.ArrayBuffer import common. import java.security.MessageDigest import java.util.Formatter import java.util.Calendar import java.text.SimpleDateFormat import java.util.Date import scala.util.Random import scala.util.control.Breaks. import scala.concurrent.Await

object twitterclient {

sealed trait Message case object SendTweet extends Message case object ViewTweet extends Message

val numUsers: Int = 1000000

def getHash(s: String): String = { val sha = MessageDigest.getInstance("SHA-256") sha.digest(s.getBytes) .foldLeft("")((s: String, b: Byte) => s + Character.forDigit((b & 0xf0) >> 4, 16) + Character.forDigit(b & 0x0f, 16)) }

def dateToString(current: Date): String = { val formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") val s: String = formatter.format(current) return s }

def getCurrentTime(): Date = { Calendar.getInstance().getTime() }

class clientActor(twitterServer: ActorSelection) extends Actor {

//    println(self.path.name)

def receive = {
  case SendTweet => {
    val t = Tweet(self.path.name.substring(6).toInt, "what are you doing?", getCurrentTime, null)
    t.ref_id = getHash(t.user_id.toString + t.text + dateToString(t.time_stamp))
    twitterServer ! getTweet(t)
  }

  case ViewTweet => {
    //twitterServer ! viewHomeTimeline(self.path.name.substring(6).toInt)
    twitterServer ! viewUserTimeline(self.path.name.substring(6).toInt)
  }

  case displayUserTimeLine(userHomeTimeLine) => {
    for (tweet <- userHomeTimeLine)
      println(tweet)
  }

}

}

def randBehavior(prob: ArrayBuffer[Int], N: Int): Int = { var randProb = Random.nextInt(N) var behavior = prob.size breakable { for (i <- 0 until prob.size) { if (prob(i) >= randProb) { behavior = i break } } }

if (0 == behavior) {
  return 1
} else if (1 == behavior) {
  return 5
} else if (2 == behavior) {
  return 10
} else {
  return -1
}

}

def main(args: Array[String]) { implicit val system = ActorSystem("UserSystem") val twitterServer = system.actorSelection("akka.tcp://TwitterSystem@10.227.56.142:9000/user/boss") var clientArray = ArrayBuffer[ActorRef]() var counter = 0 while (counter < numUsers) { val client = system.actorOf(Props(classOf[clientActor], twitterServer), "client" + counter.toString) clientArray.append(client) counter += 1 if(counter % 10000 == 0) println("create " + counter) } println("create finished") /* var prob: ArrayBuffer[Int] = new ArrayBuffer // prob.append(100) // prob.append(1100) // prob.append(5600) // prob.append(10000)

var number = numUsers.toDouble * 0.01
prob.append(number.toInt)
number = numUsers.toDouble * 0.11
prob.append(number.toInt)
number = numUsers.toDouble * 0.56
prob.append(number.toInt)
number = numUsers.toDouble * 1.0
prob.append(number.toInt)

for(i <- 0 until numUsers){
  var randSeconds = randBehavior(prob, numUsers)
  if(1 == i)
    println("user " + i + " randSeconds: " + randSeconds)
  if(randSeconds != -1)
    system.scheduler.schedule(0 seconds, randSeconds seconds, clientArray(i), SendTweet)
}

system.scheduler.scheduleOnce(30 seconds){
  clientArray(1) ! ViewTweet
}
* 
*/

}

}

huixiangufl commented 9 years ago

package common import java.util.Date import scala.collection.mutable.ArrayBuffer

case class viewHomeTimeline(user_id: Long) case class viewUserTimeline(user_id: Long) case class getTweet(t: Tweet) case class displayUserTimeLine(userHomeTimeLine: ArrayBuffer[String]) case class Tweet(user_id: Long, text: String, time_stamp: Date, var ref_id: String)