使用 Nodejs + SocketIO 时丢弃传输错误
Posted
技术标签:
【中文标题】使用 Nodejs + SocketIO 时丢弃传输错误【英文标题】:Discarding transport error while using Nodejs + SocketIO 【发布时间】:2013-09-14 16:14:55 【问题描述】:我正在构建一个android
聊天应用程序。我在服务器端使用nodejs
并尝试使用this 为socketIO 实现android 客户端。首先,客户端向服务器回显“hello”,然后服务器将其回显给客户端。这工作正常。现在有一个Button
,按下它时会将EditText
中的文本回显到服务器。服务器应该将文本回显给客户端。但是,一旦将文本回显到服务器,我就会在服务器端收到 Discarding transport
错误,并且没有回显任何内容。客户无法进一步回应任何内容。代码有什么问题?
服务器
var http = require('http'),fs = require('fs');
var app = http.createServer(function (req, res)
res.end();
).listen(8000, '127.0.0.1');
var io = require('socket.io').listen(app);
io.sockets.on('connection', function(socket)
socket.on('echo', function(data)
socket.emit('echoback', data);
);
);
客户
package com.jack.pri;
import java.net.MalformedURLException;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import io.socket.*;
public class MainActivity extends Activity
private SocketIO socket;
private TextView tview;
private Button btn;
private EditText tt;
private String k;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tview=(TextView) findViewById(R.id.tv);
tt = (EditText) findViewById(R.id.et);
btn = (Button) findViewById(R.id.button1);
//socket = null;
try
socket = new SocketIO("http://10.0.2.2:8000");
catch (MalformedURLException e)
// TODO Auto-generated catch block
e.printStackTrace();
socket.connect(new IOCallback()
@Override
public void on(String event, IOAcknowledge ack, Object... args)
if ("echoback".equals(event) && args.length > 0)
tview.setText(""+args[0]);
Log.e("received",""+args[0]);
@Override
public void onMessage(JSONObject json, IOAcknowledge ack)
@Override
public void onMessage(String data, IOAcknowledge ack)
@Override
public void onError(SocketIOException socketIOException) socketIOException.printStackTrace();
@Override
public void onDisconnect()
@Override
public void onConnect()
);
///
socket.emit("echo", "hello");
btn.setOnClickListener(new OnClickListener()
public void onClick(View arg0)
k=tt.getText().toString();
socket.emit("echo", k);
);
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
服务器端的错误日志
debug - client authorized
info - handshake authorized kaHbMG-lFmuFtvkFGY2W
debug - setting request GET /socket.io/1/websocket/kaHbMG-lFmuFtvkFGY2W
debug - set heartbeat interval for client kaHbMG-lFmuFtvkFGY2W
debug - client authorized for
debug - websocket writing 1::
debug - websocket writing 5:::"name":"echoback","args":["hello"]
debug - emitting heartbeat for client kaHbMG-lFmuFtvkFGY2W
debug - websocket writing 2::
debug - set heartbeat timeout for client kaHbMG-lFmuFtvkFGY2W
debug - got heartbeat packet
debug - cleared heartbeat timeout for client kaHbMG-lFmuFtvkFGY2W
debug - set heartbeat interval for client kaHbMG-lFmuFtvkFGY2W
debug - websocket writing 5:::"name":"echoback","args":["this is textbox input text"]
info - transport end (undefined)
debug - set close timeout for client kaHbMG-lFmuFtvkFGY2W
debug - cleared close timeout for client kaHbMG-lFmuFtvkFGY2W
debug - cleared heartbeat interval for client kaHbMG-lFmuFtvkFGY2W
debug - discarding transport
【问题讨论】:
我一直有那些随机丢弃传输断开连接。你的问题解决了吗? 也许您可以使用adb
检查客户端日志。或尝试engine.io。
【参考方案1】:
我认为您需要显式配置套接字 - 来自 github 文档 [https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO] 的代码 - 轮询选项之一将使问题消失了。
var io = require('socket.io').listen(80);
io.configure('production', function()
io.enable('browser client etag');
io.set('log level', 1);
io.set('transports', [
'websocket'
, 'flashsocket'
, 'htmlfile'
, 'xhr-polling'
, 'jsonp-polling'
]);
);
io.configure('development', function()
io.set('transports', ['websocket']);
);
【讨论】:
以上是关于使用 Nodejs + SocketIO 时丢弃传输错误的主要内容,如果未能解决你的问题,请参考以下文章
带有温度传感器的 SocketIO - 我几乎在我的 Raspberry Pi 上使用 NodeJS 和 SocketIO 完成了 DS18B20,如何提取 Promise data ?
ESP32-CAM 使用 socketIO 将视频输出流式传输到 nodejs 服务器的最快方法