InetAddress类
- InetAddress类主要表示IP地址,两个子类:Inet4Address、Inet6Address。
- InetAddress 类没有提供公共的构造器,而是提供了如下几个静态方法来获取
InetAddress实例:public static InetAddress getLocalHost()和public static InetAddress getByName(String host)。 - InetAddress 提供了如下几个常用的方法:
①public String getHostAddress() :返回 IP 地址字符串。
②public String getHostName() :获取此 IP 地址的主机名。
③public boolean isReachable(int timeout):测试是否可以达到该地址。
InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress);//www.baidu.com/36.152.44.96
System.out.println(inetAddress.getHostAddress());//36.152.44.96
System.out.println(inetAddress.getHostName());//www.baidu.com
System.out.println(inetAddress.isReachable(100));//true
套接字Socket
- 分类:
①流套接字(stream socket):使用TCP提供可依赖的字节流服务。
②数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务。
TCP网络编程
- 通信模型如下图:
public class TCPServer {
public static void main(String[] args) throws IOException {
//调用ServerSocket(int port):创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
ServerSocket serverSocket = new ServerSocket(8888);
//让服务器一直处于监听状态。
while (true){
new Thread(new Runnable() {
@Override
public void run() {
Socket socket = null;
try {
//调用accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
socket = serverSocket.accept();
System.out.println("客户端连接成功");
//调用该Socket类对象的getOutputStream()和getInputStream():获取输出流和输入流,开始网络数据的发送和接收。
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
while ((len = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
outputStream.write("成功接收".getBytes());
outputStream.flush();
}catch (IOException e){
e.printStackTrace();
}finally {
//关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
if(null != socket){
try {
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}).start();
}
}
}
public class TCPClient {
public static void main(String[] args) throws IOException {
//创建Socket:根据指定服务端的IP地址和端口号构造Socket类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
Socket socket = new Socket("192.168.56.10",8888);
//打开连接到Socket的输入/出流:使用getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输。
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
//按照一定的协议对Socket进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线路。
outputStream.write("你好,服务器!!!".getBytes());
outputStream.flush();
socket.shutdownOutput();
byte[] bytes = new byte[1024];
int len;
while ((len = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
//关闭Socket:断开客户端到服务器的连接,释放线路。
socket.close();
}
}
UDP网络编程
- 类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
- UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
- DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
- UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。
DatagramSocket 类
- 常用方法:
DatagramPacket 类
- 常用方法:
/**
* (1)DatagramSocket与DatagramPacket
* (2)建立发送端,接收端
* (3)建立数据包
* (4)调用Socket的发送、接收方法
* (5)关闭Socket
*/
public class UDPSender {
public static void main(String[] args) {
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket();
byte[] bytes = "你好,receiver".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length, InetAddress.getByName("localhost"),8888);
datagramSocket.send(datagramPacket);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != datagramSocket){
datagramSocket.close();
}
}
}
}
public class UDPReceiver {
public static void main(String[] args) {
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket(8888);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
datagramSocket.receive(datagramPacket);
System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()) + "\t" + datagramPacket.getAddress());
} catch (Exception e) {
e.printStackTrace();
} finally {
if(null != datagramSocket){
datagramSocket.close();
}
}
}
}
URL编程
URL类
URL的基本结构由如下几个部分组成:< 传输协议>://< 主机名>:< 端口号>/< 文件路径>?请求参数# 片段名
-
构造器:
①public URL (String spec) 通过给定的URL字符串创建URL。
②public URL(URL context, String spec) 使用基地址和相对URL创建。
③public URL(String protocol, String host, String file) 使用指定的协议、主机名、文件名创建URL,端口使用协议的默认端口。
④public URL(String protocol, String host, int port, String file) 通过给定的参数(协议、主机名、端口号、文件名)创建URL。 -
常用方法:
①public String getProtocol( ) 获取该URL的协议名。
②public String getHost( ) 获取该URL的主机名。
③public String getPort( ) 获取该URL的端口号。
④public String getPath( ) 获取该URL的文件路径。
⑤public String getFile( ) 获取该URL的文件名。
⑥public String getQuery( ) 获取该URL的查询名。
URL url = new URL("http://localhost:8080/examples/myTest.txt?username=张三");
System.out.println("getProtocol() :"+url.getProtocol());//http
System.out.println("getHost() :"+url.getHost());//localhost
System.out.println("getPort() :"+url.getPort());//8080
System.out.println("getPath() :"+url.getPath());// /examples/myTest.txt
System.out.println("getFile() :"+url.getFile());// /examples/myTest.txt?username=张三
System.out.println("getQuery() :"+url.getQuery());// username=张三
URLConnection 类
表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection() 生成对应的URLConnection对象。如果连接过程失败,将产生IOException。通过URLConnection对象获取的输入流和输出流,即可以与现有的公共网关接口程序进行交互。
try{
URL url = new URL("http://www.baidu.com");
URLConnection urlConnection = url.openConnection();
HttpURLConnection connection = null;
if(urlConnection instanceof HttpURLConnection) {
connection = (HttpURLConnection) urlConnection;
} else {
System.out.println("请输入URL地址");
return;
}
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String urlString = "";
String current;
while((current = in.readLine()) != null){
urlString += current;
}
System.out.println(urlString);
}catch(IOException e){
e.printStackTrace();
}