网络编程
1. IP
IP是用来定位互联网中的每一个节点,域名是IP的字符变现形式,通过DNS服务器实现这一功能。
注:192.168.0.0~192.168.255.255范围是非注册IP,供组织内部使用。
代码:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class NetDemo01 {
public static void main(String[] args) throws UnknownHostException {
//getLocalHost() 返回本地主机的地址
InetAddress id1 = InetAddress.getLocalHost();
System.out.println(id1);
//getHostName() 获取此IP地址的主机名
System.out.println(id1.getHostName());
//getLocalHost() 返回本地主机的地址
System.out.println(id1.getHostAddress());
//getByName(String host) 根据主机名称确定主机的IP地址
InetAddress id2 = InetAddress.getByName("www.jd.com");
System.out.println(id2);
System.out.println(id2.getHostName());
System.out.println(id2.getHostAddress());
}
}
2. 端口
端口是用来区分不同软件的,占2个字节,使用0~65535之间的整数表示,8000以内不建议使用,是预留端口号,同一个协议下端口号不能冲突。常见的端口号有以下几种:
- 80:http协议
- 8080:Tomcat服务器
- 3306:MySQL数据库
- 1521:Oracle数据库
代码:
import java.net.InetSocketAddress;
public class NetDemo02 {
public static void main(String[] args) {
InetSocketAddress i1 = new InetSocketAddress("localhost",9999);
System.out.println(i1);
//getPort() 获取端口号
System.out.println(i1.getPort());
//getAddress() 获取 InetAddress
System.out.println(i1.getAddress());
//getHostName() 获取 hostname
System.out.println(i1.getHostName());
}
}
3. URL
URL为统一资源定位符,是互联网的三大基石之一,另两个为http和html,由协议,域名,端口号,资源组成。
import java.net.MalformedURLException;
import java.net.URL;
public class NetDemo03 {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://www.baidu.com:80/index.html?username=zhangsan&pwd=123#a");
System.out.println(url);
//getFile() 获取此 URL的文件名
System.out.println(url.getFile());
//getHost() 获取此 URL的主机名(如果适用)
System.out.println(url.getHost());
//getPath() 获取此 URL的路径部分
System.out.println(url.getPath());
//getPort() 获取此 URL的端口号
System.out.println(url.getPort());
//getProtocol() 获取此 URL的协议名称
System.out.println(url.getProtocol());
//getQuery() 获取此 URL的查询部分
System.out.println(url.getQuery());
//getRef() 获取此 URL的锚点(也称为“引用”)
System.out.println(url.getRef());
}
}
4. UDP协议
UDP协议可以理解为发送短信,非面向连接,不安全,数据可能丢失,协议简单,效率高,大小有限制,一般不超过60K。
注:UDP协议是基于字节数组传输数据的。
注:Socket套接字相当于传输层为应用层开了一个小口子,TCP和UDP协议就是面向Socket编程,不同协议的Socket实现方式不同。
发送端代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UDPDemo01 {
public static void main(String[] args) throws IOException {
System.out.println("我是发送端!!");
// 1.定义我是发送端 DatagramSocket(int port)
DatagramSocket client = new DatagramSocket(8888);
// 2.准备数据
String msg = "你好!!";
byte[] arr = msg.getBytes();
// 3.打包
DatagramPacket packet = new DatagramPacket(arr,0,arr.length,new InetSocketAddress("localhost",9990));
// 4.发送 send(DatagramPacket p) 从此套接字发送数据报包。
client.send(packet);
// 5.关闭资源
client.close();
}
}
接收端代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPDemo02 {
public static void main(String[] args) throws IOException {
System.out.println("我是接收端!!");
// 1.定义我是接收端 DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口
DatagramSocket server = new DatagramSocket(9990);
// 2.准备包裹,用来接收数据
byte[] arr = new byte[1024];
DatagramPacket packet = new DatagramPacket(arr,0,arr.length);
// 3.阻塞式接收数据 receive(DatagramPacket p) 从此套接字接收数据报包
server.receive(packet);
// 4.处理数据
//getData() 返回数据缓冲区。
//getLength() 返回要发送的数据的长度或接收的数据的长度。
System.out.println(new String(packet.getData()));
// 5.关闭资源
server.close();
}
}
5. TCP协议
TCP协议可以理解为打电话,面向连接,安全可靠,效率低,没有大小限制,基于三次握手。
注:TCP协议是基于字节流传输数据的。
客户端代码:
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class TCPDemo01 {
public static void main(String[] args) throws IOException {
System.out.println("我是客户端!!");
//1.定义客户端 Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
Socket client = new Socket("localhost",8585);
//2.准备数据
String msg = "你好!!";
//3.获取输出流
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
//4.写出
out.writeUTF(msg);
//5.刷出
out.flush();
//6.关闭
out.close();
client.close();
}
}
服务器代码:
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPDemo02 {
public static void main(String[] args) throws IOException {
System.out.println("我是服务器!!");
//1.定义服务器 ServerSocket(int port) 创建绑定到指定端口的服务器套接字
ServerSocket server = new ServerSocket(8585);
//2.阻塞式监听 Socket accept() 侦听对此套接字的连接并接受它
Socket client = server.accept();
//3.获取输入流
DataInputStream is = new DataInputStream(new BufferedInputStream(client.getInputStream()));
//4.读取客户端传递的数据
String msg = is.readUTF();
//5.处理数据
System.out.println(msg);
//6.关闭
is.close();
client.close();
server.close();
}
}