源码级强力分析Hadoop的RPC机制(4)

终于,我们知道了客户端的连接是怎样建立的了,其实就是创建一个普通的socket进行通信。呵呵,那服务端是不是也是创建一个ServerSocket进行通信的呢?呵呵,先不要急,到这里我们只解决了客户端的第一个问题,下面还有两个问题没有解决呢,我们一个一个地来解决吧。

问题2:客户端是怎样给服务端发送数据的?

我们回顾一下代码四吧。第一句为了完成连接的建立,我们已经分析完毕;而第二句是为了发送数据,呵呵,分析下去,看能不能解决我们的问题呢。下面贴出Client.Connection类的sendParam()方法吧:

代码八:

public void sendParam(Call call) {          if (shouldCloseConnection.get()) {            return;          }          DataOutputBuffer d=null;          try {            synchronized (this.out) {              if (LOG.isDebugEnabled())                LOG.debug(getName() + " sending #" + call.id);              //创建一个缓冲区              d = new DataOutputBuffer();              d.writeInt(call.id);              call.param.write(d);              byte[] data = d.getData();              int dataLength = d.getLength();              out.writeInt(dataLength);        //首先写出数据的长度              out.write(data, 0, dataLength); //向服务端写数据              out.flush();            }          } catch(IOException e) {            markClosed(e);          } finally {            IOUtils.closeStream(d);          }        }    其实这就是java io的socket发送数据的一般过程哦,没有什么特别之处。到这里问题二也解决了,来看看问题三吧。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/973f4028c89c9cbacf526d4b5acb8f29.html