【问题标题】:Android Studio Socket.io disconnecting and reconnecting every few secondsAndroid Studio Socket.io 每隔几秒就会断开连接并重新连接
【发布时间】:2022-03-15 17:27:57
【问题描述】:

我现在有一个设置,我正在运行一个烧瓶服务器,它处理安卓手机和树莓派 node.js socket.io 客户端之间的 websocket 通信。 android socket.io 可以连接到烧瓶服务器,node.js 客户端可以连接,并且我可以在所有 3 之间发出消息,但是我的 android studio socket.io 客户端每 5-10 秒断开连接并重新连接。即使我离开导致它连接的活动,它也会继续这样做,它会不断地连接和断开与服务器的连接。这是android studio中的Java代码:

import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;


public class ControlPage extends AppCompatActivity {
    Button greenButton;
    Button redButton;
    private Socket mSocket; {
        try {
            mSocket = IO.socket("http://192.168.1.2:5000");
        } catch (URISyntaxException e) {}
    }
    //private EditText mInputMessageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_control_page);
        mSocket.connect();
        mSocket.on(Socket.EVENT_CONNECT, onConnect);
        greenButton = (Button) findViewById(R.id.sendButtonGreen);
        greenButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                attemptSendGreen();
            }
        });
        redButton = (Button) findViewById(R.id.sendButtonRed);
        redButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                attemptSendRed();
            }
        });
    }

我的烧瓶代码中的服务器端:

import flask
from flask_socketio import SocketIO, emit
from flask import request
import json

app = flask.Flask(__name__)
socketio = SocketIO(app)
clients = {}
sessions = {}

@app.route('/')
def hello():
    return "<h1> Hello World! </h1>"
    
@socketio.on('connect')
def testConnect():
    print('connected')
    emit('connected')

    
@socketio.on('disconnect')
def testDisconnect():
    userSID = request.sid
    print('disconnected ' + str(userSID))
    UserID = sessions[str(userSID)][0]
    UserType = sessions[str(userSID)][1]
    clients[UserID][UserType]=''
    sessions.pop(str(userSID))
        
@socketio.on('config')
def handle_config(data):
    print('received message: ' + str(data)+ str(type(data)))
    userSID = request.sid
    if type(data) == str:
        jsonData = eval(data)
    else:
        jsonData = data
    print(userSID)
    if jsonData['USER_KEY'] in clients:
        clients[jsonData['USER_KEY']][jsonData['USER_TYPE']]=userSID
    else:
        clients[jsonData['USER_KEY']] = {'USER':'',
                                     'HARDWARE':''}
        clients[jsonData['USER_KEY']][jsonData['USER_TYPE']]=userSID
    sessions[str(userSID)] = [jsonData['USER_KEY'], jsonData['USER_TYPE']]

@socketio.on('transfer')
def transfer(data):
    jsonData = eval(data)
    print(jsonData)
    UserID = jsonData['USER_KEY']
    UserType = jsonData['USER_TYPE']
    color = jsonData['MESSAGE']
    #message = data['MESSAGE']
    message = {'COLOR': color,
               'STATE': 1
        }
    jsonMessage = json.dumps(message)
    
    if UserType == 'USER':
        transferID = clients[UserID]['HARDWARE']
    else: 
        transferID = clients[UserID]['USER']
    emit('serverTransfer', jsonMessage, to=transferID)

socketio.run(app,host='192.168.1.2',port='5000') #remove this line when using gunicorn deployment

服务器端的一切都与我的 node.js 客户端一起正常工作,所以我认为问题不在于服务器。

这是我从服务器返回的信息,显示 android 客户端每隔几秒就会断开连接并重新连接:

WebSocket transport not available. Install eventlet or gevent and gevent-websocket for improved performance.
 * Serving Flask app "websocketTest" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://192.168.1.2:5000/ (Press CTRL+C to quit)
