Lassen Sie zwei Clients das Ereignis des anderen auslösen (Request-Response)

Was ich mit 2 Clients erreichen möchte, die auf meinem Computer ausgeführt werden (gleiches, privates Netzwerk):

Client1 stellt eine Anfrage, indem er einen Wert k
sendet Client1 beginnt zu warten auf eine Antwort auf die Anfrage
Client2 wartet auf eine solche Anfrage
Der Ereignis-Listener von Client2 wird ausgelöst
Client2 führt dann eine Aktion aus (sendet k+1 als Antwort an den Vertrag)
Client2 beginnt Warten auf eine neue Anfrage
Der Ereignis-Listener von Client1 wird ausgelöst - sie hat eine Antwort auf ihre Anfrage
erhalten Client1 sendet eine neue Anfrage (k+1)

Ich habe eine Reihe von Varianten des folgenden Codes ausprobiert, mit unterschiedlichem (Nicht-)Erfolg - entweder pumpt ein Client weiterhin Anfragen/Antworten aus (wie im Beispiel unten) oder einer von ihnen sendet seine Daten und der andere liest sie mehrmals (?) und handelt entsprechend (dh beginnt so viele Anfragen/Antworten zu senden, wie es Ereignisse empfangen hat). Ich möchte natürlich, dass jeder Client wartet, bis sein Ereignis ausgelöst wird, und dann einfach seine Aktion ausführt und zum Warten zurückkehrt. Wäre wirklich dankbar für etwas Hilfe dabei!

Dies ist der JavaScript web3js-Code (process1 wird im ersten Durchlauf mit einer 0 aufgerufen).

function process1(k){
  myContract.query(k, 2000000, {from: web3.eth.accounts[0]});
  myContract.responding({}, {fromBlock: 'latest', toBlock: 'latest'}).watch((error, eventResult) => {
    if (error)
    console.log('Error: ' + error);
    else{
      console.log('myEvent: ' + JSON.stringify(eventResult));
      k=eventResult.args.r;
      k++;
      myContract.responding({}, {}).stopWatching();
      process1(k);
    }
  });
}

function process2(){
  myContract.asking({}, {fromBlock: 'latest', toBlock: 'latest'}).watch((error, eventResult) => {
    if (error)
    console.log('Error: ' + error);
    else{
      console.log('myEvent: ' + JSON.stringify(eventResult));
      k=eventResult.args.q;
      k++;
      myContract.response(k, 2000000, {from: web3.eth.accounts[0]});
      myContract.asking({},{}).stopWatching();
      process2();
    }
  });
}

Dies ist der Solidity-Vertrag:

pragma solidity ^0.4.9;

contract Testing {


  function Testing() payable {
  }

  event asking (address sender, uint q);
  event responding (address sender, uint r);


  function query(uint q){
    asking(msg.sender, q);
  }

  function response(uint r){
    responding(msg.sender, r);
  }
}

Ausgabe:

myEvent: {
"address":"0x7dae29167d71e027a56672b6cba6d6f32b68456f",
"blockNumber":6985,
"transactionHash":"0xdef57d92d37166d54673d128bd56f8e170a11ba84695395f5b06fac723450d90",
"transactionIndex":0,
"blockHash":"0xd9e58ebdce3d3803771ea6f9c6d8d71d58ab94920a781be2fdae6ac8de7e1db5",
"logIndex":0,
"removed":false,
"event":"asking",
"args":{"sender":"0x197d8fc7da84f7ee0a763db8d759255d1341e906","q":"0"}
}

Antworten (1)

So etwas sollte funktionieren

function process1(k){
  myContract.query(k, 2000000, {from: web3.eth.accounts[0]});
  var responding = myContract.responding({}, {fromBlock: 'latest', toBlock: 'latest'});
  responding.watch((error, eventResult) => {
    if (error)
    console.log('Error: ' + error);
    else{
      console.log('myEvent: ' + JSON.stringify(eventResult));
      k = eventResult.args.r;
      k++;
      myContract.query(k, 2000000, {from: web3.eth.accounts[0]});
    }
  });
}


function process2(){
  var asking = myContract.asking({}, {fromBlock: 'latest', toBlock: 'latest'});
  asking.watch((error, eventResult) => {
    if (error)
    console.log('Error: ' + error);
    else{
      console.log('myEvent: ' + JSON.stringify(eventResult));
      k = eventResult.args.q;
      k++;
      myContract.response(k, 2000000, {from: web3.eth.accounts[0]});
    }
  });
}