一. Java网络相关API的应用
1. InetAddress类的应用
InetAddress类用于标识网络上的硬件资源,主要用来表示互联网协议(IP)地址的相关信息。
因为InetAddress类没有构造方法,所以不能直接new一个新的实例。我们可以通过InetAddress类中的一些静态方法来获取到一个实例。
InetAddress address = InetAddress.getLocalHost(); //获取本机信息,返回一个InetAddress类的实例。
InetAddress address = InetAddress.getByName(); //根据机器名获取信息,返回一个InetAddress类的实例。
获取到实例之后就可以利用InetAddress中的方法去获取需要的信息。
address.getHostName(); //获取主机名
address.getHostAddress(); //获取IP地址
2. URL类的应用
URL(Uniform Resource Locator) 统一资源定位符,实际上就是表示Internet上的某一个资源的地址,即俗称的网址。
URL由两部分组成:
一部分是协议名称,另一部分叫资源名称。它们之间用冒号( : )隔开。
要使用URL类,第一步就是先创建一个URL类的实例。
URL url = new URL("http://blog.csdn.net/czb1n"); //根据一个资源字符串来创建一个URL类的实例。
URL url2 = new URL(url,"/article"); //通过已有的URL实例来创建一个新的URL类的实例。也可以通过使用问号(?)来传参数,用井号(#)来指定锚点。
创建好实例之后就可以通过URL类中的方法来获取需要的信息。
url.getProtocol(); //获取协议信息
url.getHost(); //获取主机信息
url.getPort(); //获取端口号信息。这里需要注意的是如果url没有指定端口号的情况下,则使用默认的端口号,但此时getPort()方法的返回值为-1。
url.getPath(); //获取文件路径
url.getRef(); //获取文件的相对路径
url.getFile(); //获取文件名
url.getQuery(); //获取查询字符串
还可以用URL类来读取网页上的内容,通过URL对象中的openStream()方法可以得到一个指定资源的字节输入流(InputStream),通过输入流可以读取和访问网络上的数据。
InputStream is = url.openStream(); //获取指定资源的字节输入流
InputStreamReader isr = new InputStreamReader(is, "utf-8"); //把字节输入流转换为字符输入流并指定字符集
BufferedReader br = new BufferedReader(isr); //为字符输入流添加缓冲
利用一个循环每次读取一行来读取网页的数据。
String data = null;
while((data = br.readLine()) != null){
System.out.println(data);
data = br.readLine();
}
读取完毕之后需要把相应的资源和输入流关闭。
br.close();
isr.close();
is.close();
二. 通过 Socket 实现 TCP 编程
TCP(Transmission Control Protocol)传输控制协议是面向连接、可靠的、有序的、以字节流的方式发送数据。基于TCP协议实现网络通信的类有两个:
客服端的Socket类,服务器端的ServerSocket类。
Socket的通信模型:
使用Socket通信实现的步骤:
1. 服务器端:
ServerSocket serverSocket = new ServerSocket(8888); //创建ServerSocket,指定绑定并监听端口。
Socket socket = serverSocket.accept();
//调用accept()方法开始监听端口,一旦调用这个方法即进入阻塞状态,等待客户端的连接返回一个Socket的实例。
//客户端连接后,用Socket对象中的getInputStream()方法获取到一个字节输入流并读取客户端信息。
InputStream is = socket.getInputStream(); //获取字节输入流
InputStreamReader isr = new InputStreamReader(is) //将字节输入流转换为字符输入流
BufferedReader br = new BufferedReader(isr) //为字符输入流添加缓冲
利用一个循环每次读取一行来读取客户端发送过来的信息。
String data = null;
while((data = br.readLine()) != null){
System.out.println(data);
data = br.readLine();
}
读取完毕之后需要把相应的资源和输入流关闭。
socket.shutdownInput();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
2. 客户端:
Socket socket = new Socket("localhost", 8888); //指定服务器地址和端口号,创建一个客户端Socket,用来给服务器端发送信息。
OutputStream os = socket.getOutputStream(); //获取一个字节输出流,用来给服务器端发送信息。
PrintWriter pw = new PrintWriter(os); //将字节输出流包装为打印流
pw.write("my name is czb1n!"); //发送信息
pw.flush(); //刷新缓存
读取完毕之后需要把相应的资源和输入流关闭。
socket.shutdownOutput();
pw.close();
os.close();
socket.close();
三. 通过 Socket 实现 UDP 编程
UDP(User Datagram Protocol)用户数据报协议是无连接、不可靠的、无序的、以数据报(Datagram)作为数据传输的载体。和TCP协议一样,基于UDP协议实现网络通信的类有两个:
数据报包DatagramPacket类,进行端到端通信的DatagramSocket类。
使用Socket通信实现的步骤:
1. 服务器端:
DatagramSocket socket = new DatagramSocket(8888); //创建服务器端DatagramSocket并指定端口
byte[] data = new byte[1024]; //创建一个指定大小的字节数组用于存储数据
DatagramPacket packet = new DatagramPacket(data, data.length); //创建数据报包,用于接收客户端发送的数据
socket.receive(packet); //接收客户端发送的数据,和accept()方法一样,一旦调用这个方法在接收到数据报之前会一直进入阻塞状态。
String info = new String(data, 0, packet.getLength()); //读取数据,把字节数组接收到的数据转换为String
//packet.getAddress(); 获取客户端的地址
//packet.getPort(); 获取客户端的端口号
2. 客户端:
InetAddress address = InetAddress.getByName("localhost"); //根据主机名获得服务器的信息
int port = 8888; //指定与服务器相同的端口号
byte[] data = "my name is czb1n!".getBytes(); //把要发送的信息存储在字节数组
DatagramPacket packet = new DatagramPacket(data, data.length, address, port); //创建一个包含发送的数据信息的数据报
DatagramSocket socket = new DatagramSocket(); //创建一个DatagramSocket对象实例来发送信息
socket.send(packet); //发送数据报
以上TCP协议方式和UDP协议方式都仅实现了一个服务器端对一个客户端之间的通信,可以应用多线程来实现服务器端和多个客户端之间的通信。
Keep Going…