首页 > 解决方案 > 预期 HTTP 101 响应,但在尝试连接 echo/websocket 时为“200 OK”

问题描述

我正在开发一个用本机 Java 编写的 android 应用程序。我在这个应用程序中使用服务器,所以我正在使用 WebSockets。我收到此错误

java.net.ProtocolException: Expected HTTP 101 response but was '200 OK'

在尝试连接到 ws://echo.websocket.org 时,我不知道为什么。我是使用 WebSockets 的新手,所以我真的迷路了。

那是我尝试建立连接的活动。重要的部分在 InitiateSocketConnection() 函数中

    package com.example.rockpaperscissors;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;

public class Loby extends AppCompatActivity {


private String name;
private WebSocket webSocket;
private String Server_Path = "ws://echo.websocket.org";
private RecyclerView recyclerView;
private PlayersAdapter playersAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_loby);

    name = getIntent().getStringExtra("name");
    InitiateSocketConnection();
    
}

private void InitiateSocketConnection() {

    OkHttpClient client = new OkHttpClient().newBuilder().build();
    Request request = new Request.Builder().url(Server_Path).build();
    webSocket = client.newWebSocket(request,new Socket_Listener());

    client.dispatcher().executorService().shutdown();
}

private class Socket_Listener extends WebSocketListener
{
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
        super.onOpen(webSocket, response);
        runOnUiThread(()->
        {
            Toast.makeText(Loby.this,"Socket connected successfully!",Toast.LENGTH_LONG).show();
            initializeView();
        });
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
        super.onMessage(webSocket, text);
    }

    @Override
    public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {
        super.onFailure(webSocket, t, response);
        runOnUiThread(()->
        {
            Throwable err = t;
            Toast.makeText(Loby.this, "Socket was not connected!", Toast.LENGTH_LONG).show();
        });
    }
}

private void initializeView() {
    recyclerView = findViewById(R.id.name_list);
    playersAdapter = new PlayersAdapter(getLayoutInflater());
    recyclerView.setAdapter(playersAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put("name",name);
        playersAdapter.addItem(jsonObject);

        webSocket.send(jsonObject.toString());

    } catch (JSONException e) {
        e.printStackTrace();
    }
}

}

我认为这不是问题,但我允许在清单中使用互联网,这是我在 build.Gradle 上的相关植入:

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

谢谢!

标签: android-studiowebsocketjava-websocket

解决方案


推荐阅读