OkHttp3 websocket
使用OkHttp3之Websocket实现长连接
这个发图片也没成功,发字符是可以的。
首先在在build.gradle中添加对Okhttp的支持
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("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);
-
-
}
-
-
});
-
-
}
-
-
}
文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/103594260
- 点赞
- 收藏
- 关注作者
评论(0)