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 = "[email protected]";

// 发件人电子邮箱

String from = "[email protected]";

// 指定发送邮件的主机为 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,java,网络,开发语言)