Socket.IO-client.java反复断开并重新连接
我正在为我的android项目使用节点服务器上的和1.2.1,android套接字与服务器连接良好,但几分钟后,它会自动断开连接并重复重新连接。我想不出这个问题,有人能帮我吗 我正在使用socket.io-client-0.1.1.jar、engine.io-client-0.2.1.jar和Java-WebSocket-1.3.0.jar库 下面是java代码Socket.IO-client.java反复断开并重新连接,java,android,websocket,socket.io,socket.io-1.0,Java,Android,Websocket,Socket.io,Socket.io 1.0,我正在为我的android项目使用节点服务器上的和1.2.1,android套接字与服务器连接良好,但几分钟后,它会自动断开连接并重复重新连接。我想不出这个问题,有人能帮我吗 我正在使用socket.io-client-0.1.1.jar、engine.io-client-0.2.1.jar和Java-WebSocket-1.3.0.jar库 下面是java代码 private void socketTest() throws URISyntaxException{ socket =
private void socketTest() throws URISyntaxException{
socket = IO.socket("http://192.168.169.2:8082");
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
socket.emit("test", "awesome");
}
}).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {}
});
socket.connect();
}
这是服务器端代码
io.on('connection', function (socket) {
console.log('a user connected');
socket.on('disconnect', function () {
console.log('user disconnected');
});
socket.on('test',function(msg){
console.log("This is "+msg);
});
});
这是日志截图
我在Android项目中的
socket.io客户端:1.0.0
客户端库上遇到了同样的问题,但在降级后,socket.io
版本工作正常。下面使用的客户端版本可能会对您有所帮助
compile('io.socket:socket.io-client:0.8.3') {
exclude group: 'org.json', module: 'json'
}
我通过向socket.io添加一个带有无限超时的选项来解决这个问题
IO.Options options = new IO.Options();
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
.connectTimeout(0, TimeUnit.MILLISECONDS)
.readTimeout(0, TimeUnit.MILLISECONDS)
.writeTimeout(0, TimeUnit.MILLISECONDS);
options.callFactory = clientBuilder.build();
socket = IO.socket(URL, options);
对我来说,问题是我在服务器端(Flask)错误地使用了Socket.IO,并且在后台使用了HTTP长轮询,而不是WebSocket。事实证明,Flask webserver不支持WebSocket,所以我不得不使用
eventlet
WSGI服务器:
run.py
from myapp import create_app, socketio
import eventlet
eventlet.monkey_patch()
config = 'config.py'
app = create_app(config)
if __name__ == '__main__':
socketio.run(app)
from flask_jwt_extended import JWTManager
...
from flask_socketio import SocketIO
jwt = JWTManager()
...
socketio = SocketIO(logger=True, async_mode='eventlet')
import eventlet
from eventlet import wsgi
from myapp.extensions import jwt, socketio
def create_app(config_filename):
app = Flask(__name__, instance_relative_config=True)
app.config.from_pyfile(f"../{config_filename}")
app.config.from_pyfile(config_filename)
register_extensions(app)
wsgi.server(eventlet.listen(('', 5000)), app)
def register_extensions(app):
socketio.init_app(app)
extensions.py
from myapp import create_app, socketio
import eventlet
eventlet.monkey_patch()
config = 'config.py'
app = create_app(config)
if __name__ == '__main__':
socketio.run(app)
from flask_jwt_extended import JWTManager
...
from flask_socketio import SocketIO
jwt = JWTManager()
...
socketio = SocketIO(logger=True, async_mode='eventlet')
import eventlet
from eventlet import wsgi
from myapp.extensions import jwt, socketio
def create_app(config_filename):
app = Flask(__name__, instance_relative_config=True)
app.config.from_pyfile(f"../{config_filename}")
app.config.from_pyfile(config_filename)
register_extensions(app)
wsgi.server(eventlet.listen(('', 5000)), app)
def register_extensions(app):
socketio.init_app(app)
\uuuu init\uuuuu.py
from myapp import create_app, socketio
import eventlet
eventlet.monkey_patch()
config = 'config.py'
app = create_app(config)
if __name__ == '__main__':
socketio.run(app)
from flask_jwt_extended import JWTManager
...
from flask_socketio import SocketIO
jwt = JWTManager()
...
socketio = SocketIO(logger=True, async_mode='eventlet')
import eventlet
from eventlet import wsgi
from myapp.extensions import jwt, socketio
def create_app(config_filename):
app = Flask(__name__, instance_relative_config=True)
app.config.from_pyfile(f"../{config_filename}")
app.config.from_pyfile(config_filename)
register_extensions(app)
wsgi.server(eventlet.listen(('', 5000)), app)
def register_extensions(app):
socketio.init_app(app)
在客户端:
class MessagesRepository @Inject constructor(
private val prefs: SharedPreferences
) {
private val options = IO.Options.builder()
.setTransports(arrayOf(WebSocket.NAME))
.setExtraHeaders(
mapOf("Authorization" to listOf(prefs.getString(ACCESS_TOKEN, "")),
"Content-type" to listOf("application/json")))
.build()
private val socket = IO.socket(getBaseUrlForCurrentDevice(), options)
}
这有一个解决办法。参考Hello,面对同样的问题..降级后我收到“xhr轮询错误”,这对我来说很有效,但会有什么影响。。为什么会出现这种错误