当前位置: 首页 > news >正文

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()
将当前线程的堆栈跟踪打印至标准错误流。

相关文章:

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

一、Java 网络编程: 网络编程时指编写运行在多个设备的程序,这些设备通过网络连接起来。 Java.net包中的J2SE的API包含有类和接口,提供低层次的通信细节。 java.net 包中提供了两种常见的网络协议的支持: TCP:TCP&…...

为虚幻引擎开发者准备的Unity指南

目录 1.前言2.编辑器2.1 Scene 视图(视口)2.2 Game 视图 (Play in Editor)2.3.Hierarchy 窗口 (World Outliner)2.4 Project 窗口(Content Browser)2.5 Inspector (Details)2.6 Console(消息视图/输出日志)2.7 Modes 面板在哪里&a…...

Vue 2使用element ui 表格不显示

直接修改package.json文件 把这两个依赖修改成对应的 删除node_modules 重新安装依赖 重启...

C++学习 --文件

文件操作步骤&#xff1a; 1&#xff0c; 包含头文件#include<fstream> 2&#xff0c; 创建流对象&#xff1a;ofstream ofs 3&#xff0c; 打开文件&#xff1a;ofs.open("文件路径"&#xff0c; 打开方式) 4&#xff0c; 写数据&#xff1a;ofs <<…...

java/Android:将字符串按数量分割

分割成数组 import java.util.Arrays;/*** Java将字符串按照指定长度分割成字符串数组*/ public class StringUtils {public static void main(String[] args){String data "227d77a7a244c7b2be3180f2d46be352f56ddf92866692f2cac797358097e5a3e90f6d20bb96bc516a4ab9c0…...

JVM 监控命令详解

文章目录 JDK 中与常用命令行工具jpsjstatjinfojmap导出 dump 文件查看堆内存信息 jstack JVM 可视化分析工具 JDK 中与常用命令行工具 jps 查看当前服务器正在执行的 Java 进程 $> jps 7584 Application 16433 AdminApplication 14209 Jps 5813 Bootstrap 5575 TestApplic…...

TEE威胁评分与评级

目录 一、攻击潜力 1.1 攻击潜力网格 1、实际经过的时间: 2、访问TOE(目标设备)...

-bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directory

文章目录 场景解决 场景 jenkins 发布失败, 报错ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [126]], 这说明远程服务器的deploy.sh执行失败, 首先检查权限&#xff0c;没有发现问题&#xff0c;然后手动执行一遍又报错"-ba…...

【文末送书】十大排序算法C++代码实现

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…...

vue-waterfall2 实现瀑布流,及总结的问题

注意&#xff1a;引入需要在主界面引入&#xff0c;直接在组件中引用会有问题 1.安装 npm install vue-waterfall21.8.20 --save &#xff08;提示&#xff1a;一定要安装1.8.20&#xff0c;最新版会有一部分问题&#xff09; 2.打开main.js文件 import waterfall from v…...

grafana二次启动失败

背景 安装grafana后启动使用正常&#xff0c;但是关机后再启动显示启动失败&#xff0c;但是看日志又没有报错信息&#xff0c;但是就是启动不了 原因分析 其实是/var/lib/grafana/grafana.db文件损坏了&#xff0c;所以需要把这个文件删掉之后重新启动就正常了&#xff0c;…...

C/C++杂谈-printf的可变参数机制

C/C杂谈-printf的可变参数机制 文章目录 C/C杂谈-printf的可变参数机制printf的使用printf的源码源码剖析 多参数实现机制原理 C11引入了可变参数模板机制&#xff0c;对模板参数进行了高度泛化&#xff0c;但是对于可变参数其实C语言学习中早已遇到过&#xff0c;那就是printf…...

es基本语法 (kibana)

#添加 (不添加id默认会生成id) POST /cj/test {"name":"jack","sex":"1","age":12 } #添加 (id为第5个的) POST /cj/test/5 {"name":"jackson","sex":"1","age":12 } #条…...

Tesco EDI需求分析

Tesco&#xff0c;成立于1919年&#xff0c;是一家全球领先的综合性零售企业&#xff0c;总部位于英国。公司致力于提供高质量、多样化的商品和服务&#xff0c;以满足客户的需求。Tesco的使命是通过创新和卓越的客户服务&#xff0c;为客户创造更美好的生活。多年来&#xff0…...

html常用的标签

基本结构标签 <!DOCTYPE>&#xff1a; 定义 HTML 文档类型。<html>&#xff1a; HTML 文档的根元素。<head>&#xff1a; 文档的头部&#xff0c;包含了元数据和引用的外部资源。<title>&#xff1a; 定义网页标题&#xff0c;显示在浏览器标签上。&l…...

4.14每日一题(二元函数求极值:常规方法、先代后求法)

...

护眼灯什么价位的好?适合学生入手的护眼台灯推荐

据60年前的统计&#xff0c;中国人口的近视率约为10%至20%。 国家卫健委发布的中国首份眼健康白皮书显示&#xff0c;我国小学生近视率为47.2%&#xff0c;初中生近视率为75.8%&#xff0c;大学生近视率超过90%。如今&#xff0c;“低头族”随处可见&#xff0c;近视人群日益增…...

大数据架构

大数据架构 https://huaweicloud.csdn.net/633578fed3efff3090b58398.html https://blog.csdn.net/yuanziok/article/details/117030031 https://blog.csdn.net/qq_46675545/article/details/121985987 https://blog.csdn.net/qq_33367934/article/details/127685417 https://b…...

【Linux】C文件系统详解(四)——磁盘的物理和抽象结构

文章目录 磁盘结构磁盘物理结构磁盘的具体物理结构磁盘结构的逻辑抽象 文件系统BootBlockSuperBlockGroupDescriptorTableinode tableDataBlocksinodeBitmapblockBitmaplinux中的inode 和文件名如何理解文件的增删查改删 补充细节1.如果文件误删了,我们该怎么办?2.inode确定分…...

论文-分布式-拜占庭将军问题

目录 0-前言 1-导引 2-不可能性 3将军(1叛徒)问题不存在解/不能达成共识 少于3m1个将军(有m个叛徒)不存在解/不能达成共识 精确一致性与近似一致性是同等困难的 3-使用口头消息的解 “口头消息”的含义 OM(m)算法的步骤 OM(m)算法的正确性推导 4-使用签名消息情况下…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...