之前做這個(gè)功能,記錄一下。即時(shí)通訊(Instant Messaging)最重要的毫無(wú)疑問(wèn)就是即時(shí),不能有明顯的延遲,要實(shí)現(xiàn)IM的功能其實(shí)并不難,目前有很多第三方,比如極光的JMessage,都比較容易實(shí)現(xiàn)。但是如果項(xiàng)目有特殊要求(領(lǐng)導(dǎo)不愿意花這份錢(qián)),那就得自己做了,所以我們需要使用WebSocket。
一.Android實(shí)現(xiàn)即時(shí)通訊功能
1.引入WebSock依賴(lài)
implementation "org.java-websocket:Java-WebSocket:1.4.0"
2.創(chuàng)建一個(gè)java類(lèi)并繼承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連接開(kāi)啟時(shí)調(diào)用,onMessage()方法在接收到消息時(shí)調(diào)用,onClose()方法在連接斷開(kāi)時(shí)調(diào)用,onError()方法在連接出錯(cuò)時(shí)調(diào)用。構(gòu)造方法中的new Draft_6455()代表使用的協(xié)議版本,這里可以不寫(xiě)或者寫(xiě)成這樣即可。
3.建立連接
URI uri = URI.create("ws://*******"); //后臺(tái)給的一個(gè)websocket 的路徑
JWebSocketClient client = new JWebSocketClient(uri) {
@Override
public void onMessage(String message) {
//message就是接收到的消息
Log.e("JWebSClientService", message);
}
};
二.如果只需要接收服務(wù)器傳過(guò)來(lái)的消息
String url = "ws://jsh.yitian-tech.com:19012/api/websocket/" + id;
//url是后臺(tái)給的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;
//讀取客戶(hù)端數(shù)據(jù)
while((data1 = br.readLine()) != null){
System.out.println("客戶(hù)端接收到服務(wù)器回應(yīng)的數(shù)據(jù):" + data);
}
//關(guān)閉輸入流
socket.shutdownInput();
//關(guān)閉資源
br.close();
isr.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}