我正在尝试创建PHP
聊天,所以我有server.php
在终端上启动服务器,这是听client
个连接:
<?php
function chat_leave( $sock, $chat_id = 0 )
{
if( $chat_room_id[ $chat_id ] )
{
unset( $chat_room_id[ $chat_id ] );
return true;
}
socket_close($sock);
return false;
}
function client( $input )
{
/*
Simple php udp socket client
*/
//Reduce errors
error_reporting(~E_WARNING);
$server = '127.0.0.1';
$port = 9999;
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
//Communication loop
while(1)
{
//Send the message to the server
if( ! socket_sendto($sock, $input , strlen($input) , 0 , $server , $port))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not send data: [$errorcode] $errormsg \n");
}
//Now receive reply from server and print it
if(socket_recv ( $sock , $reply , 2045 , MSG_WAITALL ) === FALSE)
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not receive data: [$errorcode] $errormsg \n");
}
return $reply;
}
}
/*
* chat_join
* a new user joins the chat
* @username: String
* @password: String
*
* add a new listener to the server
*
*/
function chat_join( $username = "", $password = "" )
{
$users = array(
"batman" => "batman123",
"robin" => "robin123",
"joe" => "joe123"
);
if( $users[$username] == $password )
{
return true;
}
return false;
}
function main()
{
$chat_room_id = array();
$username = stripslashes( $_POST['username'] );
$password = stripslashes( $_POST['password'] );
$action = stripslashes( $_POST['action'] );
$port = intval( $_POST['port'] );
$domain = stripslashes( $_POST['domain'] );
$chat_id = intval( $_POST['chat_room_id'] );
if( strcmp( $action, "login" ) == 0 )
{
$status = chat_join( $username, $password );
if( $status )
{
$chat_room_id[] = $chat_id;
echo json_encode( $status );
}
}
else if( strcmp( $action, "chat" ) == 0 )
{
$msg = stripslashes( $_POST['message'] );
// take the message, send through the client
$reply = client( $msg );
echo json_encode( $reply );
}
else if( strcmp( $action, "logout") == 0 )
{
}
else
{
echo json_encode( false );
}
return;
}
main();
?>
函数client()
是我从client.php
文件获得的代码,当我在终端上执行时,它能够发送和接收来自server.php
的消息。现在我想使用我的main.php
文件,因此一旦用户登录,他将向服务器发送消息,服务器将回复用户未看到的消息。
当我从两个不同的终端运行server.php
和client.php
时,我能够发送和接收消息,但是我希望使用main.php
执行此操作,将该回复消息转换为{ {1}}对象并发送回JSON
页面,并将其附加到html
框。
我的问题是:如何获得textarea
收到的回复并将其发送回html页面?
当我在终端上执行它时,我有:
client.php
我使用Enter a message to send : hello
Reply : hello
在聊天中发送用户输入,所以我希望能够接收该消息,然后将其发送到我在终端上启动的服务器并回复并转发回复到网页并将其附加到文本框区域。
我怎么能做到这一点?我应该通过AJAX
启动client.php
作为服务吗?或者我应该使用main.php
函数发送消息,然后返回它发送的内容,返回?
但是,我希望client($input)
在用户注销之前一直运行,因为其他客户端可能会连接到聊天。我怎么能做到这一点对我来说有点模糊。 client
中的代码与client( $input )
中的代码相同。
答案 0 :(得分:1)
对于偏离主题感到抱歉,但如果可以的话,最好使用带有http-bind模块的ejabberd服务器等XMPP就绪解决方案。当然,有一些缺点是这样的解决方案,但缺点是更大。只需看看这个解决方案,也许它会以低成本解决您的问题。
答案 1 :(得分:1)
我想我明白发生了什么。听起来你可能会错过一个听众?通常,聊天程序具有客户端ajax,可以定期检查或“侦听”特定用户的消息。
例如,如果有人在您的数据库中留下了用户x的消息(或者您存储消息的任何地方),您可能会有一些javascript每秒调用一个php脚本以查看服务器上是否有任何消息对于用户x。如果有,您可以回复消息或消息,并通过您的ajax回调函数接收它们。
如果您熟悉jQuery,请查看$ .get方法:http://api.jquery.com/jQuery.get/
答案 2 :(得分:1)
据我了解你的问题,你想从客户端向服务器发送一条消息,一旦此消息到达服务器,它将回复所有客户端......我是对的???
我做一些聊天就像使用nodejs和其他javascripts技术......并且必须说这里有一个很好的选择是使用网络套接字。意识到browser support is limited,但由于你没有指定浏览器需要运行什么,我认为这是一个很好的方法。
检查以下相关链接:
How to Use Sockets in JavaScript\HTML?
仅使用php + js执行此操作的一种可能方法是创建一些函数并放入setInterval以每12秒向服务器发出一次请求。我在2005年做了一些使用这种方法的asp聊天。我必须说网络套接字要好得多。
我不知道是否能回答你的问题......让我知道!
答案 3 :(得分:1)
在使用PHP和jQuery之前,我在这些方面开发了一些东西。我采用的解决方案是由于服务器设置的限制(我无法控制)。我使用PHP核心脚本来创建从消息窗口到消息提交框的页面的整个布局。任何进入该页面的用户都会获得一个随机生成的用户,例如user123234234,从用户进入聊天页面时开始生成unix时间戳。
提交的所有消息都存储在XML文件中,并且每天都会创建一个新的XMl文件。用户被保存在如下所示的消息节点中,其中包含使用不同节点属性的每条消息的用户详细信息。
使用jquery AJAX调用消息窗口每5秒刷新一次另一个PHP脚本,该脚本仅在用户进入聊天页面时读取XML日期XML文件。
<messages>
<message user="user123456" ip="127.0.0.1" session="{users session ID here}" time="{unix timestamp}"><![CDATA[User message here]]></message>
</messages>
它背后有更多的逻辑,但我发现它最容易开发和维护,我希望它能帮助你找到正确的方向。它适用于所有主流浏览器和IE7 +。