繁体   English   中英

使用 php 的客户端到客户端套接字

[英]Client to client socket with php

如何让 php 客户端到客户端,比如聊天方式? 一个客户端连接并向另一个客户端发送某些内容,但只有他接收到并非所有客户端。

你的问题?

如果我理解正确,您需要一对一(私人)消息传递。

使用 PHP 进行套接字编程

您需要使用 PHP 学习 Socket 编程 您可以从学习本教程开始。 这到处都是缩放问题,因为 PHP 没有非阻塞 IO,正确的线程 model。 我建议你只将它用于有趣的小项目。

非阻塞 IO 使用 PHP

您可以尝试使用PHP-MIO 我还没有尝试过,但我想它可能会扩展。 但是从 Apache(PHP) 方面来看,你也会遇到同样的问题。 但是当从双方使用它时,它可以工作......

使用 PHP 进行长轮询(阻塞 IO)

PS:无聊所以我没有完全测试过这个;)

下载

下面我介绍了两个无法扩展的解决方案(原型)。 一种解决方案使用 Redis pubsub 为此,您需要安装(编译) redis 为此,您需要一个 POSIX 操作系统,尽管有些人已将其移植到 Windows 您还可以使用免费的redistogo.com实例。 Redis 解决方案是首选解决方案。 我已将所有内容放在一个存档中,您可以从这里下载。

我还给出了一个使用命名管道的解决方案。 此解决方案不需要您使用 Redis,但此方法需要访问文件系统。 我相信这种方法也应该适用于 Windows(您必须将文件名更改为 windows 样式)。 我想让有人试试这个:)。 我不能再测试这个了,因为很久以前我已经完全切换到了 POSIX OS(Ubuntu)。

要求

至少 PHP 5.3,最好是 POSIX OS, redis

如何使用

要使用这两种解决方案,您需要打开两个浏览器(浏览器A / B )。 我假设您正在使用localhost进行开发,并且您可以从http://localhost/6646733访问文件。

  1. 将浏览器A指向http://localhost/6646733/redis?me=somebodyelse&to=alfred alfred 您应该在尝试命名管道时将redis替换为pipe
  2. 将浏览器B指向http://localhost/6646733/redis?me=alfred&to=somebodyelse
  3. 在浏览器A中,在 textarea 中输入一条消息,该消息将发送到浏览器B
  4. 在浏览器B中读取刚刚从浏览器A发送的消息

不使用 PHP 的解决方案

规模以下的解决方案。

Pusher(托管)

例如,使用托管解决方案Pusher ,您可以在没有扩展噩梦的情况下进行聊天/消息传递。 Pusher甚至慷慨地提供免费计划。 但请注意,便宜的计划不提供 SSL,因此可以拦截消息。 在不使用 SSL 时,您永远不应该通过网络发送私人信息。 用户/开发人员提供了一个不错的小库来使用来自 PHP 的 Pusher 这种方法的问题在于您无法控制,但推动者是,但是您不必担心任何细节。

Socket.io(开源)

我真的很喜欢socket.io ,但当然还有很多其他的解决方案,例如龙卷风 您可以使用 Redis 在 PHP 和其他解决方案(socket.io)之间进行有效通信。

我不完全理解您要做什么,但是您可以使用某种数据库并让它存储发送给每个用户的消息,然后让您的客户端页面使用 AJAX 类型的查询刷新聊天部分更新聊天。 然后,它的行为类似于新的 Facebook 聊天,其中存储所有消息,即使是在正常聊天和邮件中发送的消息。 因此,客户可以随时互相发送邮件和聊天,当他们在线时,它会显示在他们的聊天中,当你离线时,它会显示在他们的收件箱中。 但这可能不是你想要做的。

为了实现最好的聊天应用程序,使用 jabber 服务器并使用 js/flex 编写客户端

http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol

如果它不像聊天但你想在没有服务器的情况下发送消息,你需要两个客户端也是服务器。 服务器将在端口上侦听传入连接。 编写一个守护程序,每次客户端连接时都会产生一个新线程。 在此线程中,您处理消息传递。

客户端 A 打开与服务器(客户端 B)的连接,它们可以相互通信。 或者您让客户端 A 成为服务器并让客户端 B 连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM