想知道我是否需要做一些特殊的事情来编写数据包数组,顺序地发送到Node.js中的net.Socket
实例。
我不确定在for
循环中写入同一个套接字是同步还是异步。
如果它是异步的,我是否必须宣传Socket.write
并让循环设置为.then()
链。我已经将bluebird
用于承诺。
谢谢!
答案 0 :(得分:0)
我也对此感到困惑。大多数Node.js示例使public class MainActivity extends AppCompatActivity {
TextView textView;
private URL url;
byte[] answer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textID);
Log.i("Trace", "A");
try{
url = new URL("http", "www.google.com", 80, "index.html");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
Log.i("Trace", "B");
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("GET");
urlConnection.setAllowUserInteraction(true);
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
Log.i("Trace", "C");
//urlConnection.setInstanceFollowRedirects(false);
urlConnection.connect(); //BREAKS HERE
Log.i("Trace", "D");
InputStream in = urlConnection.getInputStream();
Log.i("Trace", "E");
byte[] b = new byte[10];
in.read(b);
textView.setText(b.toString());
}
catch (Exception e){
Log.i("Trace", "Exception: " + e.getMessage());
}
}
}
看起来像是同步的:
write()
事实证明,var server = net.createServer(function(socket) {
socket.write('Hello!');
socket.end();
});
的非回调版本实际上意味着write()
。如果它实际上无法将数据写入套接字,它会将其排队到内存中。 Node最终负责将排队的数据写入套接字。
我想他们这样做是因为回调很烦人,这减少了代码中的回调次数。缺点是它使用更多内存(参见:Socket.bufferSize
)。
如果您要推送大量数据,那么使用write_eventually()
的回调版本可以提高内存效率:
write()
但它是2016年,所以也许你可以使用"use strict";
var net = require("net")
function writeArray(arrayOfChunks, socket, callback) {
var i = 0;
function f() {
if (i >= arrayOfChunks.length) {
callback();
} else {
socket.write(arrayOfChunks[i++], null, f);
}
}
f()
}
var server = net.createServer((socket) => {
var arrayOfChunks = ['Hello', ', ', 'world!', '\n'];
writeArray(arrayOfChunks, socket, () => {
socket.write('DONE\n', null, () => {
socket.end();
})
})
})
server.listen(9191, () => {
console.log("Server listening.");
})
/ async
而不必处理回调/承诺废话。
答案 1 :(得分:0)
保证按顺序执行多次写入。
请求:不保证响应1:1映射。