Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rafagets

Colocar um servidor java Sockets online

Recommended Posts

olá!

 

Criei um joguinho usando socket e thread. esta funcionando blz na rede local, com o servidor rodando em um pc e os clientes em outras maquinas.

 

mas agora gostaria que pessoas de fora da minha rede acessem tambem, mas não sei como fazer...

 

alguem da uma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por MarceloSB
      Boa tarde colegas, 
       
      Se alguém puder me dar uma luz, estou com uma dificuldade em relação ao sockets com php, já estou a dias tentando fazer mas ta difícil, rs. 

      A aplicação basicamente tem uma pagina web que vai receber informações quando for incluído algum dado novo no banco de dados através de outra aplicação. 

      Fiz da seguinte forma  PAINEL + SERVER PHPSOCKETs + ADMIN

      Criei um arquivo em php (server.php) que vai ser o servidor de sockets. 
      Eu execute ele pelo shell do linux: php -q server.php 192.168.15.3 8959
      require_once("/var/www/html/controller/cfg-system.php"); $host = $argv[1]; //host $port = $argv[2]; //port $null = NULL; //null var // //set_time_limit(0); //ob_implicit_flush(); //Create TCP/IP sream socket $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //reuseable port socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); //bind socket to specified host socket_bind($socket, 0, $port); //listen to port socket_listen($socket); //create & add listning socket to the list $clients = array($socket); say( ascii_banner() ); say("PHP WebSocket Server running...."); say("Server Started : ".date('Y-m-d H:i:s')); say("Listening on : ".$host." port ".$port); say("Master socket : ".$socket."\n"); say(".... awaiting connections ..."); //start endless loop, so that our script doesn't stop while (true) { //manage multipal connections $changed = $clients; //returns the socket resources in $changed array socket_select($changed, $null, $null, 0, 10); //check for new socket if (in_array($socket, $changed)) { $socket_new = socket_accept($socket); //accpet new socket if ($socket_new) say("$socket: Connected ..."); $clients[] = $socket_new; //add socket to client array $header = socket_read($socket_new, 1024); //read data sent by the socket perform_handshaking($header, $socket_new, $host, $port); //perform websocket handshake socket_getpeername($socket_new, $ip); //get ip address of connected socket $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.':'.$port.' connected'))); //prepare json data if ($response) send_message($response); //notify all users about new connection //make room for new socket $found_socket = array_search($socket, $changed); unset($changed[$found_socket]); } //loop through all connected sockets foreach ($changed as $changed_socket) { //check for any incomming data while(socket_recv($changed_socket, $buf, 1024, 0) >= 1) { $received_text = unmask($buf); //unmask data $received_text = str_replace("\\" ,"",$received_text); $response_text = mask($received_text); if($response_text)send_message($response_text); //send data //} break 2; //exist this loop } $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ); if ($buf === false) { // check disconnected client // remove client for $clients array $found_socket = array_search($changed_socket, $clients); socket_getpeername($changed_socket, $ip); unset($clients[$found_socket]); //notify all users about disconnected connection $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.':'.$port.' disconnected'))); if($response)send_message($response); } } } // close the listening socket socket_close($socket); function send_message($msg) { global $clients; foreach($clients as $changed_socket) { if($msg) @socket_write($changed_socket,$msg,strlen($msg)); //say("> ".$msg." (".strlen($msg). " bytes) \n"); } return true; } //Unmask incoming framed message function unmask($text) { $length = ord($text[1]) & 127; if($length == 126) { $masks = substr($text, 4, 4); $data = substr($text, 8); } elseif($length == 127) { $masks = substr($text, 10, 4); $data = substr($text, 14); } else { $masks = substr($text, 2, 4); $data = substr($text, 6); } $text = ""; for ($i = 0; $i < strlen($data); ++$i) { $text .= $data[$i] ^ $masks[$i%4]; } return $text; } //Encode message for transfer to client. function mask($text) { $b1 = 0x80 | (0x1 & 0x0f); $length = strlen($text); if($length <= 125) $header = pack('CC', $b1, $length); elseif($length > 125 && $length < 65536) $header = pack('CCn', $b1, 126, $length); elseif($length >= 65536) $header = pack('CCNN', $b1, 127, $length); return $header.$text; } //handshake new client. function perform_handshaking($receved_header,$client_conn, $host, $port) { $headers = array(); $lines = preg_split("/\r\n/", $receved_header); foreach($lines as $line) { $line = chop($line); if(preg_match('/\A(\S+): (.*)\z/', $line, $matches)) { $headers[$matches[1]] = $matches[2]; } } $secKey = @$headers['Sec-WebSocket-Key']; $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))); //hand shaking header $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" . "Upgrade: websocket\r\n" . "Connection: Upgrade\r\n" . "WebSocket-Origin: $host\r\n" . "WebSocket-Location: ws://$host:$port/panel/shout.php\r\n". "Sec-WebSocket-Accept:$secAccept\r\n\r\n"; socket_write($client_conn,$upgrade,strlen($upgrade)); } function ascii_banner() //just for old-skool fun... { $banner=" _ ____ _ _ \n"; $banner.=" __ _____| |__/ ___| ___ ___| | _____| |_\n "; $banner.="\ \ /\ / / _ \ '_ \___ \ / _ \ / __| |/ / _ \ __|\n"; $banner.=" \ V V / __/ |_) |__) | (_) | (__| < __/ |_ \n"; $banner.=" \_/\_/ \___|_.__/____/ \___/ \___|_|\_\___|\__|\n"; return $banner; } //utility functions function say($msg=""){ echo $msg."\n"; } //display server console messages E criei um outro arquivo que vou chamar de painel com websockets que é acesso via navegador  http://192.168.15.3/painel/
      A ideia é que esse painel receba as informações que forem incluídas e ou alteradas pelo ADMIN.

      Abaixo o script do websocket,  esta conectando e funcionando bem...
      <script language="javascript" type="text/javascript"> $(document).ready(function(){ //create a new WebSocket object. {WS-HOST} = 192.168.15.3 {WS-PORT} = 8959 var wsUri = "ws://{WS-HOST}:{WS-PORT}"; websocket = new WebSocket(wsUri); websocket.onopen = function(ev) { // connection is open $('#message_box').append("<div class=\"system_msg\">Connected!</div>"); //notify user $('#md-alert').modal('show'); //setTimeout(, 2000); setTimeout(function(){ $('#md-alert').modal('hide'); }, 6000); } //#### Message received from server? websocket.onmessage = function(ev) { if (ev.data){ var $msg = JSON.parse(ev.data); //PHP sends Json data var $type = $msg.type; //message type if($type == 'usermsg') { // mostro mensagems de users.. } //Mensagens do sistema (sockets) if($type == 'system'){ var $umsg = $msg.message; //message text console.log($umsg + " " + $type); } //Conteudo... if($type == 'conteudo'){ //Carrego o conteudo } } }; websocket.onerror = function(ev){ console.log((ev.data)); }; websocket.onclose = function(ev){ console.log((ev.data)); }; }); </script>
      O problema é agora!! Não estou conseguindo mandar as informações para o socket para o painel ler. 
      NO ADMIN é outra url etc.: http://192.168.15.3/admin/  quando eu publicar o conteudo, logo após o insert no banco de dados, quero mandar essas informações para o socket.
      Eu tentei usar o seguinte script:

      /* Get the port for the WWW service. */
      $service_port = '8959';
      /* Get the IP address for the target host. */
      $address = '192.168.15.3';
      $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
      $result = socket_connect($socket, $address, $service_port);
      if ($result === false) {
          echo "socket_connect() failed.\nReason: ($result) " . 
                socket_strerror(socket_last_error($socket)) . "\n";
      } else echo "Socket conneted  $address: $service_port <br >";
      if (socket_bind($socket, $address, $service_port)) {
          echo "Socket bound correctly";
      }
      $buf = 'Test Message'; // Aqui seria o resultado do insert..
      $len = strlen($buf);
      if (socket_sendto($socket, $buf, $len, 0x100,  $address, $service_port) !== FALSE) {
          echo "Message sent correctly";
      }
       
       
       

       
       
       
    • Por Marcos RJ
      Olá pessoal!
       
      Quero atualizar uma div somente quando houver mudança em um determinado campo no banco de dados, atualmente estou usando setTimeout(listComment, 3000);, mas quero mudar para websocket por questões de desempenho e o impacto que causa no tráfego. Procurei alguns exemplos na internet, mas só achei exemplos de chats, e não é o que eu preciso.

      Alguém tem uma dica de como checar mudanças no bd com websocket somente em uma determinada div?
       
      Gostaria de implementar no código abaixo:

       
      <div id="output"></div> <script> function listComment() { $.post("listar.php", function (data) { var data = JSON.parse(data); var comments = ""; var replies = ""; var item = ""; var parent = -1; var results = new Array(); var list = $("<ul class='outer-comment'>"); var item = $("<li>").html(comments); for (var i = 0; (i < data.length); i++) { var commentId = data[i]['comment_id']; comments = "<div class='comment-row'>" + "<div class='comment-info'><span class='commet-row-label'>de</span> <span class='posted-by'>" + data[i]['comment_sender_name'] + " </span> <span class='commet-row-label'>às</span> <span class='posted-at'>" + data[i]['date'] + "</span></div>" + "<div class='comment-text'>" + data[i]['comment'] + "</div>" + "<div><a class='btn-reply' onClick='postReply(" + commentId + ")'>Responder</a></div>" + "</div>"; var item = $("<li>").html(comments); list.append(item); var reply_list = $('<ul>'); item.append(reply_list); listReplies(commentId, data, reply_list); // } } setTimeout(listComment, 3000); $("#output").html(list); }); } </script>  
      Muito Obrigado!
       
    • Por Joaopedro23434we
      Olá pessoal, ultimamente eu venho querendo desenvolver um jogo simples, para mim e meus amigos jogar. Como eu sempre adorei jogos Browser, eu resolvi criar bem simples só para passar meu tempo e adquirir mais conhecimento, entretanto, resolvi cri-lo em PHP, JS(jQuery), HTML5 e CSS3. Funciona basicamente assim, o jogador movimenta uma nave pelo mapa, e pode encontrar inimigos(Outros jogadores online), esses inimigos no caso serão meus amigos, pois como eu disse, é uma coisa simples e não quero entupir de usuários. Ouvi falar a respeito do node.js, entretanto eu não tenho tantos conhecimentos de JS e então pesquisando mais afundo descobri os sockets no PHP. No caso estou utilizando o da própria linguagem socket_create() e não frameworks como o Ratchet. É possível desenvolver um game assim? Eu sei que da para fazer com jQuery.ajax(), entretando ficaria muito lento e seria uma má prática com certeza. 
    • Por Micilini Roll
      Fala galera, estou aqui para pedir a ajuda de todos voces. Tudo que iremos tentar fazer é criar um chat privado utilizando websockets junto ao php sockets, para adiantar algumas coisas eu ja fiz um chat e disponibilizei no github, voces podem acessar atraves do link abaixo:
       
       
      Esse chat funciona perfeitamente, mas no entanto ele é um chat global, ou seja, uma mensagem enviada por um usuario X, vai para todos os usuarios que estão na sala do chat. Como dito anteriormente a nossa ideia é criar um chat privado, então vamos a algumas considerações:
       
      No meu caso estou utilizando os arquivos dentro da pasta easychat (que esta no link enviado anteriormente) Podemos utilizar node.js, socket.io e afins? Não, estou querendo resolver somente com php e javascript puro.  
      Agora chegou a hora de dar uma pincelada no meu codigo:
       
      Aplicacao.js
       
      Existem duas funções responsaveis por enviar e receber a mensagem do servidor e abaixo estão elas:
      form.onsubmit = function(e) { e.preventDefault(); // Recuperando a mensagem do textarea. var mensagem = mensagemTexto.value; // Enviando a mensagem através do WebSocket. socket.send(mensagem); // Adicionando a mensagem numa lista de mensagens enviadas. listaMensagem.innerHTML += '<li class="envia"><span>Enviado:</span>' + mensagem + '</li>'; // Limpando o campo da mensagem após o envio. mensagemTexto.value = ''; return false; }; socket.onmessage = function(event) { var mensagem = event.data; listaMensagem.innerHTML += '<li class="recebida"><span>Recebida:</span>' + mensagem + '</li>'; }; Quando enviamos uma mensagem ele executa o comando socket.send(mensagem) ali eu pensei em enviar mais alguns parametros como:
       
      IP do usuario (Pode precisar) Chat de onde ele esta acessando (Chat1, Chat2, Chat3) Mensagem (é claro rs)  
      Já no lado do PHP, o comando abaixo é responsavel por pegar a resposta do usuario e retorna-la de volta:
       
      Server.php
      }else{ $bytes = socket_recv($sock, $data, 2048, null); $d = unmask($data); foreach ($cls as $socket) { if($socket != $m_sock && $val > 0){ try{ socket_write($socket,(encode($d))); }catch(Exception $e){ unset($cls[$socket]); socket_close($cls[$socket]); } } } } } Com o comando socket_recv ele consegue captar a mensagem que esta sendo enviada e realiza a função unmask nela, um pouco mais adiante ele faz o encode desta mensagem que recebeu e envia de volta para aquele socket (e todos que estão conectados naquele socket recebem a mensagem).
       
      Nesse caso, como nosso chat é privada devemos pensar tambem em fazer o insert e em seguida um select no banco de dados, entao melhor maneira de fazer isso é inserindo esses comandos entre os codigos try e socket_write, então vamos aos testes:
      ...... try{ //Aqui estabilizamos uma conexão com o banco de dados e inserimos na tabela a mensagem + ip + data + Chat1 (ou 2 ou 3). socket_write($socket,(encode($d))); } ..... Acho que tambem seria melhor criar um campo no banco de dados para verificar se a mensagem foi visualizada ou não?
       
      Depois que inserimos no banco de dados chegou a hora do puzzle:
       
      Como iremos fazer para retornar a mensagem para aquele determinado usuario?
       
      Antes de respondermos a esta pergunta vamos criar um cenario novo e de simples visualização para todos nos:
       
      Vamos criar um arquivo php com 2 links: Ir para o Chat 1 & Ir para o Chat 2 Vamos reaproveitar aqueles arquivos dentro da pasta EasyChat Vamos duplicar o arquivo index.php, criando indexChat1.php e IndexChat2.php  
      Ambos os indexs irão utilizar a porta 8080 (assim como esta no github), Não! nos não iremos separar os chats em portas diferentes (tenha em mente que isso é so um teste para realizar algo mais completo lá na frente, IMAGINE 10000 chats privados acontecendo simultaneamente e abrimos uma porta para cada um deles......).
       
      Entao apartir deste momento temos 2 indexes diferentes utilizando os mesmos arquivos: aplicacao.js e server.php, no caso do arquivo aplicacao.js ele envia valores diferentes para o socket php como ip, mensagem e o tipo de chat que ele esta inserido, como chat1 ou chat 2.
       
      Executandos os Testes
       
      OK, vamos abrir o arquivo indexChat1.php em uma aba, e indexChat2.php em outra aba do nosso navegador, vamos inicialmente escrever uma mensagem no chat1, quando fizermos isso (e do jeito que nosso codigo atualmente esta), a mensagem será recebida tambem na aba do chat2, e a mesma coisa aconteceria caso digitarmos algo no chat2.
       
      Mas pelo menos no banco de dados esta dá seguinte forma:
       
      ID = 0
      IP = 32.22.221.22
      Local = Chat1
      Mensagem = Olá mundo
      Data = 01/01/2016
      Visualizado = false
       
      Agora voltamos a seguinte pergunta: Como iremos fazer para os usuarios que estão no chat1, nao receber e nem enviar mensagens para os usuarios que estão no chat2 e virce-versa?
       
      Eu acredito que a resposta esta na criação de um codigo que ainda nao sabemos mas que deve ser colocado dentro do arquivo server.php mais especificamente entre os comandos try e socket_write.
       
      Alguem tem mais alguma ideia para contribuir, assim que vou avançando postarei algumas soluções neste post ;)
       
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.