Android 在连接 Socket 时出现错误

2024-05-05

在阅读了一些express.io文档并成功连接到之后,我尝试使用nodejs和express.io编写简单的应用程序http://chat.socket.io在命令行中运行下面的代码并打开后,我找到了使用 nodejs 和express.io 创建服务器端的简单示例http://localhost:3000在浏览器中我没有收到任何错误,我找不到任何关于编码的好文档http://chat.socket.io服务器,现在我想尝试使用示例从 Android 客户端向服务器发送请求,但出现连接错误:

Error:

CONNECTION ERROR

服务器.js:

// Setup basic express server
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('../..')(server);
var port = process.env.PORT || 3000;

server.listen(port, function () {
  console.log('Server listening at port %d', port);
});

// Routing
app.use(express.static(__dirname + '/public'));

// Chatroom

// usernames which are currently connected to the chat
var usernames = {};
var numUsers = 0;

io.on('connection', function (socket) {
  var addedUser = false;

  // when the client emits 'new message', this listens and executes
  socket.on('new message', function (data) {
    // we tell the client to execute 'new message'
    socket.broadcast.emit('new message', {
      username: socket.username,
      message: data
    });
  });

  // when the client emits 'add user', this listens and executes
  socket.on('add user', function (username) {
    // we store the username in the socket session for this client
    socket.username = username;
    // add the client's username to the global list
    usernames[username] = username;
    ++numUsers;
    addedUser = true;
    socket.emit('login', {
      numUsers: numUsers
    });
    // echo globally (all clients) that a person has connected
    socket.broadcast.emit('user joined', {
      username: socket.username,
      numUsers: numUsers
    });
  });

  // when the client emits 'typing', we broadcast it to others
  socket.on('typing', function () {
    socket.broadcast.emit('typing', {
      username: socket.username
    });
  });

  // when the client emits 'stop typing', we broadcast it to others
  socket.on('stop typing', function () {
    socket.broadcast.emit('stop typing', {
      username: socket.username
    });
  });

  // when the user disconnects.. perform this
  socket.on('disconnect', function () {
    // remove the username from global usernames list
    if (addedUser) {
      delete usernames[socket.username];
      --numUsers;

      // echo globally that this client has left
      socket.broadcast.emit('user left', {
        username: socket.username,
        numUsers: numUsers
      });
    }
  });
});

我的安卓代码:

private Socket mSocket;
{
    try {
        /* connection successful to http://chat.socket.io */
        mSocket = IO.socket("http://localhost:3000");
    } catch (URISyntaxException e) {
        Log.e("Error URI", String.valueOf(e));
        throw new RuntimeException(e);
    }
}
public void onCreate(Bundle savedInstanceState) {
    ...
    mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
    mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
    mSocket.on("new message", onNewMessage);
    mSocket.on("user joined", onUserJoined);
    mSocket.on("user left", onUserLeft);
    mSocket.on("typing", onTyping);
    mSocket.on("stop typing", onStopTyping);
    mSocket.connect();
    ...

    Button signInButton = (Button) findViewById(R.id.sign_in_button);
    signInButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            attemptLogin();
        }
    });

    mSocket.on("login", onLogin);
}

private void attemptLogin() {
    mUsernameView.setError(null);
    String username = mUsernameView.getText().toString().trim();
    if (TextUtils.isEmpty(username)) {
        mUsernameView.setError(getString(R.string.error_field_required));
        mUsernameView.requestFocus();
        return;
    }

    mUsername = username;
    mSocket.emit("add user", username);
}

安卓错误:

E/AndroidRuntime﹕ FATAL EXCEPTION: EventThread
    java.lang.IllegalArgumentException: delay < 0: -432345566375051264
            at java.util.Timer.schedule(Timer.java:457)
            at com.github.nkzawa.socketio.client.Manager.reconnect(Manager.java:497)
            at com.github.nkzawa.socketio.client.Manager.access$2000(Manager.java:20)
            at com.github.nkzawa.socketio.client.Manager$8$1$1.call(Manager.java:519)
            at com.github.nkzawa.socketio.client.Manager$1$3.call(Manager.java:282)
            at com.github.nkzawa.emitter.Emitter.emit(Emitter.java:117)
            at com.github.nkzawa.engineio.client.Socket.onError(Socket.java:754)
            at com.github.nkzawa.engineio.client.Socket.access$800(Socket.java:29)
            at com.github.nkzawa.engineio.client.Socket$4.call(Socket.java:293)
            at com.github.nkzawa.emitter.Emitter.emit(Emitter.java:117)
            at com.github.nkzawa.engineio.client.Transport.onError(Transport.java:63)
            at com.github.nkzawa.engineio.client.transports.PollingXHR.access$100(PollingXHR.java:19)
            at com.github.nkzawa.engineio.client.transports.PollingXHR$6$1.run(PollingXHR.java:126)
            at com.github.nkzawa.thread.EventThread$2.run(EventThread.java:75)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:838)

