互联网程序设计--HTTP程序设计

这篇具有很好参考价值的文章主要介绍了互联网程序设计--HTTP程序设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

教学和实践目的:

学会 WEB 浏览器基本的程序设计技术。

概述:

HTTP 系统包括客户端软件(浏览器)和服务器软件(HTTP 服务器)。早期的客户端软件,其主要工作可理解为文件下载和文件显示。

实际上现代的 HTTP 客户端比文件下载要复杂得多,它包括网页文件的下 载、跨平台的本地显示,参数的传递,动态网页的实现,以及交互等功能。

HTTP 系统程序设计:

(1)客户端软件(web 浏览器软件如 Edge 浏览器、360 浏览器)

(2)服务器软件(web 服务器软件如 IIS、Nginx、Tomcat 等)

HTTP 系统客户端的工作过程:

(1)客户端软件和服务器建立连接(TCP 的三次握手)

(2)发送 HTTP 头格式协议

(3)接收网页文件

(4)显示网页

 HTTP 系统服务端的工作过程:

(1)服务器软件开启 80 端口

(2)响应客户的要求、完成 TCP 连接

(3)检查客户端的 HTTP 头格式发送客户请求的网页文件(含动态网页)

一个完整的 HTTP 请求-响应如图所示:

互联网程序设计--HTTP程序设计,http,网络协议,网络,后端,java

本讲主要学习网页下载程序设计技术。网页下载技术是搜索引擎、网络爬 虫、网页采集器或网络推送服务等相关应用领域内的基础技术。

程序设计

1、基于 TCP 套接字的网页下载程序设计

利用 TCP 客户套接字 Socket 和 HTTP 服务器进行信息交互,将网页的原始 内容下载显示在图形界面中,具体工作如下:

(1)新建一个包 chapter08,将第 3 讲的 TCPClient.java 复制到此包下, 重命名为 HTTPClient.java;

(2)创建 HTTPClientFX.java 程序,界面如图 8.2 所示,网页地址输入 www.baidu.com 进行测试,端口为 80,在“连接”按钮类似以往的编码方式, 放置连接服务器的代码和启动输入流“读线程”;在“网页请求”按钮中发送 HTTP 请求头标准格式(关于 HTTP 请求头的更多信息可查阅互联网);在“退 出”按钮中,相对之前章节的代码,不是发送“bye”表示结束,而是send("Connection:close" +"\r\n") 表示结束连接。

互联网程序设计--HTTP程序设计,http,网络协议,网络,后端,java

现在将网页地址改为 www.gdufs.edu.cn,其它不变,再次连接并点击网页 请求,结果如下图所示;

互联网程序设计--HTTP程序设计,http,网络协议,网络,后端,java

这种情况HTTP服务器确实有内容返回,却不是我们预期的内容,第一行内容为“HTTP/1.1 302 Found”,这种情况一般是站点关闭了HTTP,只允许启用了SSL/TLS的HTTPS安全连接,这种连接默认是使用443端口。事实上,出于安全考虑,现在绝大部分的web站点都将放弃HTTP而启用HTTPS。

2、基于SSL Socket的网页下载程序设计

要访问HTTPS站点,就不能用普通的客户端套接字,而是使用SSL套接字。Java安全套接字扩展(Java Secure Socket Extension,JSSE)为基于SSL和TLS协议的Java网络应用程序提供了Java API以及参考实现,相关的类都定义在javax.net.ssl包下面,我们这里只使用其客户端的SSLSocket套接字。SSLSocket相对之前学习的客户端套接字,只是创建方法不同,SSLSocket对象由SSLSocketFactory创建,创建之后用法几乎一致。

(1)根据 HTTPClient.java 的内容,稍作修改,新创建 HTTPSClient.java 程序,与前者相比,主要区别的代码如下:

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;
public class HTTPSClient {
//定义 SSL 套接字
private SSLSocket socket;
 //定义 SSL 工厂类
 private SSLSocketFactory factory;
 //定义字符输入流和输出流
 ……
 
 public HTTPSClient(String ip, String port) 
 throws IOException {
 factory =(SSLSocketFactory)SSLSocketFactory.getDefault();
//创建安全套接字实例
 socket = (SSLSocket)factory.createSocket(ip,
 Integer.parseInt(port));
 //得到网络输出字节流地址,并封装成网络输出字符流
 ……
 ……
 }
 ……
 }

