Java服務(wù)端可以通過以下兩種方式與Android客戶端進行通信:
使用WebSocket協(xié)議:
Java服務(wù)端代碼:
importjavax.websocket.*;
importjavax.websocket.server.ServerEndpoint;
importjava.io.IOException;
importjava.util.concurrent.CopyOnWriteArraySet;
importjava.util.concurrent.atomic.AtomicInteger;
@ServerEndpoint("/websocket")
publicclassBackendController{
privatestaticCopyOnWriteArraySet clients =newCopyOnWriteArraySet<>();
privatestaticAtomicIntegercounter =newAtomicInteger(0);
@OnOpen
publicvoidonOpen(Session session) {
clients.add(session);
}?
@OnClose
publicvoidonClose(Session session) {}
// 此處僅展示了與發(fā)送消息相關(guān)的代碼,因此只給出了注釋。
// 完整的WebSocket代碼實現(xiàn)應(yīng)該包括處理接收消息、處理錯誤等操作。其他相關(guān)的注釋如下:?
// OnMessage? ?
publicvoidonMessage(Stringmessage) {}
// OnError? ? ?
publicvoidonError(Session session, Throwable thr) {}
// OnSessionConnect? ?
publicvoidonSessionConnect(StringsessionId) {}
// OnSessionDisconnect? ?
publicvoidonSessionDisconnect(StringsessionId) {}
// OnMessageSent
publicvoidonMessageSent(int count) {}
// OnMessageReceived? ?
publicvoidonMessageReceived(Stringmessage) {}
@OnMessage
publicvoidonMessage(Stringmessage,Sessionsession) throwsIOException{
// 在此處處理接收到的消息?
System.out.println("Received message from client: "+ message);
}?
}
在Android設(shè)備端,可以使用相應(yīng)的WebSocket庫(如WebSocket-Android等)來連接后端WebSocket服務(wù)器并進行通信。
以下是一個Android客戶端使用WebSocket協(xié)議進行通信的示例代碼:
importandroid.os.Handler;
importandroid.os.Looper;
importandroid.util.SparseArray;
importorg.json.JSONException;
importorg.json.JSONObject;
importjava.net.URI;
importjava.net.URISyntaxException;
importjava.util.*;
importjavax.websocket.*;
importjavax.websocket.server.ServerEndpoint;
importjava.io.IOException;
importjava.util.concurrent.CopyOnWriteArraySet;
importjava.util.concurrent.atomic.AtomicInteger;
importandroid.os.Handler;
importandroid.os.Looper;
importandroid.util.*;
ToWebSocket@ServerEndpoint("/websocket")
publicclassBackendController{
privatestaticCopyOnWriteArraySet clients =newCopyOnWriteArraySet<>();
privatestaticAtomicIntegercounter=newAtomicInteger(0);
@OnOpenpublic
voidonOpen(Session session){
clients.add(session);
}
@OnClosepublic
voidonClose(Session session){}
@OnMessagepublic
voidonMessage(String message, Session session)throwsIOException {
// 在此處處理接收到的消息
Systemeoutprintln(""+ message);
}
@OnMessagepublic
voidonMessage(String message, Session session)throwsIOException {}
}
使用Server-Sent Events(SSE):
SSE是一種基于HTTP協(xié)議的實時通信技術(shù),它允許服務(wù)器向客戶端推送數(shù)據(jù),而不需要客戶端發(fā)出請求。SSE使用單個HTTP連接,持續(xù)保持連接狀態(tài),并通過服務(wù)器發(fā)送的事件流來更新客戶端的數(shù)據(jù)。
在Java服務(wù)端使用SSE(Server-Sent Events)和安卓客戶端進行通信,需要以下步驟:
首先,你需要創(chuàng)建一個Java服務(wù)端來處理SSE連接和驗證客戶端登錄??梢允褂肑ava的Servlet或Spring框架來實現(xiàn)服務(wù)端邏輯。在服務(wù)端,你需要配置SSE連接和事件處理機制。以下是一個簡單的Java Servlet示例:
@WebServlet("/sse")
publicclassSSEServletextendsHttpServlet{
protectedvoid doGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
PrintWriterout = response.getWriter();
out.write("data: Hello, SSE!\n\n");
out.flush();?
}?
}
上述代碼創(chuàng)建了一個名為sse的Webservlet,用于處理SSE連接。它設(shè)置響應(yīng)類型為text/event-stream,并返回一條數(shù)據(jù)消息。
在安卓客戶端,你需要使用JavaScript來與Java服務(wù)端建立SSE連接,并通過事件流接收和解析服務(wù)端發(fā)送的數(shù)據(jù)。以下是一個簡單的安卓客戶端示例:
privatevoidstartSSE() {
try{
URLurl =newURL("http://localhost:8080/sse");
HttpURLConnectionconnection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.connect();
if(connection.getContentType().equals("text/event-stream")) {
BufferedReaderreader =newBufferedReader(newInputStreamReader(connection.getInputStream()));
Stringline;
while((line = reader.readLine()) !=null) {
handleSSEEvent(line);
}?
}else{
// 處理連接失敗或不支持SSE的情況?
}?
}catch(IOExceptione) {
e.printStackTrace();
}finally{
// 關(guān)閉連接等清理操作?
}?
}?
privatevoidhandleSSEEvent(Stringevent) {
// 處理服務(wù)端發(fā)送的數(shù)據(jù)消息?
}
原文轉(zhuǎn)載自:java服務(wù)端與安卓進行通信的方式-Java-Android-昆明微程軟體