我会责怪这一点:

mSocket = IO.socket("http://localhost:3000");

我假设您没有在 Android 上运行 Node.js 服务器,但可能在 PC 上运行。如果是这样,在您的 Android 上进行测试时,您将尝试在端口 3000 上连接回您的 Android 本身 - 如localhost链接到设备本身。

如果您的服务器和 Android 使用相同的本地网络,您应该检查您的 PC 的 IP 并将其替换为localhost。如果您的服务器有公共 IP,您可能想使用它。


edit

1

换句话说,根据您的评论:您的PC IP是192.168.1.5。由于这是一个内部 IP,您的 Android 设备必须连接到您的 PC 所在的同一子网,因为您可能会发生连接错误。据此,我假设你需要输入http://192.168.1.5/在 Android 的地址栏中,访问您的 PC 正在服务的页面。假设,其中一个保持不变 - 脚本“我的 Android 代码”正在您的 Android 上运行。所以而不是localhost需要一个合适的主机:192.168.1.5。无法判断您的 Android 是否阻塞了 3000 端口,但是localhost从 android 的角度来看,只要您没有在该设备上运行 Nodejs 服务器,这是不正确的。

此外,该更改可能不会在移动设备上的浏览器缓存期间临时产生影响。

2

查看您的代码,我认为使用相同用户名的用户也会遇到一些问题。是的,听起来很奇怪,但用户可能想在浏览器中打开几个选项卡,连接到同一个套接字服务器。一旦那样,你的usernames and numUsers变量会损坏。

只要应用程序是单实例专用的(例如player@game),我就会使用

usernames[username] = socket

将套接字存储在一边,能够发布跨玩家相关事件,避免迭代所有打开的套接字。

另外,出于聊天目的,您可能希望允许用户同时在几个浏览器选项卡上进行连接。通常我会这样存储所有套接字:

if (!users[user]) {
    users[user] = {
        sockets: [socket]
    };
    console.log(sprintf('[%s] [CONNECTED] User %s', Date(), user));

} else {
    users[user].sockets.push(socket);
}

