日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

android okhttpclient设置编码,Android之okhttp实现socket通讯(非原创)

發(fā)布時(shí)間:2024/7/19 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android okhttpclient设置编码,Android之okhttp实现socket通讯(非原创) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章大綱

一、okhttp基礎(chǔ)介紹二、socket通訊代碼實(shí)戰(zhàn)三、項(xiàng)目源碼下載四、參考文章

一、okhttp基礎(chǔ)介紹

二、socket通訊代碼實(shí)戰(zhàn)

1. 添加依賴和權(quán)限

app的build.gradle下添加okhttp依賴

implementation 'com.squareup.okhttp3:okhttp:3.8.1'

AndroidManifest.xml文件添加網(wǎng)絡(luò)權(quán)限

2. 添加布局文件

activity_main.xml文件中代碼如下:

android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

3. MainActivity邏輯實(shí)現(xiàn)

package aidl_customer.com.wj.http_socket;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button; import android.widget.TextView; import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.WebSocket; import okhttp3.WebSocketListener; import okio.ByteString; /** * okhttp是3.5以后才添加對WebSocket的支持 */ public class MainActivity extends AppCompatActivity { private Button start; private TextView text; private Button start2; private TextView text2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); start = (Button) findViewById(R.id.start); text = (TextView) findViewById(R.id.text); start2 = (Button) findViewById(R.id.start2); text2 = (TextView) findViewById(R.id.text2); start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { connect(); } }); start2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { OkHttpClient client = new OkHttpClient.Builder() .readTimeout(3, TimeUnit.SECONDS) .build(); Request request = new Request.Builder() .url("ws://echo.websocket.org") .build(); WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() { @Override public void onOpen(WebSocket webSocket, Response response) { super.onOpen(webSocket, response); } @Override public void onMessage(WebSocket webSocket, String text) { super.onMessage(webSocket, text); } @Override public void onMessage(WebSocket webSocket, ByteString bytes) { super.onMessage(webSocket, bytes); } @Override public void onClosing(WebSocket webSocket, int code, String reason) { super.onClosing(webSocket, code, reason); } @Override public void onClosed(WebSocket webSocket, int code, String reason) { super.onClosed(webSocket, code, reason); } @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { super.onFailure(webSocket, t, response); } }); } }); } /** *WebSocket官網(wǎng)就提供了相應(yīng)url可以測試 */ private void connect() { //建立連接 EchoWebSocketListener listener = new EchoWebSocketListener(); Request request = new Request.Builder() .url("ws://echo.websocket.org") .build(); OkHttpClient client = new OkHttpClient(); client.newWebSocket(request, listener); client.dispatcher().executorService().shutdown(); } /** * 重寫了WebSocketListener中的幾個(gè)方法,這幾個(gè)方法很好理解,是用來異步回調(diào)的, * 這里簡單說一下:onOpen當(dāng)WebSocket和遠(yuǎn)程建立連接時(shí)回調(diào);兩個(gè)onMessage就是接收到消息時(shí)回調(diào), * 只是消息內(nèi)容的類型不同;onClosing是當(dāng)遠(yuǎn)程端暗示沒有數(shù)據(jù)交互時(shí)回調(diào)(即此時(shí)準(zhǔn)備關(guān)閉,但連接還沒有關(guān)閉); * onClosed就是當(dāng)連接已經(jīng)釋放的時(shí)候被回調(diào);onFailure當(dāng)然是失敗時(shí)被回調(diào)(包括連接失敗,發(fā)送失敗等)。 * * send用來發(fā)送消息;close用來關(guān)閉連接 */ private final class EchoWebSocketListener extends WebSocketListener { @Override public void onOpen(WebSocket webSocket, Response response) { webSocket.send("hello world"); webSocket.send("welcome"); webSocket.send(ByteString.decodeHex("adef")); webSocket.close(1000, "再見"); } @Override public void onMessage(WebSocket webSocket, String text) { output("onMessage: " + text); } @Override public void onMessage(WebSocket webSocket, ByteString bytes) { output("onMessage byteString: " + bytes); } @Override public void onClosing(WebSocket webSocket, int code, String reason) { webSocket.close(1000, null); output("onClosing: " + code + "/" + reason); } @Override public void onClosed(WebSocket webSocket, int code, String reason) { output("onClosed: " + code + "/" + reason); } @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { output("onFailure: " + t.getMessage()); } } private void output(final String content) { runOnUiThread(new Runnable() { @Override public void run() { text.setText(text.getText().toString() + content + "n"); } }); } }

溫馨提示:(1)EchoWebSocketListener繼承OkHttp中的抽象類WebSocketListener,重寫了幾個(gè)方法,是用來異步回調(diào)的,這里簡單說一下:onOpen當(dāng)WebSocket和遠(yuǎn)程建立連接時(shí)回調(diào);兩個(gè)onMessage就是接收到消息時(shí)回調(diào),只是消息內(nèi)容的類型不同;onClosing是當(dāng)遠(yuǎn)程端暗示沒有數(shù)據(jù)交互時(shí)回調(diào)(即此時(shí)準(zhǔn)備關(guān)閉,但連接還沒有關(guān)閉);onClosed就是當(dāng)連接已經(jīng)釋放的時(shí)候被回調(diào);onFailure當(dāng)然是失敗時(shí)被回調(diào)(包括連接失敗,發(fā)送失敗等)。(2)send用來發(fā)送消息;close用來關(guān)閉連接(3)WebSocket官網(wǎng)就提供了相應(yīng)url可以測試,測試地址為:ws://echo.websocket.org(4)關(guān)閉連接方式,OkHttp提供兩個(gè)方法來關(guān)閉連接:??1)close webSocket.close(0, “bye”);請求服務(wù)器優(yōu)雅地關(guān)閉連接然后等待確認(rèn)。在關(guān)閉之前,所有已經(jīng)在隊(duì)列中的消息將被傳送完畢。 既然涉及到交互,那么socket可能不會立即關(guān)閉。如果初始化和關(guān)閉連接是和Activity的生命周期綁定的(比如onPause/onResume),有一些消息可能是在close被調(diào)用之后接收到,所以這需要小心去處理。??2)cancel;cancel更加殘忍:它會丟棄所有已經(jīng)在隊(duì)列中的消息然后殘忍地關(guān)閉socket。這樣也有優(yōu)點(diǎn):不必等待家政(housekeeping)和已在隊(duì)列中消息的傳送。然而,選擇cancel還是close取決于使用場景。

4. 項(xiàng)目運(yùn)行與訪問

安裝apk后,運(yùn)行主頁面如下:

點(diǎn)擊START按鈕,出現(xiàn)以下結(jié)果

三、項(xiàng)目源碼下載

四、參考文章

總結(jié)

以上是生活随笔為你收集整理的android okhttpclient设置编码,Android之okhttp实现socket通讯(非原创)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。