zoukankan      html  css  js  c++  java
  • 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("同步服务器文件超时,请稍后再试!");
      }
     }

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

  • 相关阅读:
    root用户Linux 环境变量的配置解决(-bash: jps: command not found)有关问题
    Linux Crontab内环境变量与Shell环境变量的关系及解决问题的办法
    RocketMQ os.sh 系统优化(CentOS)
    Spring Boot修改内置Tomcat端口号
    SpringBoot多跨域请求的支持(JSONP)
    [译]Spring Boot 构建一个RESTful Web服务
    delphi怎样把子窗体显示在pagecontrol的tabsheet
    delphi从TRichEdit获得RTF格式文本(PC版本)
    数据类型表(DELPHI、C++)
    对程序进行注释
  • 原文地址:https://www.cnblogs.com/alaricblog/p/3278367.html
Copyright © 2011-2022 走看看