目录
一、Java网络API
1、InetAddress类
2、URL类
3、URLConnection类
4、URLDecoder类和URLEncoder类
二、基于TCP的网络编程
1、Socket类
2、ServerSocket类
三、网络通信过程
Java中有关网络方面的功能都定义在java.net中。
Java中使用InetAddress类封装IP地址或域名,InetAddress类没有构造方法,因此不能创建对象,一般采用下面的定义方法:
InetAddress localip=InetAddress.getLocalHost(); 利用类内方法
在使用调用网络api时,注意要添加异常机制,异常对象使用IOException,大多数异常都继承于输入输出流异常。
InetAddress常用方法:
调用上述方法的实例:
注意,对于特定域名,以及特定ip的不同初始化的方法,byte要小写。
import java.io.IOException;
import java.net.*;
public class api {
public static void main(String[] args)
{
try{
InetAddress localip=InetAddress.getLocalHost();
System.out.println(localip.getHostName()); //主机名字
System.out.println(localip.getCanonicalHostName()); //全限定域名
System.out.println(localip.getHostAddress()); //主机对应ip
System.out.println(localip.toString()); //将ip和名字结合的show方法
System.out.println(localip.isReachable(5000)); //ping一下ip
System.out.println("-----------------------");
InetAddress baidu=InetAddress.getByName("www.baidu.com");
System.out.println(baidu.toString());
System.out.println(baidu.isReachable(5000));
System.out.println("-----------------------");
InetAddress orient=InetAddress.getByAddress(new byte[]{127,0,0,1}); //注意这种写法
System.out.println(orient.toString());
System.out.println(orient.isReachable(5000));
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
URL表示互联网某一资源的地址,由协议名、主机、端口和资源四个部分组成,语法如下:
protocol://host:port/resourceName
Java将URL封装成URL类,通过URL对象调用方法,可以获取URL的内部信息,就是拆解URL,而不是去访问URL。(URL在jdk 20版本已经被删掉了)
URLConnection代表与URL指定的数据源的动态连接,允许使用POST或PUT和其他HTTP请求方法将数据送回服务器。
URLConnection常用方法:
下面代码实例为访问网站,并将网站信息写在txt文件:
其中,先运用IO的知识,通过File类确定是否存在保存文件1.txt若没有则生成该文件。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class url {
public static void main(String[] args)
{
//不存在文件则创建一个文件
File file=new File("src/net/1.txt");
try{
file.createNewFile();
}
catch(IOException e)
{
e.printStackTrace();
}
//访问网址,并写入文件
FileWriter fw=null;
try{
URL url=new URL("https://blog.csdn.net/m0_60177079/article/details/135175601?spm=1001.2014.3001.5501");
URLConnection urlc=url.openConnection();
urlc.setRequestProperty("Char", "UTF-8");
BufferedReader br=new BufferedReader(new InputStreamReader(urlc.getInputStream()));
String input;
fw=new FileWriter("src/net/1.txt");
while((input=br.readLine())!=null)
{
fw.write(input);
}
}
catch(IOException E)
{
E.printStackTrace();
}
finally
{
try{
fw.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
}
存在非西欧字符串时系统会将字符串转换成application/x-www-form-urlencoded MIME字符串,相对比的为普通字符串,那么在这两者之间转换的方法就是URLDecoder类中的decode方法和URLEncoder类中的encode方法。
Java对于TCP网络通信提供了封装,使用Socket对象封装了通信两端的通信端口,Socket允许应用程序将网络连接当成一个IO流。
Java.net中包含使用的两种Socket,ServerSocket(服务器套接字)和Socket(客户端套接字)
通过Socket类来连接服务器(当前文件作为客户端),构造方法如下:
Socket socket=new Socket("127.0.0.1",28888);
Socket常用方法:
客户端通信具体步骤:
(1)创建一个Socket对象
(2)调用getOutputStream()方法,往Socket中写数据,一般使用new PrintStream(socket.getOutputStream()),并调用PrintStream的println方法输出到服务器端。
(3)调用getInputStream()方法,从Socket中读数据,一般用new BufferedReader(new InputStreamReader(socket.getInputStream())),通过调用BufferedReader的readline方法,返回服务器的信息,输出到客户端。
(4)客户端与服务器根据协议进行交互,直到关闭连接,期间可以对于PrintStream和BufferedReader所创建的ps和br对象进行flush操作,清除缓冲区。
(5)关闭客户端的Socket
ServerSocket是服务器套接字,运行在服务器端,通过指定端口主动监听来自客户端的Socket连接。
创建ServerSocket对象:
try{
server=new ServerSocket(28888);
}
catch(IOException e)
{
e.printStackTrace();
}
服务器端需要继承于线程类,并在构造方法中,通过start方法,运行线程,并重新run方法。
ServerSocket常用方法:
根据ServerSocket进行网络通信的具体步骤:
(1)建立ServerSocket对象
(2)调用ServerSocket对象的accept()方法接收客户端发送的Socket对象
(3)调用getInputStream()方法,从Socket中读数据,一般用new BufferedReader(new InputStreamReader(socket.getInputStream())),通过调用BufferedReader的readline方法,返回服务器的信息,输出到服务器端。
(4)调用getOutputStream()方法,往Socket中写数据,一般使用new PrintStream(socket.getOutputStream()),并调用PrintStream的println方法输出到客户端。
(5)服务器与客户端根据一定的协议交互,知道关闭连接
(6)关闭服务器端的Socket
(7)回到第二步,重新监听下一次客户端发送的Socket请求连接。
使用Socket进行基于C/S架构的网络通信程序设计过程:
(1)服务器端通过某个端口监听是否有客户端发送Socket连接请求
(2)客户端向服务端发出一个Socket连接请求
(3)服务器端调用accept()接收客户端Socket并建立连接
(4)通过调用Socket对象的getInputStream()/getOutputStream()方法进行IO流操作,服务器与客户端进行信息交互
(5)关闭服务器端和客户端的Sokcet
C/S过程代码:
服务器端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server extends Thread{
ServerSocket server;
int num=0;
public Server(){ //构造ServerSocket服务器端套接字类
try{
server=new ServerSocket(28888);
}
catch(IOException e)
{
e.printStackTrace();
}
this.start(); //线程启动
System.out.println("Server start!");
}
public void run()
{
while(this.isAlive()) //是否存在线程
{
BufferedReader br=null;
PrintStream ps=null;
try{
Socket socket=server.accept(); //监听
br=new BufferedReader(new InputStreamReader(socket.getInputStream())); //向客户端输入
String line=br.readLine();
System.out.println(line);
ps=new PrintStream(socket.getOutputStream()); //输出到服务器端
ps.println("你是第"+(num++)+"个用户");
ps.flush();
br.close();
ps.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
new Server(); //启动一个Server类
}
}
客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class Cilent {
public static void main(String[] args)
{
BufferedReader br=null;
PrintStream ps=null;
try{
Socket socket=new Socket("127.0.0.1",28888); //本机28888端口构造Socket套接字类
ps=new PrintStream(socket.getOutputStream()); //输出到客户端
ps.println("hello world!");
ps.flush();
br=new BufferedReader(new InputStreamReader(socket.getInputStream())); //输入到服务器端
String line=br.readLine();
System.out.println("From Server:");
System.out.println(line);
br.close();
ps.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
参考书籍:《Java 8 基础应用与开发》QST青软实训编