192.168.1.5 - - [18/Apr/2021 18:15:23] "GET /socket.io/?EIO=4&transport=polling HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:23] "POST /socket.io/?EIO=4&transport=polling&sid=mO35rQ0Mi_5ZxYFXAAAA HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:23] "GET /socket.io/?EIO=4&transport=polling&sid=mO35rQ0Mi_5ZxYFXAAAA HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:23] "POST /socket.io/?EIO=4&transport=polling&sid=mO35rQ0Mi_5ZxYFXAAAA HTTP/1.1" 200 -
connected
received message: { "USER_KEY": "TEST_USER", "MESSAGE": "asdfasdfasdf", "USER_TYPE":"USER"}<class 'str'>
6pKGg55-qcP9rejgAAAB
192.168.1.5 - - [18/Apr/2021 18:15:33] "POST /socket.io/?EIO=4&transport=polling&sid=mO35rQ0Mi_5ZxYFXAAAA HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:33] "GET /socket.io/?EIO=4&transport=polling&sid=mO35rQ0Mi_5ZxYFXAAAA HTTP/1.1" 200 -
disconnected6pKGg55-qcP9rejgAAAB
192.168.1.6 - - [18/Apr/2021 18:15:33] "GET /socket.io/?EIO=4&transport=polling&t=NZdidCS&b64=1 HTTP/1.1" 200 -
192.168.1.6 - - [18/Apr/2021 18:15:34] "POST /socket.io/?EIO=4&transport=polling&t=NZdidEm&b64=1&sid=6pJ6UIkNrvOanjMwAAAC HTTP/1.1" 200 -
192.168.1.6 - - [18/Apr/2021 18:15:34] "GET /socket.io/?EIO=4&transport=polling&t=NZdidEx&b64=1&sid=6pJ6UIkNrvOanjMwAAAC HTTP/1.1" 200 -
192.168.1.6 - - [18/Apr/2021 18:15:34] "POST /socket.io/?EIO=4&transport=polling&t=NZdidFW&b64=1&sid=6pJ6UIkNrvOanjMwAAAC HTTP/1.1" 200 -
192.168.1.6 - - [18/Apr/2021 18:15:34] "POST /socket.io/?EIO=4&transport=polling&t=NZdidFx&b64=1&sid=6pJ6UIkNrvOanjMwAAAC HTTP/1.1" 200 -
connected
received message: {'USER_KEY': 'TEST_USER', 'USER_TYPE': 'HARDWARE'}<class 'dict'>
1nrEBb6Xny3dpELEAAAD
192.168.1.5 - - [18/Apr/2021 18:15:35] "GET /socket.io/?EIO=4&transport=polling HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:35] "POST /socket.io/?EIO=4&transport=polling&sid=Vo6Qo1Suk5U6dnG0AAAE HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:35] "GET /socket.io/?EIO=4&transport=polling&sid=Vo6Qo1Suk5U6dnG0AAAE HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:35] "POST /socket.io/?EIO=4&transport=polling&sid=Vo6Qo1Suk5U6dnG0AAAE HTTP/1.1" 200 -
connected
received message: { "USER_KEY": "TEST_USER", "MESSAGE": "asdfasdfasdf", "USER_TYPE":"USER"}<class 'str'>
85Gy1EZr-XWm32-6AAAF
192.168.1.5 - - [18/Apr/2021 18:15:39] "POST /socket.io/?EIO=4&transport=polling&sid=Vo6Qo1Suk5U6dnG0AAAE HTTP/1.1" 200 -
192.168.1.6 - - [18/Apr/2021 18:15:39] "GET /socket.io/?EIO=4&transport=polling&t=NZdidFj&b64=1&sid=6pJ6UIkNrvOanjMwAAAC HTTP/1.1" 200 -
{'USER_KEY': 'TEST_USER', 'MESSAGE': 'GREEN', 'USER_TYPE': 'USER'}
192.168.1.6 - - [18/Apr/2021 18:15:40] "GET /socket.io/?EIO=4&transport=polling&t=NZdieaT&b64=1&sid=6pJ6UIkNrvOanjMwAAAC HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:40] "POST /socket.io/?EIO=4&transport=polling&sid=Vo6Qo1Suk5U6dnG0AAAE HTTP/1.1" 200 -
{'USER_KEY': 'TEST_USER', 'MESSAGE': 'GREEN', 'USER_TYPE': 'USER'}
192.168.1.5 - - [18/Apr/2021 18:15:41] "POST /socket.io/?EIO=4&transport=polling&sid=Vo6Qo1Suk5U6dnG0AAAE HTTP/1.1" 200 -
192.168.1.6 - - [18/Apr/2021 18:15:41] "GET /socket.io/?EIO=4&transport=polling&t=NZdiejT&b64=1&sid=6pJ6UIkNrvOanjMwAAAC HTTP/1.1" 200 -
{'USER_KEY': 'TEST_USER', 'MESSAGE': 'RED', 'USER_TYPE': 'USER'}
192.168.1.5 - - [18/Apr/2021 18:15:42] "POST /socket.io/?EIO=4&transport=polling&sid=Vo6Qo1Suk5U6dnG0AAAE HTTP/1.1" 200 -
192.168.1.6 - - [18/Apr/2021 18:15:42] "GET /socket.io/?EIO=4&transport=polling&t=NZdif2X&b64=1&sid=6pJ6UIkNrvOanjMwAAAC HTTP/1.1" 200 -
{'USER_KEY': 'TEST_USER', 'MESSAGE': 'RED', 'USER_TYPE': 'USER'}
192.168.1.5 - - [18/Apr/2021 18:15:45] "POST /socket.io/?EIO=4&transport=polling&sid=Vo6Qo1Suk5U6dnG0AAAE HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:45] "GET /socket.io/?EIO=4&transport=polling&sid=Vo6Qo1Suk5U6dnG0AAAE HTTP/1.1" 200 -
disconnected85Gy1EZr-XWm32-6AAAF
192.168.1.5 - - [18/Apr/2021 18:15:47] "GET /socket.io/?EIO=4&transport=polling HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:47] "POST /socket.io/?EIO=4&transport=polling&sid=Axb2tK8BaYqGqrgGAAAG HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:47] "GET /socket.io/?EIO=4&transport=polling&sid=Axb2tK8BaYqGqrgGAAAG HTTP/1.1" 200 -
192.168.1.5 - - [18/Apr/2021 18:15:47] "POST /socket.io/?EIO=4&transport=polling&sid=Axb2tK8BaYqGqrgGAAAG HTTP/1.1" 200 -
connected
received message: { "USER_KEY": "TEST_USER", "MESSAGE": "asdfasdfasdf", "USER_TYPE":"USER"}<class 'str'>
RLGgcjYRr3G8437zAAAH
192.168.1.6 - - [18/Apr/2021 18:15:58] "GET /socket.io/?EIO=4&transport=polling&t=NZdifE4&b64=1&sid=6pJ6UIkNrvOanjMwAAAC HTTP/1.1" 200 -
disconnected1nrEBb6Xny3dpELEAAAD
192.168.1.5 - - [18/Apr/2021 18:16:12] "GET /socket.io/?EIO=4&transport=polling&sid=Axb2tK8BaYqGqrgGAAAG HTTP/1.1" 200 -
disconnectedRLGgcjYRr3G8437zAAAH

我用来在 Java 中处理我的 socket.io 的库被导入为:

    implementation ('io.socket:socket.io-client:2.0.0') {
        exclude group: 'org.json', module: 'json'
    }

如果能深入了解导致我的 android 客户端断开连接的原因,我们将不胜感激。

更新: 当我在端口 80 上的 Nginx、gunicorn、flask 堆栈中以部署状态运行我的服务器时,此问题就消失了。仅当直接在端口 5000 上运行 flask 时,此问题仍然存在。

【问题讨论】:

  • 请问你解决了吗?

标签: java android-studio flask socket.io


【解决方案1】:

有点晚了,但如果这对某人有帮助的话。

我认为您处于轮询模式。

文档中的机制: https://socket.io/docs/v3/how-it-works/#upgrade-mechanism

您必须设置传输模式:(在 Kotlin 中)

val opts = IO.Options()
opts.transports = arrayOf(WebSocket.NAME)
socket = IO.socket("url", opts)

WebSocket.NAME 意思是“websocket”

【讨论】:

  • 使用https服务器时不起作用
  • Https 或 http 在我看来与套接字配置无关。两者都对我有用,而无需更改套接字的选项。
  • 我尝试使用 Polling 和 socket io 自动断开并重新连接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多