0

まず、fputs は、PHP サイトからこのゲーム サーバーにチャットを送信するために機能します。しかし、fgetsを使用してサーバーからすべてのチャットログを取得すると、それは返されません。たとえば、テキストフィールドに何かを書き込んで、次のコードのボタンを使用して送信すると、サーバーにメッセージが送信されます。サーバーからその値を返すか、サーバーからすべてのチャットログを取得して、php Web サイトであるクライアントに配置します。コードは次のとおりです。

 <?php

 $host="192.168.0.6";
 $port = 7777;
 // open a client connection
 $fp = fsockopen ($host, $port, $errno, $timeout);
 if (!$fp){
 $result = "Error: could not open socket connection";
 }
 else
 {

  echo '<center><form action="tcpclient.php "method="POST" /></center>';
  echo '<center>'."Nickname: ".'<input type="text" name="nick" size="31" /></center>';
  echo '<center>'." Text: ".'<input type="text" name="chat" size="150" /> <input type="submit" name="send" value="Send"  /></center>';

  if (isSet($_POST['send'])) $formvalue =$_POST['chat'];
  //$name = $_POST['nick'];
  //if (isSet($_POST['send'])) $formvalue + $_POST['chat']; 
  fputs ($fp, $formvalue);

  }
  $result = fgets ($fp, 7777);
  echo $result;

  ?>
4

2 に答える 2

2

fgets()は 1 行 ( で終了) のみを読み取り、 を受信するか接続が閉じられる"\n"までブロックします。"\n"これらのいずれかが発生することを確認してください。(使用telnetまたはncプログラム)

ああ、よくわかりませんが"\r\n"、Windows で期待している可能性があり、単独では反応しません"\n"。しかし、私の言葉を鵜呑みにしないでください。

改行がない場合は、 and を組み合わせて使用​​しfreadます(マニュアルを参照)。stream_selectstream_set_blocking

さらに複雑な場合は、socket_*関数に切り替えることをお勧めします。ソケットとストリームは混在しないことに注意してください。


申し訳ありませんが、私は例が面倒です。実際の動作の一般的な例については、こちらを参照してくださいstream_select(免責事項: コードが醜いことは承知しています)。

基本的に、すべてを読み取るか (それを検出できる場合)、タイムアウトになるまで、0 にしてandstream_set_blockingでループします。プロトコルを知らずに何かを提案するのは難しいです。stream_selectfread

于 2012-09-16T23:22:58.770 に答える
0

サーバーが話すプロトコルを実際に実装する必要があります。を呼び出すとfgets、その時点で TCP スタックがたまたま準備していたデータを取得するだけであり、これは絶対に望んでいるものではありません。

于 2012-09-16T23:13:45.510 に答える