IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    请教一个服务器完成发送和接收的代码问题,net模块

    bukebuchi发表于 2017-06-03 04:13:13
    love 0

    之前实现是客户端代码,master.js通过建立好的socket进行write操作, master.js代码里面有一个完成 start(requestId) { if (!this.frame || !this.transport.update(this.frame, requestId)) { this.frame = this.transport.encode(requestId, this.transaction.unit, this.transaction.request.toBuffer()); }

    this.requestId = requestId;
    this.timeoutTimer = setTimeout(this.onTimeout.bind(this), this.transaction.timeout);
    

    //console.log('this.connection.socket.remoteAddress ',this.connection.socket);

    this.connection.write(this.frame); //这里完成写数据 //this.connection.emit(‘write’,this.frame); // this.connection.onClientWrite(this.connection.socket,this.frame); this.transaction.emit(‘request’, requestId); } 客户端有个tcpconnection.js write(data) { this.emit(‘write’, data);

    if (!this.isOpen())
    {
      return;
    }
    
    try
    {
      this.socket.write(data);
    }
    catch (err)
    {
      this.emit('error', err);
    }
    

    }

    现在想在服务器端也用master.js进行写数据,服务器端tcplistener有段代码,

    setUpClient(socket) {

    console.log('setUpClient sep: %s', socket.remoteAddress);
    console.log('setUpClient:sep %d', socket.remotePort);
    const client = new RemoteClient({
      address: socket.remoteAddress,
      onClientWriteport: socket.remotePort,
      family: socket.remoteFamily
    });
    
    client.on('close', this.onClientClose.bind(this, socket));
    client.on('write', this.onClientWrite.bind(this, socket));
    

    client.write(writedata.toString()); const socketListeners = { close: client.destroy.bind(client), error: client.emit.bind(client, ‘error’), // writeable:function() // { // client.emit(‘write’, data); // }, readable: function() { const data = socket.read();

        if (data !== null)
        {
          client.emit('data', data);
         console.log('client.emit(writedata)');
          
        }
      }
    };
    
    socket.on('close', socketListeners.close);
    socket.on('error', socketListeners.error);
    
    socket.on('readable', socketListeners.readable);
    socket.setNoDelay(this.serverOptions.noDelay !== false);
    

    this.socketListeners.set(socket, socketListeners); this.clients.set(socket, client);

    //this.onClientWrite(socket, writedata.toString());
    //client.emit('write',writedata.toString());
    this.emit('client', client); 
    return socket;
    

    }

    /**

    • @private */ destroyClients() { this.clients.forEach(client => client.destroy()); }

    /**

    • @private
    • @param {Socket} socket
    • @param {Buffer} data */ onClientWrite(socket, data) { console.log(‘onClientWrite’); const client = this.clients.get(socket);

    if (!client) { console.log(‘client null’); return; }

    try
    {
      socket.write(data);
    }
    catch (err)
    {
      client.emit('error', err);
    }  
    

    } 我想调用这个里面的onClientWrite,把master.js里面的代码改成 start(requestId) { if (!this.frame || !this.transport.update(this.frame, requestId)) { this.frame = this.transport.encode(requestId, this.transaction.unit, this.transaction.request.toBuffer()); }

    this.requestId = requestId;
    this.timeoutTimer = setTimeout(this.onTimeout.bind(this), this.transaction.timeout);
    

    //console.log('this.connection.socket.remoteAddress ',this.connection.socket);

    // this.connection.write(this.frame); //之前的客户端代码 this.connection.onClientWrite(this.connection.socket,this.frame); //现在修改的代码 // this.connection.onClientWrite(this.connection.socket,this.frame); this.transaction.emit(‘request’, requestId); } 发现获取不到this.connection.socket这个连接,单独把onClientWrite改成这种写法也不行 write(data) {

      this.socket.write(data);
    

    }

    服务器和客户端相关连接函数我都发出来 onServerConnection(socket) {

    this.setUpClient(socket);
    

    } setUpClient(socket) {

    console.log('setUpClient sep: %s', socket.remoteAddress);
    console.log('setUpClient:sep %d', socket.remotePort);
    const client = new RemoteClient({
      address: socket.remoteAddress,
      onClientWriteport: socket.remotePort,
      family: socket.remoteFamily
    });
    
    client.on('close', this.onClientClose.bind(this, socket));
    client.on('write', this.onClientWrite.bind(this, socket));
    

    client.write(writedata.toString()); const socketListeners = { close: client.destroy.bind(client), error: client.emit.bind(client, ‘error’), // writeable:function() // { // client.emit(‘write’, data); // }, readable: function() { const data = socket.read();

        if (data !== null)
        {
          client.emit('data', data);
         console.log('client.emit(writedata)');
          
        }
      }
    };
    
    socket.on('close', socketListeners.close);
    socket.on('error', socketListeners.error);
    
    socket.on('readable', socketListeners.readable);
    socket.setNoDelay(this.serverOptions.noDelay !== false);
    

    this.socketListeners.set(socket, socketListeners); this.clients.set(socket, client);

    //this.onClientWrite(socket, writedata.toString());
    //client.emit('write',writedata.toString());
    this.emit('client', client); 
    

    } 客户端代码 setUpSocket(socket) { if (!socket) { socket = new Socket(); }

    socket.on('connect', this.onSocketConnect);
    socket.on('close', this.onSocketClose);
    socket.on('error', this.onSocketError);
    socket.on('readable', this.onSocketReadable);
    socket.setNoDelay(this.socketOptions.noDelay !== false);
    
    return socket;
    

    } 本人存小白,想了解一下有什么办法能实现获取到这个服务器js里面的socket呢,他是一个返回值吗



沪ICP备19023445号-2号
友情链接