使用OkHttp3之Websocket实现长连接

本文详细介绍了使用OkHttp库在Android应用中实现WebSocket连接的方法,包括配置OkHttpClient、创建WebSocket请求、监听WebSocket事件及发送消息的完整流程。通过示例代码展示了如何在MainActivity中设置按钮触发连接,并处理连接状态变化、接收消息及发送心跳包。

 

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

compile 'com.squareup.okhttp3:mockwebserver:3.8.1'

布局文件

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.yinzhendong.websocket.MainActivity">

<ScrollView

android:layout_width="match_parent"

android:layout_height="wrap_content">

<LinearLayout

android:layout_marginLeft="20dp"

android:layout_marginRight="20dp"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

android:orientation="vertical">

<Button

android:id="@+id/start"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="10dp"

android:text="连接"

android:textSize="17sp"/>

 

<TextView

android:id="@+id/output"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="10dp"

android:textSize="16sp"/>

</LinearLayout>

</ScrollView>

 

</RelativeLayout>

MainActivity.java


 

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private Button btnStart;

private TextView tvOutput;

private WebSocket mSocket;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btnStart = (Button) findViewById(R.id.start);

tvOutput = (TextView) findViewById(R.id.output);

btnStart.setOnClickListener(this);

}

 

private void start() {

OkHttpClient mOkHttpClient = new OkHttpClient.Builder()

.readTimeout(3, TimeUnit.SECONDS)//设置读取超时时间

.writeTimeout(3, TimeUnit.SECONDS)//设置写的超时时间

.connectTimeout(3, TimeUnit.SECONDS)//设置连接超时时间

.build();

 

Request request = new Request.Builder().url(https://blog.csdn.net/"ws://echo.websocket.org").build();

EchoWebSocketListener socketListener = new EchoWebSocketListener();

mOkHttpClient.newWebSocket(request, socketListener);

mOkHttpClient.dispatcher().executorService().shutdown();

}

 

/**

* @param v The view that was clicked.

*/

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.start://开始连接

start();

break;

}

}

private final class EchoWebSocketListener extends WebSocketListener {

@Override

public void onOpen(WebSocket webSocket, Response response) {

super.onOpen(webSocket, response);

mSocket = webSocket;

String openid = "1";

//连接成功后,发送登录信息

String message = "{\"type\":\"login\",\"user_id\":\""+openid+"\"}";

mSocket.send(message);

output("连接成功!");

 

}

 

@Override

public void onMessage(WebSocket webSocket, ByteString bytes) {

super.onMessage(webSocket, bytes);

output("receive bytes:" + bytes.hex());

}

 

@Override

public void onMessage(WebSocket webSocket, String text) {

super.onMessage(webSocket, text);

output("receive text:" + text);

//收到服务器端发送来的信息后,每隔25秒发送一次心跳包

final String message = "{\"type\":\"heartbeat\",\"user_id\":\"heartbeat\"}";

Timer timer = new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

mSocket.send(message);

}

},25000);

}

 

@Override

public void onClosed(WebSocket webSocket, int code, String reason) {

super.onClosed(webSocket, code, reason);

output("closed:" + reason);

}

 

@Override

public void onClosing(WebSocket webSocket, int code, String reason) {

super.onClosing(webSocket, code, reason);

output("closing:" + reason);

}

 

@Override

public void onFailure(WebSocket webSocket, Throwable t, Response response) {

super.onFailure(webSocket, t, response);

output("failure:" + t.getMessage());

}

}

private void output(final String text) {

runOnUiThread(new Runnable() {

@Override

public void run() {

tvOutput.setText(tvOutput.getText().toString() + "\n\n" + text);

}

});

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值