要实现消息互通就必须要让这些消息服务器本身能互通,想了两个方式,一种是消息服务器之间交叉链接,另一种是增加一个特殊的消息服务器,这个消息服务器不对外开放,只负责消息转发和推送。
下列测试不考虑防火墙等。仅测试可行性和效率。
消息服务器
转发服务器
公共缓存
软件环境
client1 可向 client2 或者其他 client 发送消息,并接收其他 client 发送的消息.
Redis 中保存 client 连接的信息,给每个用户分配唯一的 key ,包括链接的哪台服务器,转发服务器定时检测消息服务器,如消息服务器挂掉,由转发服务器清理掉Redis已经挂掉的所有链接。
1. Client1 给 Client2 发送一条消息
2. Socket1 接收到消息,根据 key从Redis 取出 Client2 的连接信息,连接在本机,直接推送给 Client2 ,流程结束。
3.如果连接不在本机,把消息推送到转发服务器,由转发服务器把该消息推送给连接所在消息服务器,消息服务器接收消息,推送给 Client2 。
服务器上创建一个server.php,内容如下:
上只需把ip变更一下即可。192.168.0.201变更为192.168.0.202.
在转发服务器上建立脚本proxy.php,内容如下:
注意开启顺序
1.开启转发服务器php proxy.php
2.分别开启socket服务器php server.php
可以在转发服务器上看到两个消息服务器已经连接
3.开始测试,分别打开两个telnet,连接两个消息服务器,发送消息测试:
登陆
基于强大的 swoole 扩展,让php高效的实现这些成为可能,目前消息服务器到转发服务器是长连接,转发服务器到消息服务器是短连接,存在性能瓶颈,也浪费了连接资源。下一步改造成长连接,消息服务器的client使用异步。
首先,实现 Socket Service。package com.jia.leozhengfirstapp
import java.io.IOException
import java.io.InputStream
import java.io.UnsupportedEncodingException
import java.net.ServerSocket
import java.net.Socket
import android.app.Service
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.IBinder
import android.util.Log
public class SocketService extends Service {
private Socket clientSocket = null
private ServerSocket mServerSocket = null
private SocketAcceptThread socketAcceptThread = null
private SocketReceiveThread socketReceiveThread = null
private SocketReceiver socketReceiver
public static final String SOCKER_ACTION = "com.jia.Socket.Control"
public static final String SOCKER_RCV = "com.jia.Socket.ReceiveStr"
private boolean stop = true
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null
}
@Override
public void onCreate() {
super.onCreate()
Log.d("service", "socket service created")
socketReceiver = new SocketReceiver()
IntentFilter filter = new IntentFilter()
filter.addAction(SOCKER_ACTION)
registerReceiver(socketReceiver, filter)
socketAcceptThread www.hbbz08.com = new SocketAcceptThread()
// 开启 Socket 监听线程
socketAcceptThread.start()
}
@Override
public void onStart(Intent intent, int startId) {
Log.d("service", "socket service start")
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)