workerman怎么實(shí)現(xiàn)p2p,通過(guò)公網(wǎng)服務(wù)器輔助之后,客戶(hù)端直連。既網(wǎng)上說(shuō)的udp打動(dòng)
我根據(jù)開(kāi)發(fā)手冊(cè)的udp的案例,服務(wù)器和客戶(hù)端是可以u(píng)dp通訊的,但是,拿到對(duì)應(yīng)的ip和port后,客戶(hù)端之間就是無(wú)法通訊,請(qǐng)問(wèn)有大神指點(diǎn)一下嗎
服務(wù)器端源碼
$http_worker = new Worker("udp://0.0.0.0:9999");
$http_worker->name = "udp_char";
$http_worker->data = ['pc1'=>'', 'pc2'=>''];
$http_worker->count = 1;
// 接收到瀏覽器發(fā)送的數(shù)據(jù)時(shí)回復(fù)hello world給瀏覽器
$http_worker->onMessage = function($connection, $request) use($http_worker)
{
$request = json_decode($request, true);
$http_worker->data[$request['from']] = $connection->getRemoteIp() . ':' . $connection->getRemotePort();
$data = ['code'=>0, 'socket'=>''];
if ($http_worker->data[$request['to']]) {
$data['code'] = 1;
$data['socket'] = $http_worker->data[$request['to']];
}
$connection->send(json_encode($data));
};
Worker::runAll();
客戶(hù)端的源碼:
$http_worker = new Worker("udp://0.0.0.0:0");
$http_worker->name = "udp_char";
$http_worker->count = 1;
$http_worker->onWorkerStart = function($worker)
{
// 2秒后啟動(dòng)一個(gè)udp客戶(hù)端,連接
Timer::add(2, function(){
$udp_connection = new AsyncUdpConnection('udp://server:9999');
$udp_connection->onConnect = function(AsyncUdpConnection $udp_connection){
$udp_connection->time_id = Timer::add(5, function()use($udp_connection){
$data = ["to"=>"pc2", "from"=>"pc1"];
$udp_connection->send(json_encode($data));
});
};
$udp_connection->onMessage = function(AsyncUdpConnection $udp_connection, $request){
// 收到服務(wù)端返回的數(shù)據(jù)
$request = json_decode($request, true);
if ($request['code']) {
echo "\t\n------------ 訪(fǎng)問(wèn)pc2 ----------------\t\n";
$client = stream_socket_client('udp://' . $request['socket']);
$data = ["code"=> 1, "msg"=>"wo shi pc1"];
fwrite($client, json_encode($data));
stream_socket_sendto($client, "udp數(shù)據(jù)");
$udp_connection_pc = new AsyncUdpConnection('udp://'.$request['socket']);
$udp_connection_pc->onConnect = function(AsyncUdpConnection $udp_connection_pc){
echo "\t\n連接\t\n";
$udp_connection_pc->time_id = Timer::add(5, function()use($udp_connection_pc){
echo "\t\n發(fā)數(shù)據(jù)給pc2\t\n";
$data = ["code"=> 1, "msg"=>"wo shi pc1"];
$udp_connection_pc->send(json_encode($data));
});
};
$udp_connection_pc->onMessage = function(AsyncUdpConnection $udp_connection_pc, $request){
// 收到服務(wù)端返回的數(shù)據(jù)
var_dump($request);
};
$udp_connection_pc->connect();
Timer::del($udp_connection->time_id);
}
};
$udp_connection->connect();
}, null, false);
};
$http_worker->onMessage = function($connection, $request)
{
$data = ["code"=> 1, "msg"=>"wo shi pc1"];
$udp_connection->send(json_encode($data));
};
Worker::runAll();
求助各路大神,指點(diǎn)指點(diǎn)