Java web做服务器之间的通信方法

                我们都知道用socket通过TCP,或UDP协议连接不同的机器进行通信,做个客服端服务器端,用阻塞监听来接受发送的信息。现在我说的是不直接用socket连接来通信,而是Java.net包里有个抽象类URLConnection,

它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:

openConnection()

connect()

对影响到远程资源连接的参数进行操作。 与资源交互;查询头字段和内容。
---------------------------->

时间

  1. 通过在 URL 上调用 openConnection方法创建连接对象。
  2. 处理设置参数和一般请求属性。
  3. 使用 connect方法建立到远程对象的实际连接。
  4. 远程对象变为可用。远程对象的头字段和内容变为可访问。

使用以下方法修改设置参数:

  • setAllowUserInteraction

  • setDoInput

  • setDoOutput

  • setIfModifiedSince

  • setUseCaches

使用以下方法修改一般请求属性:

  • setRequestProperty

使用 setDefaultAllowUserInteraction和 setDefaultUseCaches可设置 AllowUserInteraction和 UseCaches参数的默认值。 上面每个 set方法都有一个用于获取参数值或一般请求属性值的对应 get方法。适用的具体参数和一般请求属性取决于协议。 在建立到远程对象的连接后,以下方法用于访问头字段和内容:

  • getContent

  • getHeaderField

  • getInputStream

  • getOutputStream

某些头字段需要经常访问。以下方法:

  • getContentEncoding

  • getContentLength

  • getContentType

  • getDate

  • getExpiration

  • getLastModifed

提供对这些字段的便捷访问。getContent方法使用 getContentType方法以确定远程对象类型;子类重写 getContentType方法很容易。 一般情况下,所有的预连接参数和一般请求属性都可忽略:预连接参数和一般请求属性默认为敏感值。对于此接口的大多数客户端而言,只有两个需要的方法:getInputStream和 getContent,它们通过便捷方法镜像到 URL类中。 有关 http连接的请求属性和头字段的更多信息,可从以下位置找到:

http://www.ietf.org/rfc/rfc2068.txt

有关 fileNameMap的注意事项:在 JDK 1.1.6 以前的版本中,URLConnection的 fileNameMap字段是公共的。在 JDK 1.1.6 及以后的版本中,fileNameMap字段是私有的;对其添加了 accessor 方法和 mutator 方法 getFileNameMap及 setFileNameMap以便访问。Compatibility 页中也对此更改进行了介绍。 完成请求后,在一个 URLConnectionInputStreamOutputStream 上调用 close() 方法可以释放与此实例相关的网络资源,除非特定的协议规范为其指定了其他行为。

具体方法和属性查看相关的api文档。它有两个子类HttpURLConnection, JarURLConnection ,它的底层实现就是socket来完成的 ,现在我们来看看子类HttpURLConnection写的一个实例。

public void synchronizeOthersServer() throws BoException {
  String[] ips = StringUtil.split(appServers, "|");
  // 同步其他服务器的html文件
  try {
   for (String ip : ips) {
    URL url = new URL("http://" + ip + SYCHRONIZED_URL);
    HttpURLConnection conn = (HttpURLConnection) url
      .openConnection();
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    String param = "ipAndport=" + ip;
    // conn.setConnectTimeout(CONNECT_TIMEOUT);
    // conn.setReadTimeout(READ_TIMEOUT);
    conn.connect();
    OutputStream out = conn.getOutputStream();
    out.write(param.getBytes());
    out.flush();
    out.close();

    if (conn.getResponseCode() >= 400) {
     throw new BoException("同步服务器前台左边菜单树html文件异常:" + ip);
    }
   }
  } catch (Exception e) {
   throw new BoException("同步服务器文件超时,请稍后再试!");
  }
 }

用这种方法做同步不是个好方法,但是这的确是一种解决同步的方案。

原文地址:https://www.cnblogs.com/alaricblog/p/3278367.html