如何将一个数据包序列写入Node.js net.Socket?

时间:2013-12-19 04:57:08

标签: node.js sockets promise

想知道我是否需要做一些特殊的事情来编写数据包数组,顺序地发送到Node.js中的net.Socket实例。

我不确定在for循环中写入同一个套接字是同步还是异步。

如果它是异步的,我是否必须宣传Socket.write并让循环设置为.then()链。我已经将bluebird用于承诺。

谢谢!

2 个答案:

答案 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映射。