即时通讯,在目前的项目中基本上达到家家必备的程度了。这次我们就来解析即时通讯的实现
1.引用webSocket
本文我们通过websocket来实现即时通讯,首先我们在app.build中添加webSocket依赖:
//webSocket
implementation 'org.java-websocket:Java-WebSocket:1.5.2'
2.实现webSocket服务端
接着我们来创建一个类,MyWebSocketSererver用来继承webSocket给我们提供的WebSocketServer,然后我们去实现WebSocketServer中需要实现的方法:
public class MyWebSocketServer extends WebSocketServer {
private final Context context;
//定义构造方法,参数一为上下文参数,参数二为自己定义的服务端端口号
public MyWebSocketServer(Context context,int port){
super(new InetSocketAddress(port));
this.context = context;
}
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
//与客户端连接成功时调用
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
//与客户端断开连接时调用
}
@Override
public void onMessage(WebSocket conn, String message) {
//收到客户端发来的消息时调用
}
@Override
public void onError(WebSocket conn, Exception ex) {
//与客户端连接失败时调用
}
@Override
public void onStart() {
//服务端创建成功时调用
}
}
到这里其实还不算完,因为我们也需要在服务端接收客户端发送过来的消息并且显示出来,所以我们也需要在onMessage()方法中做接收的处理,这边我们通过广播接收客户端发送过来的消息,然后在实现webSocket服务端的地方去注册广播,接收广播发送过来的消息。
public void onMessage(WebSocket conn, String message) {
Log.d(TAG,"onMessage message ==" + message);
Intent intent = new Intent();
intent.setAction("com.example.mvvm.server");
intent.putExtra("message", message);
context.sendBroadcast(intent);
}
接下来我们去activity中实现我们的webSocket服务端:
public class WebSocketServerActivity extends BaseActivity<BaseViewModel, ActivityWebSocketServcectivityBinding> {
private List<TalkBean> talkBeanList;
private TalkMessageAdapter talkMessageAdapter;
private SocketServerReceiver socketServerReceiver;
private MyWebSocketServer myWebSocketServer;
private static final String TAG = "WebSocket --> Activity";
@Override
protected int getLayoutId() {
return R.layout.activity_web_socket_servcectivity;
}
@Override
protected void initDate() {
initView();
doRegisterReceiver();
createServer();
}
private void createServer() {
//创建webSocket服务端
myWebSocketServer = new MyWebSocketServer(this, 8888) {
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
super.onOpen(conn, handshake);
//判断是否连接成功
if (conn != null && conn.isOpen()) {
//服务端发送消息点击事件
viewDateBinding.btnSend.setOnClickListener(view -> {
conn.send(viewDateBinding.etMessage.getText().toString());
talkBeanList.add(new TalkBean(false, viewDateBinding.etMessage.getText().toString()));
talkMessageAdapter.notifyDataSetChanged();
});
}
}
};
//开启服务端
myWebSocketServer.start();
}
private void doRegisterReceiver() {
socketServerReceiver = new SocketServerReceiver(talkBeanList, talkMessageAdapter);
IntentFilter filter = new IntentFilter("com.example.mvvm.server");
registerReceiver(socketServerReceiver, filter);
}
private void initView() {
LinearLayoutManager linearLayoutManager = new L