InetAddress的使用、端口和协议、UDP通信发送和接收数据、UDP通信程序练习(聊天室)
InetAddress
概述:方便我们对IP地址的获取操作,Java提供了一个类InetAddress供我们使用
所在包:java.net
public class InetAddress
extends Object
implements Serializable
注:InetAddress没有构造函数,需要调用getByName();方法来获得一个InetAddress对象
常用方法:
| 方法名 | 作用 |
|---|---|
| static InetAddress getByName(String host) | 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址 |
| String getHostName() | 获取此IP地址的主机名 |
| String getHostAddress() | 返回文本显示中IP地址字符串 |
代码示例:
public static void main(String[] args) throws UnknownHostException{
InetAddress s = InetAddress.getByName("100.64.141.193");
//确定主机名称的IP地址。主机名称也可以是机器名称,也可以是IP地址,推荐写IP地址
String name = s.getHostName(); //获得此IP地址的机器名称
String IP = s.getHostAddress(); //返回文本显示中的IP地址字符串
System.out.println(name);
System.out.println(IP);
}
端口概述
概述:设备上应用程序的唯一标识
端口号:
- 用两个字节表示的整数,它的范围是0-65535之间,其中0-1023之间的端口号一般用户一些知名的网络服务和应用,普通的应用程序需要用1024以上的端口号,如果端口号被另外一个服务应用所占用,会导致当前程序启动失败
协议概述
概述:计算机网络中,连接和通信的规划被称为网络通信协议
- UDP协议(数据报协议):
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不需要建立逻辑连接。简单来说就是,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在就会发送数据,同样接收端在收到数据时也不会向发送端反馈是否收到数据
(通常用于收音机,视频和普通数据的传输) - TCP协议(传输控制协议):
TCP协议是面向连接的通信协议,即传数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输
UDP通信程序
UDP发送数据的步骤
- 创建发送端Socket对象(DatagramSocket)数据报套接字
- 创建数据,并把数据打包
- 调用DatagramSocket对象的方法发送数据(send()方法)
- 关闭发送端
UDP接收数据的步骤
接收数据的步骤
- 创建接收端的Socket对象(DatagramSocket)
DatagramSocket(int port) - 创建一个数据包,用于接收数据
DatagramPacket(byte[] by,int length,InetAddress,int port); - 调用DatagramSocket对象的方法接收数据
void receive(DatagramPacket p) - 解析数据包,并把数据在控制台显示
byte[] by=dp.getdata();
new String(by,0,dp.getLength()); - 关闭接收端
void close()
代码示例:
public class SendDemo{
public static void main(String[] args) throws IOException{
DatagramSocket ds = new DatagramSocket();
byte[] by = "asdijhgabsjkhvba".getBytes();
DatagramPacket dp = new DatagramPacket(by,by.length,InetAddress.getLocalHost(),10086);
//DatagramPacket(byte[] by,int length,InetAddress,int post);
ds.send(dp);
ds.close();
}
}
public class ReceiveDemo{
public static void main(String[] args) throws IOException{
//DatagramSocket(intport):构造数据报套接字并将其绑定到本地主机上的指定端口
DatagramSocket ds = new DatagramSocket(10086);
//创建一个数据包接收数据
//DatagramPacket(byte[]by,intlength):构造一个DatagramPacket用于接收长度为length数据包
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);
//解析数据包,并把数据在控制台显示
byte[] datas = dp.getData();
String data = new String(datas);
//调用内部类构造方法String(byte[]by,intoff,intlength)
System.out.println(new String(dp.getData(),0,dp.getLength()));
ds.close();
}
}
UDP聊天室案例
UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束。
(用字符缓冲流来做,不要用Scanner)
UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
代码示例:
public class SendDemo{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket ds = new DatagramSocket();
String s = null;
while( (s = br.readLine() ) != null){
if("886".equals(s)){
break;
}
byte[] by = new byte[1024];
by=s.getBytes();
DatagramPacket dp = new DatagramPacket(by,by.length,InetAddress.getLocalHost(),10086);
//发送端设置InetAddress(相当于IP)和端口号port
ds.send(dp);
}
br.colse();
ds.close();
}
}
public class ReceiveDemo{
public static void main(String[] args) throws IOException{
//DatagramSocket(intport):构造数据报套接字并将其绑定到本地主机上的指定端口
DatagramSocket ds = new DatagramSocket(10086);
byte[] by = new byte[1024];
//创建一个数据包接收数据
//DatagramPacket(byte[]by,intlength):构造一个DatagramPacket用于接收长度为length数据包
DatagramPacket dp = new DatagramPacket(by,by.length);
while(true){
ds.receive(dp);
byte[] datas = dp.getData();
//解析数据包
//String data = new String(datas);
//调用内部类构造方法String(byte[]by,int off,int length)
System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
}
//ds.close();
}
}
