网络编程入门
网络编程三要素:IP地址、端口、协议(UDP协议、TCP协议)
IP地址:是网络中设备的唯一标识
IP地址分两大类:IPV4、IPV6
ipconfig: 查看本机IP地址
Ping IP地址: 检查网络是否连通
127.0.0.1:是回送地址,可以代表本机地址,一般用来测试
1、InetAddress类
InetAddress: 此类表示Internet协议(IP)地址,三个常用方法:如下
1、Static InetAddress getByName(String host): 确定主机名称的IP地址,主机名称可以是机器名称,也可以是IP地址
2、String getHostName():获取此IP地址的主机名
3、String getHostAddress(): 返回文本显示的IP地址字符串
public class InetAddressDemo1 {
public static void main(String[] args) throws UnknownHostException{
//获取本机主机名称对象,两种都可以,推荐直接使用IP地址
InetAddress address = InetAddress.getByName("XTZ-20191115MAD");
InetAddress address1 = InetAddress.getByName("192.168.56.1");
//获取主机名称
String Name = address.getHostName();
//获取主机IP地址
String ip = address.getHostAddress();
System.out.println("主机名:"+Name);
System.out.println("IP地址:"+ip);
}
}
2、端口、协议
端口号:取值范围0~65535 其中 0~1023中间的值不能取,有特殊意义,只能取1024以上的端口号
UDP协议:是无连接通信协议,不能保证数据完整性,重要数据输时不建议使用UDP协议
TCP协议:是面向连接的通信协议,提供可靠无差错的数据传输,每次连接都要经过三次握手
第一次握手:客户端向服务器端发出连接请求,等待服务器确认
第二次握手:服务器端向客户端返回一个响应,通知客户端收到了连接请求
第三次握手:客户端再次向服务器端发送确认消息,确认连接
3、UDP通信程序
UDP发送数据步骤:
1、创建发送端的Socket对象(DatagramSocket)
2、创建数据,并把数据打包
3、调用DatagramSocket对象的方法发送数据
4、关闭发送端
//UDP发送数据
public class UDPSendDemo1 {
public static void main(String[] args) throws IOException {
//1、创建发送端的Socket对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket();
//2、创建数据,并把数据打包
byte[] bys = "hello world".getBytes();
/*int length = bys.length;
InetAddress address = InetAddress.getByName("192.168.56.1");
int port = 10086;*/
//优化上面的代码
//DatagramPacket dp = new DatagramPacket(bys,length,address,port);
DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("192.168.56.1"),10086);
//3、调用DatagramSocket对象的方法发送数据
ds.send(dp);
ds.close();
}
}
4、UDP接收数据
1、创建接收端的Socket对象(DtagramSocket)
2、创建一个数据包,用于接收数据
3、调用DatagramSocket对象的方法接收数据
4、解析数据包,并把数据在控制台显示
5、关闭接收端
//UDP接收数据
public class UDPReceiveDemo2 {
public static void main(String[] args) throws IOException {
//1、创建接收端的Socket对象(DtagramSocket)
DatagramSocket ds = new DatagramSocket(10086);
//2、创建一个数据包,用于接收数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
//3、调用DatagramSocket对象的方法接收数据
ds.receive(dp);
//4、解析数据包,并把数据在控制台显示
/* byte[] datas = dp.getData();//这个方法拿到的是数据缓冲区
int len = dp.getLength();//返回要发送的数据长度或接收到的实际数据长度
String dataString = new String(datas,0,len);
System.out.println("数据是:"+dataString);*/
//优化上面的代码
System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
//5、关闭接收端
ds.close();
}
}
5、UDP通信程序练习
/*UDP案例小练习:
1、UDP发送数据:数据来自于键盘录入,直到输入数据886,发送数据结束
2、UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
* */
//UDP发送数据
public class UDPSend {
public static void main(String[] args) throws IOException {
//1、创建发送端的Socket对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket();
//自己封装键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while((line = br.readLine())!=null){
//输入的数据是886,发送数据结束
if("886".equals(line)){
break;
}
//创建数据,并把数据打包
byte[] bys = line.getBytes();
DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("192.168.56.1"),12345);
//调用DatagramSocket对象的方法发送数据
ds.send(dp);
}
//关闭发送端
ds.close();
}
}
//UDP接收数据
public class UDPReceive {
public static void main(String[] args) throws IOException {
//创建接收端的Socket对象(DtagramSocket)
DatagramSocket ds = new DatagramSocket(12345);
//因为不知道发送端会发来多少数据,所以做成死循环,接收端也不用关闭了
while(true) {
//创建一个数据包,用于接收数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//调用DatagramSocket对象的方法接收数据
ds.receive(dp);
//解析数据包,并把数据在控制台显示
System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
}
}
}