0

首先 fputs 用于将聊天从 PHP 站点发送到该游戏服务器。但是当我使用 fgets 从服务器获取所有聊天日志时,它不会返回它,例如,当我在文本字段中写一些东西并使用以下代码中的按钮发送它时,它会向服务器发送消息,我希望它从服务器返回该值,或者从服务器获取所有聊天日志并将其放入作为 php 网站的客户端,这是代码:

 <?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()只读取一行(由 终止"\n")并且将阻塞直到"\n"收到或连接关闭。确保其中一件事情发生。(使用telnetnc程序)

哦,我不确定,但它可能会"\r\n"在 Windows 上出现,并且不会"\n"单独做出反应。不过不要相信我的话。

如果没有换行符,请使用andfread的组合(请参阅手册)。stream_selectstream_set_blocking

如果它更复杂,您可能需要切换到socket_*函数。请注意,套接字和流不会混合。


抱歉,我懒得举个例子了。您可以在此处查看实际操作的一般示例stream_select(免责声明:我知道代码很丑陋。)

基本上,您将stream_set_blocking使用 0 并循环,stream_select直到fread您阅读了所有内容(如果您可以检测到)或遇到超时。很难提出任何不了解协议的内容。

于 2012-09-16T23:22:58.770 回答
0

您必须实际实现服务器所说的协议。当您调用 时fgets,您只会获得 TCP 堆栈当时恰好准备好的任何数据,这绝对不是您想要的。

于 2012-09-16T23:13:45.510 回答