(2)根据 HTTPClientFX.java 程序的内容,稍做修改,新创建一个 HTTPSClientFX.java 程序(实质上只需要将原来的使用 HTTPClient 及其对象实 例的的地方修改为使用 HTTPSClient 及其对象实例即可)。

(3)运行该程序

(4)完全没有必要使用两个不同的图形界面来分别访问 http 和 https,创 建一个 HTTPAllClientFX.java,融合以上两个图形客户端的功能,使得该图形客 户端既可访问 443 的 https 内容,也可以访问非 443 端口(一般是 80)的 http 内容。

3、基于URL类的网页下载程序设计

前面直接发送http请求的程序,对于复杂的地址,例如指向具体页面的地址,无法完成网页下载任务,我们可以使用基于URL类的解决方案。

URL的格式为protocol://资源地址,protocol可以是HTTP、HTTPS、FTP 和 File,资源地址中可以带有端口号及查询参数,具体可以自行搜索URL的知识。

在java.net包中定义了URL类,该类用来处理有关URL的内容。并且其封装有一个InputStream返回类型的openStream()方法,我们的程序就可以读取这个字节输入流来获得对应内容。

互联网程序设计--HTTP程序设计,http,网络协议,网络,后端,java

发送按钮事件响应中的关键代码:

taDisplay.clear();
String address = tfSend.getText().trim();
 try {
URL url = new URL(address);
System.out.printf("连接%s 成功!\n", address);
 //获得 url 的字节流输入
 InputStream in = url.openStream();
 //装饰成字符输入流
 br = new BufferedReader(new InputStreamReader(in, "utf-8"));
 //用于接收信息的单独线程
 …

注意URL方式和直接发送HTTP请求报头的方式,返回结果有何不同。

(2)完善程序,使得用户输入不符合URL语法的网址,你的程序不是抛出异常报错,而是在显示区提醒用户输入地址不合规,如图所示。

互联网程序设计--HTTP程序设计,http,网络协议,网络,后端,java

总代码

互联网程序设计--HTTP程序设计,http,网络协议,网络,后端,java文章来源地址https://www.toymoban.com/news/detail-776998.html

HTTPAllClientFX



package chapter08;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.IOException;

public class HTTPAllClientFX extends Application {
  private Button btnConnect = new Button("连接");
  private Button btnClose = new Button("退出");
  private Button btnClear = new Button("清空");
  private Button btnHttp = new Button("网页请求");
  private TextField tfUrl = new TextField("www.gdufs.edu.cn");
  private TextField tfPort = new TextField("443");
  private TextArea taDisplay = new TextArea();
  private HTTPClient httpClient;
  private HTTPSClient httpsClient;
  Thread readThread;
  String url;
  String port;
  @Override
  public void start(Stage primaryStage){
    BorderPane mainpane = new BorderPane();
    HBox tophbox = new HBox();
    tophbox.setSpacing(10);
    tophbox.setPadding(new Insets(10,20,10,20));
    tophbox.setAlignment(Pos.CENTER);
    tophbox.getChildren().addAll(new Label("网页地址"),tfUrl,new Label("端口"),tfPort,btnConnect);

    VBox vBox = new VBox();
    vBox.setPadding(new Insets(10,20,10,20));
    vBox.setSpacing(10);
    vBox.getChildren().addAll(new Label("信息显示区"),taDisplay);
    HBox buttomHbox = new HBox();
    buttomHbox.setPadding(new Insets(10,20,10,20));
    buttomHbox.setSpacing(10);
    buttomHbox.setAlignment(Pos.CENTER_RIGHT);
    buttomHbox.getChildren().addAll(btnHttp,btnClear,btnClose);
    mainpane.setTop(tophbox);
    mainpane.setCenter(vBox);
    mainpane.setBottom(buttomHbox);
    Scene scene = new Scene(mainpane,800,400);
    primaryStage.setScene(scene);
    primaryStage.show();

    btnConnect.setOnAction(event -> {
      url = tfUrl.getText().trim();
      port = tfPort.getText().trim();
      if(port.equals("443")) {
        try {
          httpsClient = new HTTPSClient(url, port);
          taDisplay.appendText("服务器启动");
          // 多线程不需要这一条了
//                String firstMsg = tcpClient.receive();
//                taDisplay.appendText(firstMsg+"\n");
//                btnConnect.setDisable(true);
          //多线程方法

          readThread = new Thread(() -> {
            String msg = null;
            while ((msg = httpsClient.receive()) != null) {
              String msgTemp = msg;
              Platform.runLater(() -> {
                taDisplay.appendText(msgTemp + "\n");
              });
            }
            Platform.runLater(() -> {
              taDisplay.appendText("对话已关闭!\n");
            });
          });
          readThread.start();
        } catch (IOException e) {
          taDisplay.appendText("服务器连接失败" + e.getMessage() + "\n");
        }
      }

      else {
        try {
          httpClient = new HTTPClient(url, port);
          taDisplay.appendText("服务器启动");
          readThread = new Thread(() -> {
            String msg = null;
            while ((msg = httpClient.receive()) != null) {
              String msgTemp = msg;
              Platform.runLater(() -> {
                taDisplay.appendText(msgTemp + "\n");
              });
            }
            Platform.runLater(() -> {
              taDisplay.appendText("对话已关闭!\n");
            });
          });
          readThread.start();
        } catch (IOException e) {
          taDisplay.appendText("服务器连接失败" + e.getMessage() + "\n");
        }
      }
    });

    btnHttp.setOnAction(event -> {
      StringBuffer msg = new StringBuffer("GET / HTTP/1.1" + "\r\n"); //
      //  StringBuffer msg = new StringBuffer("GET / connecttest.txt HTTP/1.1 " + "\r\n"); //注意/后面需要有空格
      msg.append("HOST:" + url + "\r\n");
      msg.append("Accept: */*" + "\r\n");
      msg.append("Accept-Language: zh-cn"  + "\r\n");
      msg.append("Accept-Encoding: deflate" + "\r\n");
      msg.append("User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows XP)" + "\r\n");
      msg.append("Connection:Keep-Alive" + "\r\n");
      //msg.append
      if(port.equals("443")){
        httpsClient.send(msg.toString());
      }else{
        httpClient.send(msg.toString());
      }
    });

    btnClear.setOnAction(event -> {
      taDisplay.clear();
    });
    btnClose.setOnAction(event -> {
      if(httpClient != null){
        //向服务器发送关闭连接的约定信息
        httpClient.send("bye");
        httpClient.close();
      }else if(httpsClient != null){
        //向服务器发送关闭连接的约定信息
        httpsClient.send("bye");
        httpsClient.close();
      }
      System.exit(0);
    });
  }
}

HTTPClient


package chapter08;

import java.io.*;
import java.net.Socket;

public class HTTPClient {
  private Socket socket; //定义套接字
  //定义字符输入流和输出流
  private PrintWriter pw;
  private BufferedReader br;

  public HTTPClient(String ip, String port) throws IOException {
    //主动向服务器发起连接,实现TCP的三次握手过程
    //如果不成功,则抛出错误信息,其错误信息交由调用者处理
    socket = new Socket(ip, Integer.parseInt(port));

    //得到网络输出字节流地址,并封装成网络输出字符流
    OutputStream socketOut = socket.getOutputStream();
    pw = new PrintWriter( // 设置最后一个参数为true,表示自动flush数据
      new OutputStreamWriter(//设置utf-8编码
        socketOut, "utf-8"), true);

    //得到网络输入字节流地址,并封装成网络输入字符流
    InputStream socketIn = socket.getInputStream();
    br = new BufferedReader(
      new InputStreamReader(socketIn, "utf-8"));
  }

  public void send(String msg) {
    //输出字符流,由Socket调用系统底层函数,经网卡发送字节流
    pw.println(msg);
  }

  public String receive() {
    String msg = null;
    try {
      //从网络输入字符流中读信息,每次只能接受一行信息
      //如果不够一行(无行结束符),则该语句阻塞等待,
      // 直到条件满足,程序才往下运行
      msg = br.readLine();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return msg;
  }
  public void close() {
    try {
      if (socket != null) {
        //关闭socket连接及相关的输入输出流,实现四次握手断开
        socket.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) throws IOException{
    HTTPClient tcpClient = new HTTPClient("127.0.0.1", "8008");
    tcpClient.send("hello");
    System.out.println(tcpClient.receive());

  }
}

HTTPClientFX

package chapter08;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.IOException;

public class HTTPClientFX extends Application{
  private Button btnConnect = new Button("连接");
  private Button btnClose = new Button("退出");
  private Button btnClear = new Button("清空");
  private Button btnHttp = new Button("网页请求");
  private TextField tfUrl = new TextField();
  private TextField tfPort = new TextField();
  private TextArea taDisplay = new TextArea();
  private HTTPClient httpClient;
  Thread readThread;

  @Override
  public void start(Stage primaryStage){
    BorderPane mainpane = new BorderPane();
    HBox tophbox = new HBox();
    tophbox.setSpacing(10);
    tophbox.setPadding(new Insets(10,20,10,20));
    tophbox.setAlignment(Pos.CENTER);
    tophbox.getChildren().addAll(new Label("网页地址"),tfUrl,new Label("端口"),tfPort,btnConnect);

    VBox vBox = new VBox();
    vBox.setPadding(new Insets(10,20,10,20));
    vBox.setSpacing(10);
    vBox.getChildren().addAll(new Label("信息显示区"),taDisplay);


    HBox buttomHbox = new HBox();
    buttomHbox.setPadding(new Insets(10,20,10,20));
    buttomHbox.setSpacing(10);
    buttomHbox.setAlignment(Pos.CENTER_RIGHT);
    buttomHbox.getChildren().addAll(btnHttp,btnClear,btnClose);
    mainpane.setTop(tophbox);
    mainpane.setCenter(vBox);
    mainpane.setBottom(buttomHbox);
    Scene scene = new Scene(mainpane,800,400);
    primaryStage.setScene(scene);
    primaryStage.show();

    btnConnect.setOnAction(event -> {
      String url = tfUrl.getText().trim();
      String port = tfPort.getText().trim();
      try {
        httpClient = new HTTPClient(url,port);
        // 多线程不需要这一条了
//                String firstMsg = tcpClient.receive();
//                taDisplay.appendText(firstMsg+"\n");
//                btnConnect.setDisable(true);
        //多线程方法

        readThread = new Thread(()->{
          String msg = null;
          while((msg = httpClient.receive())!=null){
            String msgTemp = msg;
            Platform.runLater(()->{
              taDisplay.appendText(msgTemp+"\n");
            });
          }
          Platform.runLater(()->{
            taDisplay.appendText("对话已关闭!\n");
          });
        });
        readThread.start();
      } catch (IOException e) {
        taDisplay.appendText("服务器连接失败"+e.getMessage()+"\n");
      }
    });

    btnHttp.setOnAction(event -> {
      String ip = tfUrl.getText();
      StringBuffer msg = new StringBuffer("GET / HTTP/1.1" + "\r\n"); //
      //  StringBuffer msg = new StringBuffer("GET / connecttest.txt HTTP/1.1 " + "\r\n"); //注意/后面需要有空格
      msg.append("HOST:" + ip + "\r\n");
      msg.append("Accept: */*" + "\r\n");
      msg.append("Accept-Language: zh-cn"  + "\r\n");
      msg.append("Accept-Encoding: deflate" + "\r\n");
      msg.append("User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows XP)" + "\r\n");
      msg.append("Connection:Keep-Alive" + "\r\n");
      //msg.append
      httpClient.send(msg.toString());
    });

  }

}

HTTPSClient

package chapter08;

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;

public class HTTPSClient {
  private SSLSocket socket; //定义套接字
  private SSLSocketFactory factory;
  //定义字符输入流和输出流
  private PrintWriter pw;
  private BufferedReader br;

  public HTTPSClient(String ip, String port) throws IOException {
    //主动向服务器发起连接,实现TCP的三次握手过程
    //如果不成功,则抛出错误信息,其错误信息交由调用者处理
    factory=(SSLSocketFactory)SSLSocketFactory.getDefault();
    socket=(SSLSocket)factory.createSocket(ip,Integer.parseInt(port));

    //得到网络输出字节流地址,并封装成网络输出字符流
    OutputStream socketOut = socket.getOutputStream();
    pw = new PrintWriter( // 设置最后一个参数为true,表示自动flush数据
      new OutputStreamWriter(//设置utf-8编码
        socketOut, "utf-8"), true);

    //得到网络输入字节流地址,并封装成网络输入字符流
    InputStream socketIn = socket.getInputStream();
    br = new BufferedReader(
      new InputStreamReader(socketIn, "utf-8"));
  }

  public void send(String msg) {
    //输出字符流,由Socket调用系统底层函数,经网卡发送字节流
    pw.println(msg);
  }

  public String receive() {
    String msg = null;
    try {
      //从网络输入字符流中读信息,每次只能接受一行信息
      //如果不够一行(无行结束符),则该语句阻塞,
      // 直到条件满足,程序才往下运行
      msg = br.readLine();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return msg;
  }
  public void close() {
    try {
      if (socket != null) {
        //关闭socket连接及相关的输入输出流,实现四次握手断开
        socket.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  //本机模块内测试与运行,需先运行TCPServer
  public static void main(String[] args) throws IOException {
    HTTPSClient tcpClient = new HTTPSClient("127.0.0.1" ,"8008");
    tcpClient.send("hello");//发送一串字符
    //接收服务器返回的字符串并显示
    System.out.println(tcpClient.receive());
  }

}

HTTPSClientFX

package chapter08;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.IOException;


public class HTTPSClientFX extends Application{
  private Button btnConnect = new Button("连接");
  private Button btnClose = new Button("退出");
  private Button btnClear = new Button("清空");
  private Button btnHttp = new Button("网页请求");
  private TextField tfUrl = new TextField();
  private TextField tfPort = new TextField();
  private TextArea taDisplay = new TextArea();
  private HTTPSClient httpsClient;
  Thread readThread;

  @Override
  public void start(Stage primaryStage){
    BorderPane mainpane = new BorderPane();
    HBox tophbox = new HBox();
    tophbox.setSpacing(10);
    tophbox.setPadding(new Insets(10,20,10,20));
    tophbox.setAlignment(Pos.CENTER);
    tophbox.getChildren().addAll(new Label("网页地址"),tfUrl,new Label("端口"),tfPort,btnConnect);

    VBox vBox = new VBox();
    vBox.setPadding(new Insets(10,20,10,20));
    vBox.setSpacing(10);
    vBox.getChildren().addAll(new Label("信息显示区"),taDisplay);
    HBox buttomHbox = new HBox();
    buttomHbox.setPadding(new Insets(10,20,10,20));
    buttomHbox.setSpacing(10);
    buttomHbox.setAlignment(Pos.CENTER_RIGHT);
    buttomHbox.getChildren().addAll(btnHttp,btnClear,btnClose);
    mainpane.setTop(tophbox);
    mainpane.setCenter(vBox);
    mainpane.setBottom(buttomHbox);
    Scene scene = new Scene(mainpane,800,400);
    primaryStage.setScene(scene);
    primaryStage.show();

    btnConnect.setOnAction(event -> {
      String url = tfUrl.getText().trim();
      String port = tfPort.getText().trim();
      try {
        httpsClient = new HTTPSClient(url,port);
        // 多线程不需要这一条了
//                String firstMsg = tcpClient.receive();
//                taDisplay.appendText(firstMsg+"\n");
//                btnConnect.setDisable(true);
        //多线程方法

        readThread = new Thread(()->{
          String msg = null;
          while((msg = httpsClient.receive())!=null){
            String msgTemp = msg;
            Platform.runLater(()->{
              taDisplay.appendText(msgTemp+"\n");
            });
          }
          Platform.runLater(()->{
            taDisplay.appendText("对话已关闭!\n");
          });
        });
        readThread.start();
      } catch (IOException e) {
        taDisplay.appendText("服务器连接失败"+e.getMessage()+"\n");
      }
    });

    btnHttp.setOnAction(event -> {
      String ip = tfUrl.getText();
      StringBuffer msg = new StringBuffer("GET / HTTP/1.1" + "\r\n"); //
      //  StringBuffer msg = new StringBuffer("GET / connecttest.txt HTTP/1.1 " + "\r\n"); //注意/后面需要有空格
      msg.append("HOST:" + ip + "\r\n");
      msg.append("Accept: */*" + "\r\n");
      msg.append("Accept-Language: zh-cn"  + "\r\n");
      msg.append("Accept-Encoding: deflate" + "\r\n");
      msg.append("User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows XP)" + "\r\n");
      msg.append("Connection:Keep-Alive" + "\r\n");
      //msg.append
      httpsClient.send(msg.toString());
    });

  }
}

URLClientFX

package chapter08;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;


public class URLClientFX extends Application{
  private Button btnClose = new Button("退出");
  private Button btnClear = new Button("清空");
  private Button btnHttp = new Button("发送");
  private TextField tfUrl = new TextField();
  private TextArea taDisplay = new TextArea();
  private HTTPClient httpClient;
  Thread readThread;
  BufferedReader br;
  @Override
  public void start(Stage primaryStage){
    BorderPane mainpane = new BorderPane();
    taDisplay.setWrapText(true);
    VBox vBox = new VBox();
    vBox.setPadding(new Insets(10,20,10,20));
    vBox.setSpacing(10);
    vBox.getChildren().addAll(new Label("网页信息显示区"),taDisplay,new Label("输入URL地址"),tfUrl);
    VBox.setVgrow(taDisplay, Priority.ALWAYS);
    HBox buttomHbox = new HBox();
    buttomHbox.setPadding(new Insets(10,20,10,20));
    buttomHbox.setSpacing(10);
    buttomHbox.setAlignment(Pos.CENTER_RIGHT);
    buttomHbox.getChildren().addAll(btnHttp,btnClear,btnClose);
    mainpane.setCenter(vBox);
    mainpane.setBottom(buttomHbox);
    Scene scene = new Scene(mainpane,800,400);
    primaryStage.setScene(scene);
    primaryStage.show();


    btnClear.setOnAction(event -> {
      taDisplay.clear();
    });
    btnHttp.setOnAction(event -> {

      taDisplay.clear();
      try {
        String ip = tfUrl.getText();
        if (!isURL(ip)) {
          taDisplay.appendText("当前url不合法");
        } else {
          URL url = new URL(ip);
          System.out.println("连接成功!");
          InputStream in = url.openStream();
          br = new BufferedReader(new InputStreamReader(in, "utf-8"));
//                readThread=new Thread(){
//                    String msg =null;
//                    while((msg=br.readLine())!=null){
//                        taDisplay.appendText(msg.toString());
//                    }
//                };
          readThread = new Thread(() -> {
            String msg;
            //不知道服务器有多少回传信息,就持续不断接收
            //由于在另外一个线程,不会阻塞主线程的正常运行
            try {
              while ((msg = br.readLine()) != null) {
                //lambda表达式不能直接访问外部非final类型局部变量
                //所以这里使用了一个临时变量
                String msgTemp = msg;
                Platform.runLater(() -> {
                  taDisplay.appendText(msgTemp + "\r\n");
                });
              }
            } catch (IOException e) {
              e.printStackTrace();
            }
            //跳出了循环,说明服务器已关闭,读取为null,提示对话关闭
            Platform.runLater(() -> {
              taDisplay.appendText("对话已关闭!\n");
            });
          });
          readThread.start();

        }
      }catch(IOException e) {
        e.printStackTrace();
      }
    });


  }
  public static boolean isURL(String str){
    //转换为小写
    str = str.toLowerCase();
    String regex = "^((https|http|ftp|rtsp|mms)?://)"  //https、http、ftp、rtsp、mms
      + "(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
      + "(([0-9]{1,3}\\.){3}[0-9]{1,3}" // IP形式的URL- 例如:199.194.52.184
      + "|" // 允许IP和DOMAIN(域名)
      + "([0-9a-z_!~*'()-]+\\.)*" // 域名- www.
      + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\\." // 二级域名
      + "[a-z]{2,6})" // first level domain- .com or .museum
      + "(:[0-9]{1,5})?" // 端口号最大为65535,5位数
      + "((/?)|" // a slash isn't required if there is no file name
      + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
    return  str.matches(regex);
  }
}

到了这里,关于互联网程序设计--HTTP程序设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 互联网上门洗鞋店小程序

    上门洗鞋店小程序门店版是基于原平台版进行增强的,结合洗鞋行业的线下实际运营经验和需求,专为洗鞋人和洗鞋店打造的高效、实用、有价值的管理软件系统。     它能够帮助洗鞋人建立自己的私域流量,实现会员用户管理,实现用户与商家的点对点互联互通,提高洗鞋

    2024年02月03日
    浏览(48)
  • 互联网轻量级框架整合之设计模式

    Java的反射技术能够通过配置类的全限定名、方法和参数完成对象的初始化,甚至反射某些方法,大大的增强了Java的可配置型,这也是Spring IoC的底层原理,Java的反射技术覆盖面很广,包括对象构建、反射方法、注解、参数、接口等等,而这一切都是通过 java.lang.reflect.* 来完成

    2024年04月11日
    浏览(72)
  • 如何设计企业节点的『工业互联网标识解析系统』

    『星火 · 链网』以节点形式进行组织互联互通,其中包括三类节点:超级节点、骨干节点、业务节点。 其底层采用“1+N”主从链群架构,支持同构和异构区块链接入主链。在全国重点区域部署『星火 · 链网』超级节点,作为国家链网顶层,提供关键资产和链群运营管理、主

    2024年02月03日
    浏览(54)
  • 互联网+洗鞋店预约小程序新模式;

    互联网+洗鞋店预约小程序 1、线上线下业务的结合。 传统的线下业务消费者到店可以向其推介线上的预约到家服务,让线下的消费者成为小程序内的会员,留存客户之后线上可直接触达,减少与消费者的距离,从等待客户到可以主动出击,有什么活动能第一时间推送到客户手

    2024年02月11日
    浏览(43)
  • 互联网医院开发|在线问诊小程序搭建流程

    随着移动互联网的发展,传统医疗行业也在不断与时俱进,实现“互联网+医疗”,其中在线问诊小程序就是很好的例子,一起来了解在线问诊小程序解决方案, 在线问诊小程序 就是能够将互联网与医疗结合在一起的工具,借助在线问诊小程序,用户可以足不出门在家轻松看

    2024年02月13日
    浏览(47)
  • ChatGPT会取代互联网程序员吗?

    ChatGPT是一个基于GPT-3模型的自然语言对话系统,它可以与用户进行自然、流畅、智能的对话交互,回答用户的问题,提供用户所需的信息,甚至生成一些有趣和创意的内容。 ChatGPT最近火爆全网,一时间ChatGPT遍布各行各业,被不同身份不同背景的用户征询各种千奇百怪的问题

    2023年04月09日
    浏览(42)
  • HTTP模式下STM32程序远程升级设计

    针对嵌入式终端设备架设分散、数量庞大以及应用程序更新迭代速度快带来的程序升级困难局面,运用STM32微控制器的在应用中编程(IAP)原理,设计了通过以太网远程升级程序的方案。 HTTP协议和LwIP协议的使用,不仅让整个方案具备高安全性、可靠性。易用性,还有效降低

    2024年02月11日
    浏览(46)
  • 互联网加竞赛 地铁大数据客流分析系统 设计与实现

    🔥 优质竞赛项目系列,今天要分享的是 地铁大数据客流分析系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 使用 Flink 完成数据清洗和聚合,使用 Elasticsearch + Kibana 的的技术路线,完成了客流信息

    2024年02月04日
    浏览(48)
  • 物联网和互联网医院小程序:如何实现医疗设备的远程监测和管理?

    物联网(IoT)技术的发展为医疗设备的远程监测和管理提供了巨大的机会。结合互联网医院小程序,我们可以实现对医疗设备的远程访问、监控和管理,从而提高医疗服务的质量和效率。本文将介绍如何实现医疗设备的远程监测和管理,并提供一些关键技术的示例。 要实现医

    2024年02月08日
    浏览(52)
  • 扭蛋机小程序搭建,“互联网+”下的发展优势

    随着我国生活水平和消费能力不断提高,人们对各种潮流文化类的产品需求也快速上升。至此,我国潮流文化市场得到了快速发展! 扭蛋机作为潮玩中的一种商业模式,深受不同年龄层用户的喜爱。并且扭蛋机的种类也是各式各样,与不同IP、热门动漫合作,打造出了不同用

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包