IP地址和端⼝号
IP地址和端⼝号
要想使⽹络中的计算机能够进⾏通信,必须为每台计算机指定⼀个标识号,通过这个标识号来指定接受数据的计算机或者发送数据的计算机。
在TCP/IP协议中,这个标识号就是IP地址,它可以唯⼀标识⼀台计算机。
IP地址和端⼝号的作⽤,如下图所⽰:
源计算机通过IP地址到⽬标计算机,然后通过端⼝号到应⽤程序
InetAddress类
常⽤⽅法:
getByName(String host);  ⽤于获得表⽰指定主机的InetAddress对象
getLocalHost();  ⽤于获得表⽰本地的InetAddress对象,通过InetAddress对象便可获取指定主机名,IP地址等getHostName();
getHostAddress();
public class Demo01 {
public static void main(String[] args) throws UnknownHostException {
     //已知主机名
InetAddress ByName("XB-20161105SFVO");
System.out.println(inet);
    //获取本地主机名
InetAddress LocalHost();
System.out.println(inet2);
//获取主机名
System.out.HostName());
tcp ip协议下载
/
/获取主机IP地址
System.out.HostAddress());
}
}
UDP协议
UDP是⽆连接通信协议,即在数据传输时,数据的发送端和接收端不建⽴逻辑连接。简单来说,当⼀台计算机向另外⼀台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
就像新闻联播的播放,每天都在播放,不管有没有⼈在看,每个⼈看了新闻联播,但却不会告诉对⽅新闻我看了⼀样。
由于使⽤UDP协议消耗资源⼩,通信效率⾼,所以通常都会⽤于⾳频、视频和普通数据的传输例如视频会议都使⽤UDP协议,因为这种情况即使偶尔丢失⼀两个数据包,也不会对接收结果产⽣太⼤影响。
但是在使⽤UDP协议传送数据时,由于UDP的⾯向⽆连接性,不能保证数据的完整性,容易数据丢失,影响数据传输,因此在传输重要数据时不建议使⽤UDP协议。
UDP传输数据被限制在64K以内。
TCP协议
TCP协议是⾯向连接的通信协议,即在传输数据前先在发送端和接收端建⽴逻辑连接,然后再传输数据,它提供了两台计算机之间可靠⽆差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握⼿”。第⼀次握⼿,客户端向服务器端发出连接请求,等待服务器确认,第⼆次握⼿,服务器端向客户端回送⼀个响应,通知客户端收到了连接请求,第三次握⼿,客户端再次向服务器端发送确认信息,确认连接。
整个交互过程如下图所⽰:
每次握⼿都是⼀次确认的过程。
由于TCP协议的⾯向连接特性,它可以保证传输数据的安全性,所以是⼀个被⼴泛采⽤的协议,例如在下载⽂件时,如果数据接收不完整,将会导致⽂件数据丢失⽽不能被打开,因此,下载⽂件时必须采⽤TCP协议。
UDP通信
UDP是⼀种⾯向⽆连接的协议,因此,在通信时发送端和接收端不⽤建⽴连接。
UDP通信的过程就像是货运公司在两个码头间发送货物⼀样。在码头发送和接收货物时都需要使⽤集装箱来装载货
物,UDP通信也是⼀样,发送和接收的数据也需要使⽤“集装箱”进⾏打包,为此JDK中提供了⼀个DatagramPacket类,该类的实例对象就相当于⼀个集装箱,⽤于封装UDP通信中发送或者接收的数据。
发送端:指定了封装数据的字节数组和数据的⼤⼩,没有指定IP地址和端⼝号
接收端:⼀定要明确指出数据的⽬的地(ip地址和端⼝号),⽽接收端不需要明确知道数据的来源,只需要接收到数据即可。
使⽤此构造⽅法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的⼤⼩,还指定了数据包的⽬标IP地址(addr)和端⼝号(port)。该对象通常⽤于发送端,因为在发送数据时必须指定接收端的IP地址和端⼝号,就好像发送货物的集装箱上⾯必须标明接收⼈的地址⼀样。
DatagramPacket类中的常⽤⽅法进⾏详细地讲解,如下表所⽰。
DatagramSocket
DatagramPacket数据包的作⽤就如同是“集装箱”,可以将发送端或者接收端的数据封装起来。然⽽运输货物只有“集装箱”是不够的,还需要有码头。在程序中需要实现通信只有DatagramPacket数据包也同样不⾏,为此JDK中提供的⼀
个DatagramSocket类。DatagramSocket类的作⽤就类似于码头,使⽤这个类的实例对象就可以发送和接
收DatagramPacket数据包。
DatagramSocket类中常⽤的构造⽅法:
该构造⽅法⽤于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端⼝号,此时,系统会分配⼀个没有被其它⽹络程序所使⽤的端⼝号。
该构造⽅法既可⽤于创建接收端的DatagramSocket对象,⼜可以创建发送端的DatagramSocket对象,在创建接收端
的DatagramSocket对象时,必须要指定⼀个端⼝号,这样就可以监听指定的端⼝。
DatagramSocket类中的常⽤⽅法。
代码⽰例:
/*UDP完成数据的发送
* 发送端
* 1,创建DatagramPacket对象,封装数据,接收的地址和端⼝
* 2,创建DatagramSocket对象
* 3,调⽤DatagramSocket中的send⽅法,发送数据包
* 4,关闭资源DatagramSocket*/
public class UDPSend {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
InetAddress ByName("192.168.1.171");
//创建快递公司对像
DatagramSocket ds=new DatagramSocket();
//创建数据打包对象,封装要发送的数据、接收端的ip和端⼝号
while(true){
byte[] ().getBytes();
DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,9000);
//发送数据
ds.send(dp);
}
//释放资源
//ds.close();
}
}
/*UDP完成数据的接收
* UDP接收端
* 1,创建DatagramSocket对象,绑定端⼝号(要和发送端端⼝号⼀致)
* 2,创建字节数组,接收发来的数据
* 3,创建数据包对象DatagramPacket
* 4,调⽤DatagramSocket对象⽅法receive(DatagramPacket dp)接收数据,数据放在数据包中
* 5,拆包
发送的IP地址
    数据包对象DatagramPacket⽅法getAddress()获取的是发送端的IP地址对象
    返回值是InetAddress对象
  接收到的字节个数
    数据包对象DatagramPacket⽅法getLength()
 发送⽅的端⼝号
数据包对象DatagramPacket⽅法getPort()发送端⼝
* 6,关闭资源*/
public class UDPRecive {
public static void main(String[] args) throws IOException {
/
/创建快递公司对象,明确端⼝号
DatagramSocket ds=new DatagramSocket(9000);
//创建字节数组,接收数据
byte[] bytes=new byte[1024];
while(true){
//创建拆包对象
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
//接收数据
//拆包
//获取发送端ip地址
String Address().getHostAddress();
//获取发送端端⼝号
int Port();
//获取数据长度
int Length();
System.out.println("ip地址为:"+ip+",端⼝号为:"+port+"发送的内容为:"+new String(bytes,0,len));
}
//释放资源
//ds.close();
}
}
要实现UDP通信需要创建⼀个发送端程序和⼀个接收端程序,很明显,在通信时只有接收端程序先运⾏,才能避免因发送端发送的数据⽆法接收,⽽造成数据丢失。因此,⾸先需要来完成接收端程序的编写。
执⾏的时候先执⾏接收端,再执⾏发送端

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。