之前做这个功能,记录一下。即时通讯(Instant Messaging)最重要的毫无疑问就是即时,不能有明显的延迟,要实现IM的功能其实并不难,目前有很多第三方,比如极光的JMessage,都比较容易实现。但是如果项目有特殊要求(领导不愿意花这份钱),那就得自己做了,所以我们需要使用WebSocket。
一.Android实现即时通讯功能
1.引入WebSock依赖
implementation "org.java-websocket:Java-WebSocket:1.4.0"
2.创建一个java类并继承WebSocketClient
public class JWebSocketClient extends WebSocketClient {
public JWebSocketClient(URI serverUri) {
super(serverUri, new Draft_6455());
}
@Override
public void onOpen(ServerHandshake handshakedata) {
Log.e("JWebSocketClient", "onOpen()");
}
@Override
public void onMessage(String message) {
Log.e("JWebSocketClient", "onMessage()");
}
@Override
public void onClose(int code, String reason, boolean remote) {
Log.e("JWebSocketClient", "onClose()");
}
@Override
public void onError(Exception ex) {
Log.e("JWebSocketClient", "onError()");
}
}
其中onOpen()方法在websocket连接开启时调用,onMessage()方法在接收到消息时调用,onClose()方法在连接断开时调用,onError()方法在连接出错时调用。构造方法中的new Draft_6455()代表使用的协议版本,这里可以不写或者写成这样即可。
3.建立连接
URI uri = URI.create("ws://*******"); //后台给的一个websocket 的路径
JWebSocketClient client = new JWebSocketClient(uri) {
@Override
public void onMessage(String message) {
//message就是接收到的消息
Log.e("JWebSClientService", message);
}
};
二.如果只需要接收服务器传过来的消息
String url = "ws://jsh.yitian-tech.com:19012/api/websocket/" + id;
//url是后台给的socket的路径
try {
Socket socket = new Socket(url,8888);
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String data1 = null;
//读取客户端数据
while((data1 = br.readLine()) != null){
System.out.println("客户端接收到服务器回应的数据:" + data);
}
//关闭输入流
socket.shutdownInput();
//关闭资源
br.close();
isr.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}