你的可能会有所不同,可能会基于聊天频道等。将套接字推到侦听器旁允许我在同一节点脚本文件中运行单独的 UDP 服务器。其目的是能够通过所有打开的选项卡监视/阻止/警告单个用户,即使它们分布在两个不同的浏览器上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 在连接 Socket 时出现错误 的相关文章

  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 出现错误错误:res/menu/mainMenu.xml:文件名无效:必须仅包含[a-z0-9_。]

    我是安卓新手 刚刚开始使用 我在 res 文件夹中创建了一个文件 menu mainMenu xml 但我得到了错误 Error res menu mainMenu xml invalid file name must contain on
  • 如何在手机缓存中保存用户名和密码

    我有一个用户登录应用程序 它需要用户的电子邮件和密码 我想将电子邮件和密码保存在手机缓存中 以便用户不必再次输入 有什么办法可以将数据保存在Android缓存中吗 我认为你需要使用SharedPreference用于在设备中使用应用程序时保
  • Android onChange 事件未在 android 5 (Lollipop) 上的 chrome 历史记录的 contentObserver 中触发

    我注意到我的 chrome 历史记录和书签的 contentObservers 在 android lolipop 上不再触发 该代码在旧版本的 android 上完美运行 无论 chrome 版本如何 但在 Lollipop 上它不再运行
  • glTexImage2D: 之前出错:( 0x506 内部 0x1908 格式 0x1908 类型 0x1401

    当使用 Android Studio 运行模拟器时 我在模拟器屏幕上看不到任何内容 一切都是黑色的 我得到以下事件日志 模拟器 glTexImage2D 出错了 0x506 内部 0x1908 格式 0x1908 类型 0x1401 我已经
  • 放置在 NavigationDrawer 顶部的片段

    我正在尝试添加一个PreferenceFragment在我的应用程序中 问题是 它自动放置在我的顶部NavigationDrawer public class SetPreferenceActivity extends Activity O
  • 如何检查用户在EditText中输入自己的电话号码?

    用户将在我的 Android 应用程序的注册页面上的编辑文本中输入手机号码 如何检查用户输入的是他 她的手机号码而不是其他人的 我试过这个 TelephonyManager tMgr TelephonyManager mAppContext
  • 如何在TableLayout中创建三列

    我正在开发一个使用的屏幕TableLayout 在这里我可以轻松创建两列 但我怎样才能创建三列呢 这里有一个例子
  • 获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度

    我知道如何使用 getOrientation 方法获取手机 y 轴和磁北之间的方向角 如此处所述https developer android com guide topics sensors sensors position https
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • Mongoose 独特的验证不起作用。保存重复条目

    我正在开发一个 NodeJS 应用程序 其中express是框架 MongoDB是数据库 我正在使用猫鼬插件 我有一个父母模型 我已经添加了独特 真实到场 mobile 但是每当我添加相同的手机号码时 唯一性验证就会失败 除了保存重复的文档
  • 如何在 Viewpager 中禁用预加载下一页? [复制]

    这个问题在这里已经有答案了 如何在 Viewpager 中禁用页面预加载 I tried viewPager setOffscreenPageLimit 0 但它不起作用 用这个viewPager setOffscreenPageLimit
  • 带有 npm 启动脚本的 Nodejs 应用程序

    我对nodejs很陌生 在我的docker化环境中 我想为nodejs应用程序提供appdynamics支持 这要求每个应用程序都要求将以下内容作为其应用程序的第一行 require appdynamics profile controll
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • Android:监听状态栏通知

    有没有办法在状态栏被下拉时监听通知 1 用于检测状态栏变化 您可以注册一个监听器来获取系统UI可见性变化的通知 因此 要在您的活动中注册侦听器 Detecting if the user swipe from the top down to
  • 模块中的类无法加载

    我正在开发一个 2D Unity android 游戏 其中我最近添加了 Firebase Beta SDK 但添加后FirebaseAnalytics unitypackage我面临的错误是 无法加载模块中的类 当我删除文件夹时Fireb
  • Android:AsyncTask ProgressDialog 将不会在 ActivityGroup 中打开

    我试图在轮询我的服务器时打开一个进度对话框 该类是一个 ActivityGroup 因为它嵌套在选项卡栏中 为了将视图保持在框架内 需要 ActivityGroup 这是我的 ActivityGroup 类的声明 public class
  • 如何处理 MongoDB 的断开连接错误

    我在 Node js 进程中看到了这个未捕获的异常 Uncaught exception Error read ETIMEDOUT at TCP onStreamRead internal stream base commons js 16
  • Android 中带有组的列表视图

    我有一个列表视图 每行都有一些日期和文本 我可以像 iPhone 中那样将这个 listView 分组 组之间有标题吗 在 android 中是否可能 请帮忙 即 我需要在 Listview 行之间有标题栏 以便如果我使用日期对其进行分组
  • 如何在片段中实现 onBackPressed() 和意图?

    我知道 onBackPressed 是活动中的一种方法 但是 我想在片段中使用该功能 以便当按下后退按钮时 它会通过 Intent 重定向到另一个活动 有什么办法解决这个问题吗 public class News Events fragme

随机推荐

  • C 标准中 char 数组结构成员的对齐

    假设我想读 写 tar 文件头 考虑标准 C C89 C99 或 C11 关于填充 字符数组在结构中是否有任何特殊处理 编译器可以向这样的结构添加填充吗 struct header char name 100 char mode 8 cha
  • numpy 1.8.0 与 py2exe 打包时出现 OMP 警告

    import numpy 当我将上面一行脚本打包为使用 py2exe 的单个可执行窗口应用程序 http www py2exe org index cgi SingleFileExecutable 我在启动时收到以下警告 OMP Warni
  • 无法从PreparedStatement获取OracleSpatial Connection对象

    我正在使用 Hibernate Spatial 4 3 2 和 Hibernate 4 3 11 我的数据库是 Oracle 12c 我使用 hikariCP 作为连接池 当我使用 hikacriCP 时 我收到一个错误 似乎原因是 hib
  • JFrog Artifactory 将什么令牌端点用于其 Docker 注册表?

    我正在尝试编写基本上可以执行以下操作的代码docker inspect发布到私人 JFrog Artifactory 的图像 而无需自己实际提取图像 我一直在使用一个名为在不拉取的情况下检查 Docker 镜像 https ops tips
  • 将 numpy 数组中低于阈值 # 的数字替换为零

    所以我有一个非常大的 Numpy 数组 2560x1920 它实际上来自灰度图片 其中每个像素都被赋予一个 0 1 之间的数字 表示其亮度 我试图用零替换低于阈值 例如 0 5 的所有值 这可能是一个简单的任务 但我是 Numpy 的初学者
  • opencv 视频上的颜色阈值

    I am thresholding for a color range in an opencv video The goal is to seperate the B mode black and white information on
  • 列表项未正确删除(React)

    如果我的笔记应用程序能提供一些帮助 我将不胜感激 假设我的笔记列表中有 3 个笔记 我想删除列表顶部的注释 无论我尝试删除哪一个 总是首先删除列表最底部的注释 我检查了 React 控制台 应用程序组件状态中的注释数组表明它已正确删除 但从
  • 在 Linux 中使用仅限 CLI 的工具生成磁盘使用情况图/图表

    在这个问题中 https stackoverflow com questions 32230 tracking down where disk space has gone on linux有人询问如何在 Linux 中显示磁盘使用情况 我
  • 改变路径或细化

    我想改变a b在一个块内a c 或者甚至可能a 我这样做的正常方法是change test a b change test 1 c 但它只改变了第一部分 即a to c gt gt test c b 无法访问路径test 2 either
  • HTTP/2 世界中的 WebSocket 替代方案是什么?

    新的 HTTP 2 协议具有一些有前途的功能 他们中有一些 多路复用 单个 TCP 连接可用于发出多个 HTTP 2 请求并接收多个响应 到单个源 HTTP 2 服务器推送 将服务器响应发送到客户端而不接收请求 即由服务器发起 双向连接 H
  • Pytorch GPU 使用率低

    我正在尝试 pytorch 的例子https pytorch org tutorials beginner blitz cifar10 tutorial html https pytorch org tutorials beginner b
  • 错误:集合方法聚合是同步的

    我正在尝试以下代码 const Conn mongoose createConnection mongodb 127 0 0 1 27017 db const addresses Conn collection users aggregat
  • ASP.NET 代码表达式、数据绑定和其他声明式表达式

    这些标签有什么区别 更重要的是 如何在 ASP NET 控件中使用声明性语法显示页面属性 我正在尝试在 ASP NET 控件中执行此操作 任务是设置标签的文本 但如果我想更改输出控制 我不想以语法方式执行此操作 我收到有关服务器端控件不能包
  • ICollection / ICollection 歧义问题

    只是想进行简单的扩展句法糖 http en wikipedia org wiki Syntactic sugar public static bool IsNotEmpty this ICollection obj return obj n
  • 如何在 Android Studio 中使用 git 分支

    我是 git 新手 我有一个非常简单的使用 git 的场景 我的第一个版本是用 Android Studio 编写的 现在我想使用一些新功能 到目前为止我做了什么 在我的 Android Studio 中启用 VCS 从 Android S
  • Pathogen 不加载插件

    病原体对我不起作用 我正在遵循 Adam Lowe 发布的提示here http www adamlowe me 2009 12 vim destroys all other rails editors html 还有更多 没有任何成功 我
  • NoneType 对象不可下标

    我正在 Learnstreet 上进行一个七段显示项目 所需方法之一获取从标记为 inputString 的文本框获得的输入 然后使用将输入字符串传递给给定方法text这是一个字符串 该方法的进一步描述如下 在这个方法中 我们从输入字符串中
  • 如何在 F# 中将对象转换为泛型类型列表

    在下面的代码片段中 我的目的是将 System Object 可能是 FSharpList 转换为它所持有的任何泛型类型的列表 match o with list lt gt gt addChildList o gt list lt gt
  • 为什么 Dart 中的原生包装函数与非常轻量级的“DEFINE NATIVE ENTRY”函数相比如此重量级?

    我不明白 为什么要这样保证 这是自定义本机函数的包装器dart runtime vm native entry cc 它适用于想要编写的 Dart 程序员native extensions void NativeEntry NativeCa
  • Android 在连接 Socket 时出现错误

    在阅读了一些express io文档并成功连接到之后 我尝试使用nodejs和express io编写简单的应用程序http chat socket io在命令行中运行下面的代码并打开后 我找到了使用 nodejs 和express io