• Java 网络编程、e-mail、多线程编程


    一、Java 网络编程:

    网络编程时指编写运行在多个设备的程序,这些设备通过网络连接起来。

    Java.net包中的J2SE的API包含有类和接口,提供低层次的通信细节。

    java.net 包中提供了两种常见的网络协议的支持:

    TCP:TCP(英语:Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层。TCP 保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

    UDP:UDP (英语:User Datagram Protocol,用户数据报协议),位于 OSI 模型的传输层。一个无连接的协议。提供了应用程序之间要发送数据的数据报。由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包。

    1、Socket编程:

    套接字使用TCP提供计算机之间的通讯机制。客户端创建一个套接字,连接服务器的套接字,建立连接时,服务器创建Socket对象。客户端和服务器通过对Socket对象的写入和读取进行通信。java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。

    计算机间使用套接字建立TCP连接的步骤:

    1. 服务器实例化ServerSocket对象,表示通过服务器上的端口通信;
    2. 服务器调用ServerSocket类的accept()方法,等待客户端连接到服务器上给定的端口;
    3. 服务器等待时,客户端实例化Socket对象,指定服务器的名称和端口号来请求连接;
    4. Socket类的构造函数将客户端连接到指定的服务器和端口号,如果通信被建立,则客户端创建Socket对象与服务器通信。
    5. 在服务器端,accept()方法返回服务器一个新的Socket引用,该Socket链接客户端的Socket。
    6. 建立连接后,通过I/O流进行通信,每个Socket都有一个输入流和一个输出流。

    ServerSocket类的方法:

    序号

    方法描述

    1

    public ServerSocket(int port) throws IOException
    创建绑定到特定端口的服务器套接字。

    2

    public ServerSocket(int port, int backlog) throws IOException
    利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。

    3

    public ServerSocket(int port, int backlog, InetAddress address) throws IOException
    使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。

    4

    public ServerSocket() throws IOException
    创建非绑定服务器套接字。

    ServerSocket类的常用方法:

    序号

    方法描述

    1

    public int getLocalPort()
      返回此套接字在其上侦听的端口。

    2

    public Socket accept() throws IOException
    侦听并接受到此套接字的连接。

    3

    public void setSoTimeout(int timeout)
     通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。

    4

    public void bind(SocketAddress host, int backlog)
    将 ServerSocket 绑定到特定地址(IP 地址和端口号)。

    Socket类的构造方法:

    序号

    方法描述

    1

    public Socket(String host, int port) throws UnknownHostException, IOException.
    创建一个流套接字并将其连接到指定主机上的指定端口号。

    2

    public Socket(InetAddress host, int port) throws IOException
    创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

    3

    public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
    创建一个套接字并将其连接到指定远程主机上的指定远程端口。

    4

    public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
    创建一个套接字并将其连接到指定远程地址上的指定远程端口。

    5

    public Socket()
    通过系统默认类型的 SocketImpl 创建未连接套接字

    序号

    方法描述

    1

    public void connect(SocketAddress host, int timeout) throws IOException
    将此套接字连接到服务器,并指定一个超时值。

    2

    public InetAddress getInetAddress()
     返回套接字连接的地址。

    3

    public int getPort()
    返回此套接字连接到的远程端口。

    4

    public int getLocalPort()
    返回此套接字绑定到的本地端口。

    5

    public SocketAddress getRemoteSocketAddress()
    返回此套接字连接的端点的地址,如果未连接则返回 null。

    6

    public InputStream getInputStream() throws IOException
    返回此套接字的输入流。

    7

    public OutputStream getOutputStream() throws IOException
    返回此套接字的输出流。

    8

    public void close() throws IOException
    关闭此套接字。

    InetAddress类的方法:

    序号

    方法描述

    1

    static InetAddress getByAddress(byte[] addr)
    在给定原始 IP 地址的情况下,返回 InetAddress 对象。

    2

    static InetAddress getByAddress(String host, byte[] addr)
    根据提供的主机名和 IP 地址创建 InetAddress。

    3

    static InetAddress getByName(String host)
    在给定主机名的情况下确定主机的 IP 地址。

    4

    String getHostAddress() 
    返回 IP 地址字符串(以文本表现形式)。

    5

    String getHostName() 
     获取此 IP 地址的主机名。

    6

    static InetAddress getLocalHost()
    返回本地主机。

    7

    String toString()
    将此 IP 地址转换为 String。

    Socket客户端实例:

    // 文件名 GreetingClient.java

    import java.net.*;

    import java.io.*;

    public class GreetingClient {

    public static void main(String [] args) {

    String serverName = args[0];

    int port = Integer.parseInt(args[1]);

    try {

    System.out.println("连接到主机:" + serverName + " ,端口号:" + port);

    Socket client = new Socket(serverName, port); System.out.println("远程主机地址:" + client.getRemoteSocketAddress());

    OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("服务器响应: " + in.readUTF()); client.close();

    }catch(IOException e) {

    e.printStackTrace();

    }

    }

     }

    Socket服务器实例:

    import java.net.*;

    import java.io.*;

    public class GreetingServer extends Thread {

    private ServerSocket serverSocket;

    public GreetingServer(int port) throws IOException {

    serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000);

    }

    public void run() {

    while(true) { try {

    System.out.println("等待连接,端口号为:" + serverSocket.getLocalPort() + "...");

    Socket server = serverSocket.accept(); System.out.println("远程主机地址:" + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new

    DataOutputStream(server.getOutputStream()); out.writeUTF("连接:" + server.getLocalSocketAddress() + "\nGoodbye!");

    server.close();

    }catch(SocketTimeoutException s) {

    System.out.println("Socket timed out!");

    break;

    }catch(IOException e) {

    e.printStackTrace(); break;

    }

    }

    }

    public static void main(String [] args) {

    int port = Integer.parseInt(args[0]);

    try {

    Thread t = new GreetingServer(port); t.run();

     }catch(IOException e) {

    e.printStackTrace();

    }

    }

    }

    2、URL处理:

    URL(Uniform Resource Locator)统一资源定位符,俗称网页地址。URL分为如下几个部分:

    protocol://host:port/path?query#fragment

    protocol(协议)可以是 HTTP、HTTPS、FTP 和 File,port 为端口号,path为文件路径及文件名。HTTP 协议的 URL 实例如下:

    http://www.example.com/index.html?language=cn#j2se

    URL 解析:

    • 协议为(protocol):http
    • 主机为(host:port):www.example.com
    • 端口号为(port): 80 ,以上URL实例并未指定端口,因为 HTTP 协议默认的端口号为 80。
    • 文件路径为(path):/index.html
    • 请求参数(query):language=cn
    • 定位位置(fragment):j2se,定位到网页中 id 属性为 j2se 的 HTML 元素位置 
    • URL类的方法:

    序号

    方法描述

    1

    public URL(String protocol, String host, int port, String file) throws MalformedURLException.
    通过给定的参数(协议、主机名、端口号、文件名)创建URL。

    2

    public URL(String protocol, String host, String file) throws MalformedURLException
    使用指定的协议、主机名、文件名创建URL,端口使用协议的默认端口。

    3

    public URL(String url) throws MalformedURLException
    通过给定的URL字符串创建URL

    4

    public URL(URL context, String url) throws MalformedURLException
    使用基地址和相对URL创建

    序号

    方法描述

    1

    public String getPath()
    返回URL路径部分。

    2

    public String getQuery()
    返回URL查询部分。

    3

    public String getAuthority()
    获取此 URL 的授权部分。

    4

    public int getPort()
    返回URL端口部分

    5

    public int getDefaultPort()
    返回协议的默认端口号。

    6

    public String getProtocol()
    返回URL的协议

    7

    public String getHost()
    返回URL的主机

    8

    public String getFile()
    返回URL文件名部分

    9

    public String getRef()
    获取此 URL 的锚点(也称为"引用")。

    10

    public URLConnection openConnection() throws IOException
    打开一个URL连接,并运行客户端访问资源。

    URLConnections类方法:

    序号

    方法描述

    1

    Object getContent()
    检索URL链接内容

    2

    Object getContent(Class[] classes)
    检索URL链接内容

    3

    String getContentEncoding()
    返回头部 content-encoding 字段值。

    4

    int getContentLength()
    返回头部 content-length字段值

    5

    String getContentType()
    返回头部 content-type 字段值

    6

    int getLastModified()
    返回头部 last-modified 字段值。

    7

    long getExpiration()
    返回头部 expires 字段值。

    8

    long getIfModifiedSince()
    返回对象的 ifModifiedSince 字段值。

    9

    public void setDoInput(boolean input)
    URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输入,则将 DoInput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 true。

    10

    public void setDoOutput(boolean output)
    URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输出,则将 DoOutput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 false。

    11

    public InputStream getInputStream() throws IOException
    返回URL的输入流,用于读取资源

    12

    public OutputStream getOutputStream() throws IOException
    返回URL的输出流, 用于写入资源。

    13

    public URL getURL()
    返回 URLConnection 对象连接的URL

    二、Java 发送邮件:

    使用java应用程序发送e-mail,首先需在电脑上安装JavaMail API和Java Activation Framework(JAF)。示例:

    import java.util.*;

    import javax.mail.*;

    import javax.mail.internet.*;

    import javax.activation.*;

    public class SendEmail {

    public static void main(String [] args) {

    // 收件人电子邮箱

    String to = "abcd@gmail.com";

    // 发件人电子邮箱

    String from = "web@gmail.com";

    // 指定发送邮件的主机为 localhost

    String host = "localhost";

    // 获取系统属性

    Properties properties = System.getProperties();

    // 设置邮件服务器

    properties.setProperty("mail.smtp.host", host);

    // 获取默认session对象

    Session session = Session.getDefaultInstance(properties);

    try{

    // 创建默认的 MimeMessage 对象

    MimeMessage message = new MimeMessage(session);

    // Set From: 头部头字段

    message.setFrom(new InternetAddress(from));

    // Set To: 头部头字段

    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

    // Set Subject: 头部头字段

    message.setSubject("This is the Subject Line!");

    // 设置消息体

    message.setText("This is actual message");

    // 发送消息

    Transport.send(message);

    System.out.println("Sent message successfully....");

    }catch (MessagingException mex) {

    mex.printStackTrace();

    }

    }

    }

    三、Java 多线程编程:

    Java提供内置的多线程编程支持。一条线程指的是进程中一个单一顺序的控制流。一个进程中可以并发多个线程。每个线程执行不同的任务。一个线程不能独立存在,必须是进程的一部分。

    线程的声明周期:

    ◆ 新建状态:使用new关键字和thread类或其子类建立一个线程后,该线程处于新建状态。

    ◆ 就绪状态:现成对象调用start()方法后,就进入就绪状态。

    ◆ 运行状态:现成获取CPU资源,执行run(),进入运行状态。

    ◆ 阻塞状态:现成执行sleep()、suspend()等方法,失去占用资源,进入阻塞状态。

    ◆ 终止状态:现成完成任务或终止条件发生,该线程进入终止状态。

    现成的优先级:

    Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)

    创建线程的方法:

    ◆ 通过Runnable接口;

    ◆ 通过继承thread类本身;

    ◆ 通过callable和future创建线程。

    Thread方法:

    序号

    方法描述

    1

    public void start()
    使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

    2

    public void run()
    如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

    3

    public final void setName(String name)
    改变线程名称,使之与参数 name 相同。

    4

    public final void setPriority(int priority)
     更改线程的优先级。

    5

    public final void setDaemon(boolean on)
    将该线程标记为守护线程或用户线程。

    6

    public final void join(long millisec)
    等待该线程终止的时间最长为 millis 毫秒。

    7

    public void interrupt()
    中断线程。

    8

    public final boolean isAlive()
    测试线程是否处于活动状态。

    Thread的静态方法:

    序号

    方法描述

    1

    public static void yield()
    暂停当前正在执行的线程对象,并执行其他线程。

    2

    public static void sleep(long millisec)
    在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

    3

    public static boolean holdsLock(Object x)
    当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。

    4

    public static Thread currentThread()
    返回对当前正在执行的线程对象的引用。

    5

    public static void dumpStack()
    将当前线程的堆栈跟踪打印至标准错误流。

  • 相关阅读:
    【数据结构初阶】树&&二叉树
    08-JVM垃圾收集器详解
    Linux进程通信
    致敬最美逆行者网页设计作品 大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载
    注解案例:山寨Junit与山寨JPA
    基于Matlab使用地面雷达探测和跟踪LEO卫星星座仿真(附源码)
    Vue基础4
    ThreadPoolExecutor 线程池参数详解,执行流程
    计算机的硬件组成
    LVS负载均衡群集
  • 原文地址:https://blog.csdn.net/corlin6688/article/details/134549009