安卓实现websocket连接,聊天室开发

最近在开发网页小游戏,需要使用到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

作者: 执着小钟

执着小钟

发表评论