最通俗易懂的使用OkHttp进行WebSocket连接教程:上来直接撸代码

本篇为转载!
原文出自我家豪哥的博客【还是choubuyao脸的称呼】]
http://blog.csdn.net/xlh1191860939/article/details/75452342

最近在项目中需要用到WebSocket来处理持续连接(persistent connection)。以前在Android端只使用过Java原生的Socket但没有使用过WebSocket,只知道OkHttp支持WebSocket。上网一搜,有些不是api太旧就是长篇大论不知所云,最终还是从国外两篇博客中得到了启发,:一篇是通过例子直接介绍使用,我决定先把这篇博客分享给大家,直接上手;另一篇博客的将以译文的形式呈现给大家。

1. 新建项目,并在项目中添加OkHttp依赖:

compile ‘com.squareup.okhttp3:okhttp:3.8.1’

这里注意一点,okhttp是3.5以后才添加对WebSocket的支持,以前都是提供了扩展库okhttp-ws,建议使用3.5以上版本。

2. 添加网络权限

<uses-permission  android:name="android.permission.INTERNET" />

3. 在MainActivity的布局中添加如下代码:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
    android:id="@+id/start"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="start"
    android:textSize="16sp" />

    <TextView
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

    </LinearLayout>

点击这个Button就建立连接,然后服务器返回的消息都显示在下面的TextView上。

4. 然后就是常见的初始化控件,设置监听:

public class MainActivity extends AppCompatActivity {

private Button start;
private TextView text;

@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);

    start.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
    }
});
}

5. 创建一个类,继承OkHttp中的抽象类WebSocketListener(这里为了方便就此类作为MainActivity的成员内部类):

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());
}
}
  • 重写了WebSocketListener中的几个方法,这几个方法很好理解,是用来异步回调的,这里简单说一下:onOpen当WebSocket和远程建立连接时回调;两个onMessage就是接收到消息时回调,只是消息内容的类型不同;onClosing是当远程端暗示没有数据交互时回调(即此时准备关闭,但连接还没有关闭);onClosed就是当连接已经释放的时候被回调;onFailure当然是失败时被回调(包括连接失败,发送失败等)。

  • output方法的实现如下:

    private void output(final String content) {

    runOnUiThread(new Runnable() {
    @Override
    public void run() {
    text.setText(text.getText().toString() + content + “\n”);
    }
    });
    }

照着做,就是在TextView上显示相关内容。具体后面一篇博文有相关解释。

  • WebSocket的几个方法:
    send用来发送消息;close用来关闭连接。不多说。

6. 处理start按钮的点击事件的逻辑,在这里调用自定义connect方法:

start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
    connect();
}
});

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();
}

这里吐槽一下:就是这里的url,之前由于公司服务器那边还没处理好应对WebSocket连接,差点都自己搭服务器了,后来发现WebSocket官网就提供了相应url可以测试。

7. 运行程序,点击按钮,最终结果如下:
这里写图片描述

本文参考文章:
http://www.ssaurel.com/blog/learn-to-use-websockets-on-android-with-okhttp/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值