最近在开发网页小游戏,需要使用到php的Swoole\WebSocket\Server,开发了游戏服务器功能,突然突发奇想,这能不能用来开发移动的即时通讯功能呢?
php服务器的关键代码如下
<?php
//php在线直播示例代码
//使用PHPCLI模式运行
//命令:php start.php
//设置路径
define(‘ROOT‘, dirname(FILE));
require_once ROOT.’/function.php’;
//监听地址和端口
// $server = new swoole_websocket_server(“0.0.0.0(这里就是四个0,不要改)”, 8888);
$server = new swoole_websocket_server(“0.0.0.0”, 8888);
//服务端接收连接事件
$server->on(‘open’, function (swoole_websocket_server $server, $request) {
if(!file_exists(ROOT.’/client/’.$request->fd.’.client’)){
@file_put_contents(ROOT.’/chat/’.$request->fd.’.client’,$request->fd);
}
});
//服务端接收信息事件
$server->on(‘message’, function (swoole_websocket_server $server, $frame) {
foreach(notice(ROOT.’/chat/’) as $v){
$server->push($v,$frame->data);
}
});
//服务端接收关闭事件
$server->on(‘close’, function ($ser, $fd) {
@unlink(ROOT.’/chat/’.$fd.’.client’);
});
//服务开启
$server->start();
服务器的关键代码很简单,也就是做的分发功能而已,接下来就是安卓连接服务器的websocket,接收并发送信息了
public class ClientSocket{
private final int FRAME_QUEUE_SIZE = 5;
private final int CONNECT_TIMEOUT = 120 * 1000;
private WebSocket clientSocket;
private EventBus bus = null;
private String socketUrl;
private WebSocketAdapter adapter = new WebSocketAdapter() {
@Override
public void onTextMessage(WebSocket websocket, String text) throws Exception {
super.onTextMessage(websocket, text);
String[] msgs = text.split("\\|");
if (msgs.length >= 2) {
for (int i = 0; i < msgs.length; i++) {
// L.d(“收到消息:” + msgs[i]);
bus.post(“收到消息:” + msgs[i]);
}
} else {
// L.d(“收到消息:” + text);
bus.post(“收到消息:” + text);
}
}
@Override
public void onConnected(WebSocket websocket, Map<String, List<String>> headers)
throws Exception {
super.onConnected(websocket, headers);
bus.post("连接成功");
// L.d(“连接成功”);
}
@Override
public void onConnectError(WebSocket websocket, WebSocketException exception)
throws Exception {
super.onConnectError(websocket, exception);
bus.post("连接错误:" + exception.getMessage());
// L.e(“连接错误:” + exception.getMessage());
}
@Override
public void onDisconnected(WebSocket websocket, WebSocketFrame serverCloseFrame, WebSocketFrame clientCloseFrame, boolean closedByServer)
throws Exception {
super.onDisconnected(websocket, serverCloseFrame, clientCloseFrame, closedByServer);
// L.e(“断开连接”);
bus.post(“断开连接”);
}
};
public ClientSocket(String socketUrl) {
this.socketUrl = socketUrl;
bus = EventBus.getDefault();
}
//链接socket
public void connectSocket() {
// L.d(“链接socket”);
if (clientSocket != null && clientSocket.isOpen()) {
clientSocket.sendClose();
clientSocket = null;
}
try {
//ws地址,和设置超时时间
//设置帧队列最大值为5
//设置不允许服务端关闭连接却未发送关闭帧
//添加回调监听
//异步连接
clientSocket = new WebSocketFactory().createSocket(socketUrl, CONNECT_TIMEOUT) //ws地址,和设置超时时间
.setFrameQueueSize(FRAME_QUEUE_SIZE)//设置帧队列最大值为5
.setMissingCloseFrameAllowed(false)//设置不允许服务端关闭连接却未发送关闭帧
.addListener(adapter)//添加回调监听
.connectAsynchronously();
} catch (IOException e) {
e.printStackTrace();
}
}
//发送消息
public void sendMsg(String msg) {
if (clientSocket != null) {
if (clientSocket.isOpen()) {//判断已连接
clientSocket.sendText(msg);
} else {
// L.d(“clientSocket已经关闭”);
}
} else {
connectSocket();
sendMsg(msg);
// L.e(“clientSocket == null”);
}
}
//离线
public void turnOff() {
if (clientSocket != null) {
if (clientSocket.isOpen()) {//判断已连接
clientSocket.sendClose();//下线
clientSocket = null;
}
} else {
// L.e(“clientSocket == null”);
}
}
}
使用方法
ClientSocketManager clientSocketManager = new ClientSocketManager(“ws://你的服务器ip:8888”);
clientSocketManager.connectSocket(); //连接服务器
clientSocketManager.sendMsg(msg);//发送消息
————————————————
版权声明:本文为CSDN博主「zhongzhizhuo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhongzhizhuo/article/details/107099824