网络通信三要素
分别是IP地址、端口号和协议
IP地址操作类—InetAddress
名称 | 说明 |
---|---|
public static InetAddress getLocalHost() | 返回本主机的地址对象 |
public static InetAddress getByName(String host) | 得到指定主机的IP地址对象,参数是域名或者IP地址 |
public String getHostName() | 获取此IP地址的主机名 |
public String getHostAddress() | 返回IP地址字符串 |
public boolean isReachable(int timeout) | 在指定毫秒内连通该IP地址对应的主机,连通返回true |
端口号
端口号是标识正在计算机设备上运行的进程(程序),规定为一个 16 位的二进制,范围是 0~65535。
端口类型
- 周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)
- 注册端口:1024~49151,分配给用户进程或某些应用程序。(如:Tomcat占 用8080,MySQL占用3306)
- 动态端口:49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配。
注意:一个设备中不能出现两个程序的端口号一样,否则会出现端口冲突错误
协议
TCP(Transmission Control Protocol) :传输控制协议
- 要使用TCP协议,必须双方先建立连接,它是一种面向连接的可靠通信协议
- 传输前,采用“三次握手”方式建立连接,所以是可靠的
- 在连接中可进行大数据量的传输
- 连接、发送数据都需要确认,且传输完毕后,还需释放已建立的连接,通信效率较低
UDP(User Datagram Protocol):用户数据报协议
- UDP是一种无连接、不可靠传输的协议
- 将数据源IP、目的地IP和端口封装成数据包,不需要建立连接
- 每个数据包的大小限制在64KB内
- 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
- 可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快
UDP通信
DatagramPacket:数据包对象
构造器 | 说明 |
---|---|
public DatagramPacket(byte[] buf, int length, InetAddress address, int port) | 创建发送端数据包对象 buf:要发送的内容,字节数组 length:要发送内容的字节长度 address:接收端的IP地址对象 port:接收端的端口号 |
public DatagramPacket(byte[] buf, int length) | 创建接收端的数据包对象 buf:用来存储接收的内容 length:能够接收内容的长度 |
方法 | 说明 |
---|---|
public int getLength() | 获得实际接收到的字节个数 |
DatagramSocket:发送端和接收端对象
构造器 | 说明 |
---|---|
public DatagramSocket() | 创建发送端的Socket对象,系统会随机分配一个端口号。 |
public DatagramSocket(int port) | 创建接收端的Socket对象并指定端口号 |
方法 | 说明 |
---|---|
public void send(DatagramPacket dp) | 发送数据包 |
public void receive(DatagramPacket p) | 接收数据包 |
UDP实现广播
// 发送端
public class Sender {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(7777);
byte[] msg = "泥嚎".getBytes();
DatagramPacket dp = new DatagramPacket(msg, 0, msg.length,
InetAddress.getByName("255.255.255.255"), 7777); // 广播
ds.send(dp);
ds.close();
}
}
// 接收端
public class Receiver {
public static void main(String[] args) throws Exception {
byte[] msg = new byte[1024 * 64];
DatagramPacket dp = new DatagramPacket(msg, msg.length);
DatagramSocket ds = new DatagramSocket(7777);
while (true) {
Thread.sleep(200);
ds.receive(dp);
System.out.println("来自" + dp.getAddress().getHostAddress()
+ ":" + dp.getPort() + "的广播消息:" + new String(dp.getData()));
}
}
}
UDP实现组播
//发送端
public class Sender {
public static void main(String[] args) throws Exception {
MulticastSocket ds = new MulticastSocket(7777);
byte[] msg = "泥嚎".getBytes();
DatagramPacket dp = new DatagramPacket(msg, 0, msg.length, InetAddress.getByName("224.0.1.1"), 7777);
ds.send(dp);
ds.close();
}
}
//接收端
public class Receiver {
public static void main(String[] args) throws Exception {
byte[] msg = new byte[1024 * 64];
DatagramPacket dp = new DatagramPacket(msg, msg.length);
MulticastSocket ds = new MulticastSocket(7777);
ds.joinGroup(InetAddress.getByName("224.0.1.1")); //加入组播地址
while (true) {
Thread.sleep(200);
ds.receive(dp);
System.out.println("来自" + dp.getAddress().getHostAddress()
+ ":" + dp.getPort() + "的组播消息:" + new String(dp.getData()));
}
}
}
TCP通信
Socket(客户端)
构造器 | 说明 |
---|---|
public Socket(String host , int port) | 创建发送端的Socket对象与服务端连接,参数为服务端程序的ip和端口。 |
方法 | 说明 |
---|---|
OutputStream getOutputStream() | 获得字节输出流对象 |
InputStream getInputStream() | 获得字节输入流对象 |
ServerSocket(服务端)
构造器 | 说明 |
---|---|
public ServerSocket(int port) | 注册服务端端口 |
方法 | 说明 |
---|---|
public Socket accept() | 等待接收客户端的Socket通信连接 连接成功返回Socket对象与客户端建立端到端通信 |