0

クライアント (ボットネット サーバー) は、TCP ソケットを介してサーバー (ディスラプター) に連続メッセージを送信しようとしていますが、ディスラプターで受信されるメッセージは 1 つだけです。Disruptor は、ボットネット サーバーによって作成されるスレッドです。

コード: ボットネット サーバー

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Jedis jedis = new Jedis("localhost");
    String pattern = new String("TKproject");
    input = new Disruptor(30001,1024,jedis,pattern);
    int count = 0;
    Thread start = new Thread(input);
    start.start();
    try {
        request = new Socket("localhost",30001);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Random rand = new Random();
    Message msg = new Message();
    ObjectOutputStream oos = null;
    try {
        oos = new ObjectOutputStream(request.getOutputStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    while(true){
        System.out.println("count is : " + count);
    count++;
    if(count == 5)
        break;
    if(count % 15 == 0)
        jedis.rpush(pattern,Integer.toString(count));
    int next = rand.nextInt(3);
    msg.setMessageId(count);
    switch (next){
    case 0: msg.setType(MessageType.HELLO);
            break;
    case 1: msg.setType(MessageType.REQUEST);
            break;
    case 2: msg.setType(MessageType.REPLY);
            break;  
    default: msg.setType(MessageType.REQUEST);
             break;
    }
    //System.out.println("Message id "+msg.Messageid);
    try {
        oos.writeObject(msg);
        //oos.flush();
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
}

ディスラプター run()

   public void run() {
    // TODO Auto-generated method stub
    while(true){
        System.out.println("Disruptor Running");
        Socket receipt = null;
        try {
             receipt = server.accept();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ObjectInputStream recv = null;
        try {
            recv = new ObjectInputStream(receipt.getInputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        /*
        byte [] rcvbytes = new byte[2048];
        try {
            recv.read(rcvbytes);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
        try {
            storage.write((Message)recv.readObject());
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
4

2 に答える 2

0
 receipt = server.accept();

サーバーをクライアントに接続するには、これを一度だけ実行する必要があります。その命令をwhile(true).

ObjectInputStream宣言についても同じことを行う必要があります。

于 2015-02-15T20:04:53.383 に答える
0

また:

  • Message古いオブジェクトを更新する代わりに、毎回新しいオブジェクトを送信する
  • 「writeUnshared()」を使用して送信するか、
  • ObjectOutputStream.reset()リフレッシュされたオブジェクトを送信する前に呼び出しMessageます。
于 2015-02-15T21:41:40.773 に答える