安卓Socket.IO连接Node.js服务报okhttp3.MediaType空指针异常怎么解决?
这个空指针报错是socket.io客户端与服务端版本不兼容、跨域配置缺失或OkHttp版本冲突导致的,PollingXHR请求拿到无ContentType的异常响应时就会触发该问题,可按以下步骤修复:
步骤1:对齐Socket.io服务端与客户端版本
版本不匹配是该问题的最高发原因,对应规则如下:
- 若服务端Socket.io为
2.x版本:安卓端使用io.socket:socket.io-client:1.0.x版本 - 若服务端Socket.io为
3.x/4.x版本:安卓端使用io.socket:socket.io-client:2.0+版本
你可以先查看服务端package.json文件中socket.io的依赖版本,再对应修改安卓端build.gradle(Module级别)的依赖配置。
步骤2:解决OkHttp版本冲突
老版本Socket.io客户端与新版OkHttp存在适配问题,可通过强制指定适配版OkHttp修复,以服务端2.x、客户端1.0.1版本为例:
dependencies { // 排除Socket.io自带的OkHttp依赖,避免冲突 implementation ('io.socket:socket.io-client:1.0.1') { exclude group: 'com.squareup.okhttp3', module: 'okhttp' } // 指定适配的OkHttp版本 implementation 'com.squareup.okhttp3:okhttp:3.12.12' // 其他依赖保持不变 }
步骤3:补全服务端跨域配置
当前服务端没有配置跨域规则,安卓端请求会被拦截,返回异常响应触发报错,修改服务端Socket.io初始化代码:
var io = require('socket.io')(8080, { cors: { origin: "*", methods: ["GET", "POST"] } }); var dns = require('dns'), express = require('express'), mysql = require('mysql'), interval = 2000, google = 'www.google.com'; // 其余代码保持不变 var connect = mysql.createClient({ host : 'localhost', user : 'root', password : '', database : 'database' }); io.sockets.on('connection', function (socket) { console.log('新客户端连接成功',socket.id); })
步骤4:检查安卓端基础配置
- 网络权限:确认
AndroidManifest.xml中已添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 连接地址:如果使用安卓模拟器访问本地服务端,不要用
127.0.0.1,要填http://10.0.2.2:8080;如果用真机调试,确保手机和服务端电脑在同一局域网,填电脑的局域网IP地址。
完成以上步骤后重新运行项目即可修复该问题。
内容的提问来源于stack exchange,提问作者KANAYO AUGUSTIN UG
相关产品推荐
相关产品推荐

