You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 06:24:03