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连接的步骤:
- 服务器实例化ServerSocket对象,表示通过服务器上的端口通信;
- 服务器调用ServerSocket类的accept()方法,等待客户端连接到服务器上给定的端口;
- 服务器等待时,客户端实例化Socket对象,指定服务器的名称和端口号来请求连接;
- Socket类的构造函数将客户端连接到指定的服务器和端口号,如果通信被建立,则客户端创建Socket对象与服务器通信。
- 在服务器端,accept()方法返回服务器一个新的Socket引用,该Socket链接客户端的Socket。
- 建立连接后,通过I/O流进行通信,每个Socket都有一个输入流和一个输出流。
ServerSocket类的方法:
| 序号 | 方法描述 |
| 1 | public ServerSocket(int port) throws IOException |
| 2 | public ServerSocket(int port, int backlog) throws IOException |
| 3 | public ServerSocket(int port, int backlog, InetAddress address) throws IOException |
| 4 | public ServerSocket() throws IOException |
ServerSocket类的常用方法:
| 序号 | 方法描述 |
| 1 | public int getLocalPort() |
| 2 | public Socket accept() throws IOException |
| 3 | public void setSoTimeout(int timeout) |
| 4 | public void bind(SocketAddress host, int backlog) |
Socket类的构造方法:
| 序号 | 方法描述 |
| 1 | public Socket(String host, int port) throws UnknownHostException, IOException. |
| 2 | public Socket(InetAddress host, int port) throws IOException |
| 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() |
| 序号 | 方法描述 |
| 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() |
| 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) |
| 2 | static InetAddress getByAddress(String host, byte[] addr) |
| 3 | static InetAddress getByName(String host) |
| 4 | String getHostAddress() |
| 5 | String getHostName() |
| 6 | static InetAddress getLocalHost() |
| 7 | String toString() |
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. |
| 2 | public URL(String protocol, String host, String file) throws MalformedURLException |
| 3 | public URL(String url) throws MalformedURLException |
| 4 | public URL(URL context, String url) throws MalformedURLException |
| 序号 | 方法描述 |
| 1 | public String getPath() |
| 2 | public String getQuery() |
| 3 | public String getAuthority() |
| 4 | public int getPort() |
| 5 | public int getDefaultPort() |
| 6 | public String getProtocol() |
| 7 | public String getHost() |
| 8 | public String getFile() |
| 9 | public String getRef() |
| 10 | public URLConnection openConnection() throws IOException |
URLConnections类方法:
| 序号 | 方法描述 |
| 1 | Object getContent() |
| 2 | Object getContent(Class[] classes) |
| 3 | String getContentEncoding() |
| 4 | int getContentLength() |
| 5 | String getContentType() |
| 6 | int getLastModified() |
| 7 | long getExpiration() |
| 8 | long getIfModifiedSince() |
| 9 | public void setDoInput(boolean input) |
| 10 | public void setDoOutput(boolean output) |
| 11 | public InputStream getInputStream() throws IOException |
| 12 | public OutputStream getOutputStream() throws IOException |
| 13 | public URL getURL() |
二、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() |
| 2 | public void run() |
| 3 | public final void setName(String name) |
| 4 | public final void setPriority(int priority) |
| 5 | public final void setDaemon(boolean on) |
| 6 | public final void join(long millisec) |
| 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) |
| 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++学习 --文件
文件操作步骤: 1, 包含头文件#include<fstream> 2, 创建流对象:ofstream ofs 3, 打开文件:ofs.open("文件路径", 打开方式) 4, 写数据: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执行失败, 首先检查权限,没有发现问题,然后手动执行一遍又报错"-ba…...
【文末送书】十大排序算法C++代码实现
欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…...
vue-waterfall2 实现瀑布流,及总结的问题
注意:引入需要在主界面引入,直接在组件中引用会有问题 1.安装 npm install vue-waterfall21.8.20 --save (提示:一定要安装1.8.20,最新版会有一部分问题) 2.打开main.js文件 import waterfall from v…...
grafana二次启动失败
背景 安装grafana后启动使用正常,但是关机后再启动显示启动失败,但是看日志又没有报错信息,但是就是启动不了 原因分析 其实是/var/lib/grafana/grafana.db文件损坏了,所以需要把这个文件删掉之后重新启动就正常了,…...
C/C++杂谈-printf的可变参数机制
C/C杂谈-printf的可变参数机制 文章目录 C/C杂谈-printf的可变参数机制printf的使用printf的源码源码剖析 多参数实现机制原理 C11引入了可变参数模板机制,对模板参数进行了高度泛化,但是对于可变参数其实C语言学习中早已遇到过,那就是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,成立于1919年,是一家全球领先的综合性零售企业,总部位于英国。公司致力于提供高质量、多样化的商品和服务,以满足客户的需求。Tesco的使命是通过创新和卓越的客户服务,为客户创造更美好的生活。多年来࿰…...
html常用的标签
基本结构标签 <!DOCTYPE>: 定义 HTML 文档类型。<html>: HTML 文档的根元素。<head>: 文档的头部,包含了元数据和引用的外部资源。<title>: 定义网页标题,显示在浏览器标签上。&l…...
护眼灯什么价位的好?适合学生入手的护眼台灯推荐
据60年前的统计,中国人口的近视率约为10%至20%。 国家卫健委发布的中国首份眼健康白皮书显示,我国小学生近视率为47.2%,初中生近视率为75.8%,大学生近视率超过90%。如今,“低头族”随处可见,近视人群日益增…...
大数据架构
大数据架构 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-使用签名消息情况下…...
深入解析MPC-BE:Windows平台终极开源媒体播放器的5大核心技术架构
深入解析MPC-BE:Windows平台终极开源媒体播放器的5大核心技术架构 【免费下载链接】MPC-BE MPC-BE – универсальный проигрыватель аудио и видеофайлов для операционной системы Windows. 项…...
Silvaco TCAD光源设置保姆级教程:从2D高斯光束到3D复杂光源,手把手搞定光电器件仿真
Silvaco TCAD光源设置实战指南:从基础参数到高级光学仿真技巧 在光电器件仿真领域,光源设置是决定模拟结果准确性的关键环节。无论是研究太阳能电池的光电转换效率,还是分析光电探测器的响应特性,精确的光源配置都能为仿真提供可靠…...
FPGA与EtherSound在专业音频设备中的低延迟实现
1. FPGA与EtherSound技术概述在专业音频设备开发领域,实时性和信号保真度是两大核心诉求。传统基于通用处理器的架构往往难以同时满足这两点要求,而FPGA(现场可编程门阵列)因其独特的硬件可编程特性和并行计算能力,正逐…...
mdbook-ai-skill实战:用AI为技术文档注入智能摘要与问答能力
1. 项目概述与核心价值 最近在整理技术文档和项目笔记时,我一直在寻找一种更高效、更智能的文档处理方式。传统的静态站点生成器虽然好用,但面对海量的Markdown文件,想要快速生成摘要、进行问答,或者仅仅是理清文档脉络࿰…...
揭秘AI系统提示词:从原理到实践,掌握AI交互设计核心
1. 项目概述与核心价值 如果你和我一样,每天都在和各种各样的AI助手打交道,从ChatGPT、Claude到Gemini,再到集成在IDE里的GitHub Copilot,那你肯定有过这样的困惑:为什么同一个问题,在不同平台、不同模式下…...
C++BFS广度优先搜索全解
广度优先搜索(BFS)基础概念广度优先搜索是一种用于遍历或搜索树或图的算法。它从根节点开始,逐层访问所有相邻节点,直到找到目标节点或遍历完整个结构。BFS通常使用队列数据结构来实现,确保先访问的节点先被处理。BFS的…...
AI趣味工具“寻根”:用分层匹配与可信度标签连接现代人与商朝历史
1. 项目概述:一个让历史“活”过来的AI趣味工具你有没有想过,自己姓氏的源头,可能比秦始皇统一六国还要早一千年?当我们在谈论“寻根问祖”时,常常会追溯到明清时期的族谱,但“寻根”(Xungen&am…...
告别CPU瓶颈:手把手教你用Android Hardware Buffer打通OpenGL与NCNN Vulkan
告别CPU瓶颈:手把手教你用Android Hardware Buffer打通OpenGL与NCNN Vulkan 在移动端AI应用开发中,GPU加速已成为提升性能的关键手段。然而,当我们需要在OpenGL渲染管线与NCNN推理引擎之间传递数据时,传统的CPU拷贝方式往往会成为…...
OpenClaw Skills:模块化开发者技能库与自动化工具箱实践指南
1. 项目概述:一个面向开发者的技能库与自动化工具箱最近在GitHub上看到一个挺有意思的项目,叫Lazily01/openclaw-skills。乍一看这个标题,可能会有点摸不着头脑——“OpenClaw”是什么?“Skills”又具体指什么?但作为一…...
AISMM自评估工具究竟如何判定“智能奇点临近”?——独家披露5类隐性失效模式与3类高危误判信号
更多请点击: https://intelliparadigm.com 第一章:AISMM自评估工具的核心定位与奇点判定范式演进 AISMM(Artificial Intelligence Security Maturity Model)自评估工具并非传统合规检查清单的数字化复刻,而是面向AI系…...
