java.net 包中提供了两种常见的网络协议的支持:
TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
UDP:UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
该类的实例包含IP地址,还可能包含相应的主机名称。以下是其中的一些常用方法的学习。
//static InetAddress getLocalHost() 返回本地主机
@Test
public void test_01() throws Exception{
InetAddress localHost = InetAddress.getLocalHost();
//打印结果为 计算机全名/IP地址
System.out.println(localHost);
}
//获取主机IP地址、获取主机名
@Test
public void test_02() throws Exception{
InetAddress localHost = InetAddress.getLocalHost();
//获取IP地址
String hostAddress = localHost.getHostAddress();
System.out.println(hostAddress);
//获取主机名
String hostName = localHost.getHostName();
System.out.println(hostName);
}
//static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
@Test
public void test_03() throws Exception{
//这里填的是我自己的计算机名称
InetAddress inetAddress = InetAddress.getByName("91BYBAQ2869O8A9");
System.out.println(inetAddress);
}
在Java中提供了类DatagramPacket与类DatagramScoket收发数据包。(要先运行接收端,在运行发送端)
//UDP发送端
public class UDPSendDemo {
public static void main(String[] args) throws Exception{
//创建InetAddress对象,封装IP(让自己的电脑即作为发送端又作为接收端)
InetAddress inet = InetAddress.getByName("127.0.0.1");
//准备发送数据
byte[] data = "Hello UDP!".getBytes();
//创建DatagramPacket对象,封装数据与接收端的地址与端口号
//构造方法DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
DatagramPacket dp = new DatagramPacket(data, data.length, inet, 6100);
//创建DatagramSocket,此类对象既能接收数据,也能发送数据包,这里是有它发送数据包
DatagramSocket socket = new DatagramSocket();
//发送数据包
socket.send(dp);
//关闭资源
socket.close();
}
}
//UDP接收端
public class UDPReceiveDemo {
public static void main(String[] args) throws Exception{
//创建DatagramSocket对象,绑定发送端所发送的端口号
DatagramSocket socket = new DatagramSocket(6100);
//创建接收数据的字节数据
byte[] data = new byte[1024];
//创建DatagramPacket对象
DatagramPacket dp = new DatagramPacket(data, data.length);
//调用DatagramSocket对象的方法receive(DatagramPacket dp)将数据放入数据包中
socket.receive(dp);
//获取发送端数据的字节个数
int length = dp.getLength();
//打印接收的数据
System.out.println(new String(data,0,length));
//获取发送端的IP地址
String hostAddress = dp.getAddress().getHostAddress();
System.out.println(hostAddress);
//获取发送端的端口号
int port = dp.getPort();
System.out.println(port);
//关闭资源
socket.close();
}
}
在Java中提供了ServerSocket类,表示服务器端套接字,Socket类,表示客户端套接字。
以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
1.服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
2.服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
3.服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
4.Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
5.在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
连接建立后,通过使用 I/O 流进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。
例:(服务器端要先启动,等待客户端连接)
//TCP服务器
public class TCPServer {
public static void main(String[] args) throws Exception{
//创建ServerSocket对象,构造方法 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
ServerSocket serverSocket = new ServerSocket(6100);
//调用 accept()方法,获取客户端Socket对象
Socket socket = serverSocket.accept();
//通过Socket对象 获取字节输入流,读取客户端发送的数据
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data,0,len));
//服务器向客户端发送数据,通过Socket套接字对象获取字节输出流
OutputStream out = socket.getOutputStream();
out.write("你好 客户端!".getBytes());
//关闭资源
socket.close();
serverSocket.close();
}
}
//TCP客户端
public class TCPClient {
public static void main(String[] args) throws Exception{
//Socket类的构造方法 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
//此构造方法只要运行,就会与服务器建立连接,如果连接失败,就会抛出异常
Socket socket = new Socket("127.0.0.1", 6100);
//获取套接字的输出流,将数据输出到服务器
OutputStream out = socket.getOutputStream();
out.write("你好 服务器!".getBytes());
//获取服务器发送的数据,通过Socket对象获得字节输入流
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data,0,len));
//关闭资源
socket.close();
}
}