当前位置: 首页 > 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-使用签名消息情况下…...

深入解析MPC-BE:Windows平台终极开源媒体播放器的5大核心技术架构

深入解析MPC-BE&#xff1a;Windows平台终极开源媒体播放器的5大核心技术架构 【免费下载链接】MPC-BE MPC-BE – универсальный проигрыватель аудио и видеофайлов для операционной системы Windows. 项…...

Silvaco TCAD光源设置保姆级教程:从2D高斯光束到3D复杂光源,手把手搞定光电器件仿真

Silvaco TCAD光源设置实战指南&#xff1a;从基础参数到高级光学仿真技巧 在光电器件仿真领域&#xff0c;光源设置是决定模拟结果准确性的关键环节。无论是研究太阳能电池的光电转换效率&#xff0c;还是分析光电探测器的响应特性&#xff0c;精确的光源配置都能为仿真提供可靠…...

FPGA与EtherSound在专业音频设备中的低延迟实现

1. FPGA与EtherSound技术概述在专业音频设备开发领域&#xff0c;实时性和信号保真度是两大核心诉求。传统基于通用处理器的架构往往难以同时满足这两点要求&#xff0c;而FPGA&#xff08;现场可编程门阵列&#xff09;因其独特的硬件可编程特性和并行计算能力&#xff0c;正逐…...

mdbook-ai-skill实战:用AI为技术文档注入智能摘要与问答能力

1. 项目概述与核心价值 最近在整理技术文档和项目笔记时&#xff0c;我一直在寻找一种更高效、更智能的文档处理方式。传统的静态站点生成器虽然好用&#xff0c;但面对海量的Markdown文件&#xff0c;想要快速生成摘要、进行问答&#xff0c;或者仅仅是理清文档脉络&#xff0…...

揭秘AI系统提示词:从原理到实践,掌握AI交互设计核心

1. 项目概述与核心价值 如果你和我一样&#xff0c;每天都在和各种各样的AI助手打交道&#xff0c;从ChatGPT、Claude到Gemini&#xff0c;再到集成在IDE里的GitHub Copilot&#xff0c;那你肯定有过这样的困惑&#xff1a;为什么同一个问题&#xff0c;在不同平台、不同模式下…...

C++BFS广度优先搜索全解

广度优先搜索&#xff08;BFS&#xff09;基础概念广度优先搜索是一种用于遍历或搜索树或图的算法。它从根节点开始&#xff0c;逐层访问所有相邻节点&#xff0c;直到找到目标节点或遍历完整个结构。BFS通常使用队列数据结构来实现&#xff0c;确保先访问的节点先被处理。BFS的…...

AI趣味工具“寻根”:用分层匹配与可信度标签连接现代人与商朝历史

1. 项目概述&#xff1a;一个让历史“活”过来的AI趣味工具你有没有想过&#xff0c;自己姓氏的源头&#xff0c;可能比秦始皇统一六国还要早一千年&#xff1f;当我们在谈论“寻根问祖”时&#xff0c;常常会追溯到明清时期的族谱&#xff0c;但“寻根”&#xff08;Xungen&am…...

告别CPU瓶颈:手把手教你用Android Hardware Buffer打通OpenGL与NCNN Vulkan

告别CPU瓶颈&#xff1a;手把手教你用Android Hardware Buffer打通OpenGL与NCNN Vulkan 在移动端AI应用开发中&#xff0c;GPU加速已成为提升性能的关键手段。然而&#xff0c;当我们需要在OpenGL渲染管线与NCNN推理引擎之间传递数据时&#xff0c;传统的CPU拷贝方式往往会成为…...

OpenClaw Skills:模块化开发者技能库与自动化工具箱实践指南

1. 项目概述&#xff1a;一个面向开发者的技能库与自动化工具箱最近在GitHub上看到一个挺有意思的项目&#xff0c;叫Lazily01/openclaw-skills。乍一看这个标题&#xff0c;可能会有点摸不着头脑——“OpenClaw”是什么&#xff1f;“Skills”又具体指什么&#xff1f;但作为一…...

AISMM自评估工具究竟如何判定“智能奇点临近”?——独家披露5类隐性失效模式与3类高危误判信号

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AISMM自评估工具的核心定位与奇点判定范式演进 AISMM&#xff08;Artificial Intelligence Security Maturity Model&#xff09;自评估工具并非传统合规检查清单的数字化复刻&#xff0c;而是面向AI系…...