最通俗易懂的使用OkHttp进行WebSocket连接教程:上来直接撸代码
2017-07-19 22:25
537 查看
最近在项目中需要用到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. 运行程序,点击按钮,最终结果如下:
这就说明我们整个流程走通了。关于OkHttp中使用WebSocket的详细说明见下一篇博客(译文)。
本文参考文章: http://www.ssaurel.com/blog/learn-to-use-websockets-on-android-with-okhttp/
相关文章推荐
- 最通俗易懂的使用OkHttp进行WebSocket连接教程:上来直接撸代码
- 在MySQL中使用JOIN语句进行连接操作的详细教程
- .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
- STM32使用TCP透传方式与ONENET进行连接的简单教程
- .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
- 使用VisualStudio2010连接CodePlex进行代码管理
- Springboot下使用WebSocket和浏览器进行长连接通信
- asp.net连接sql2005,cs文件里直接书写的代码,纯手工操作,不在web.config里面进行配置。
- 不要直接使用select * from a,b 因为,原来自动进行了内连接
- appium使用教程(----连接手机进行app操作------)
- 使用Eclipse插件EGit进行Git代码托管和协同开发教程
- 使用Weka进行数据挖掘(Weka教程一)Weka初识之在你的代码中使用Weka
- 安装Linux教程和使用putty进行远程连接
- 使用OkHttp包在Android中进行HTTP头处理的教程
- 使用VisualStudio2010连接CodePlex进行代码管理
- html使用canvas进行图片压缩上传 (废话不说直接贴代码,不懂的话在讨论)
- 在MySQL中使用JOIN语句进行连接操作的详细教程
- 使用OkHttp之Websocket实现长连接
- 使用代理的代码,直接插如到get和post代码即可
- MyPage从Page派生,MyPage总有一个Label控件。以便以后从MyPage派生的页都可以直接使用Label?给个代码例子看看?