1、InetAddress类
(1)IP和端口号:
IP(InternetProtocol,IP)互联网协议地址:唯一标识一台计算机。
端口号:用于区分不同的应用程序。取值范围是0~65535,其中0~1023被系统保留。
在计算机A访问计算机B是通过IP地址进行查找的,接着在计算机B上通过应用程序的端口号找到相应的程序。
(2)InetAddress类常用方法:
import java.net.InetAddress; import java.net.UnknownHostException; public class InetAddressDemo { public static void main(String[] args) { try { InetAddress local = InetAddress.getLocalHost(); System.out.println(local.getHostAddress());// 返回本地主机地址 System.out.println(local.getHostName());// 主机名 InetAddress address = InetAddress.getByName("主机名"); System.out.println(address); } catch (UnknownHostException e) { e.printStackTrace(); } } }
2、UDP协议
(1)概念:
UDP (User Datagram Protocol)用户数据报协议,在数据传输时彼此之间不需要建立连接,传输前需要把数据定义成数据报,并且传输效率高,但是不安全。
(2)DatagramPacket类
用于封装UDP通信中发送和接收的数据。
第一个构造方法指明了数据包的大小,用于接收数据。
第二个构造方法指明了数据包的大小,目标地址、端口号,用于发送数据。
(3)DatagramSocket类
接收和发送数据包。
第一个构造方法中,系统会随机分配一个空闲端口,用于发送端。
第二个构造方法,需要指定端口号,既可以用于发送端也可用于接收端。
(4)应用:
发送端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Send {
public static void main(String[] args) {
while (true) {
DatagramSocket send;
System.out.println("请输入数据:");
Scanner sc = new Scanner(System.in);
String str = sc.next();
try {
send = new DatagramSocket(3001);// 发送数据包
byte[] buffer = str.getBytes();
DatagramPacket dp = new DatagramPacket(buffer, buffer.length,
InetAddress.getByName("主机名"), 3000);// 封装数据
// InetAddress.getByName("主机名"),获取端口号
send.send(dp);// 发送
send.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
接收端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Receive {
public static void main(String[] args) throws SocketException {
DatagramSocket receive = new DatagramSocket(3000);
byte[] buf = new byte[1024];
while (true) {
DatagramPacket dp = new DatagramPacket(buf, 1024);
try {
receive.receive(dp);
} catch (IOException e) {
e.printStackTrace();
}
String strRecv = new String(dp.getData(), 0, dp.getLength())
+ " " + "来自" + dp.getAddress() + " " + dp.getPort();
System.out.println(strRecv);
}
}
}
3、TCP通信
(1)概念:
TCP通信分为客户端和服务器端,实现通信必须由客户端连接服务端。
(2)Socket类(客户端):
可以指定IP地址和端口号,可以根据IP和端口号运行服务端程序,只是IP地址的形式不同。
(3)ServerSocket类(服务器端):
没有绑定端口号,需要调用bind方法。
可以绑定端口号,默认最大连接数量为50。
可以绑定端口号,指定最大连接数量。
可以绑定端口号,指定最大连接数量、IP地址。适用于计算机上有多块网卡和多个 IP。
(4)应用:
客户端,可以一直发送数据:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket s = new Socket(InetAddress.getByName("DESKTOP-R14D2UH"), 7999);// 通过IP和端口号连接服务器
OutputStream out = s.getOutputStream();
out.write("客户端已启动".getBytes());
InputStream in = s.getInputStream();
byte[] buffer = new byte[1024];
int length = in.read(buffer);
System.out.println(new String(buffer, 0, length));
while (true) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数据到服务器:");
String str = sc.next();
out.write(str.getBytes());
}
}
}
服务器,一直接收客户端发送的数据:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(7999);
Socket s = ss.accept();// 在服务端的指定端口监听客户端发来的连接请求,并与之连接
OutputStream out = s.getOutputStream();
out.write("你已经连接上了服务器".getBytes());// 字节输出
while(true){
InputStream in = s.getInputStream();
byte[] buffer = new byte[1024];
int length = in.read(buffer);
System.out.println(new String(buffer, 0, length));}
}
}