计算机网络可使多台计算机实现链接,位于同一个网络中的计算机在进行链接和通讯时须要遵照必定的规则。在计算机网络中,这些链接和通讯的规则被称为网络通讯协议,它对数据的传输格式、传输速率、传输步骤等作了统一规定,通讯双方必须同时遵照才能完成数据交换。数组
如今最普遍的是TCP/IP协议(传输控制协议/英特网互联协议)服务器
UDP协议。网络
TCP/IP协议分为四层:socket
链路层:用于定义物理传输,一般是对某些网络链接设备的驱动协议,例如针对光纤、网线提供的驱动。spa
网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。计算机网络
传输层:主要使网络程序进行通讯,在进行网络通讯时,能够采用TCP协议,也能够采用UDP协议。server
应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。对象
InetAdderss类:用于封装一个IP地址。ip
public static void main(String[] args) throws UnknownHostException {
InetAddress inet=InetAddress.getByName("192.168.137.1");
InetAddress inet2=InetAddress.getLocalHost();
//从inet对象中获取ip地址
System.out.println(inet2);
//获取主机名
System.out.println(inet2.getHostName());
}资源
UDP协议:
UDP是无链接通讯协议,即在数据传输时,数据的发送端和接收端不创建逻辑链接。
在使用UDP协议传送数据时,因为UDP的面向无链接性,不能保证数据的完整性,所以在传输重要数据时不建议使用UDP协议。
TCP协议:
TCP协议是面向链接的通讯协议,即在传输数据前先在发送端和接收端创建逻辑链接,而后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
因为TCP协议的面向链接特性,它能够保证传输数据的全性安,因此是一个被普遍采用的协议,例如在下载文件时,若是数据接收不完整,将会致使文件数据丢失而不能被打开,所以,下载文件时必须采用TCP协议。
UDP通讯:
DatagramPacke类:
用于封装UDP通讯中发送或者接收的数据。
DatagramSocket类:
将发送端或者接收端的数据封装起来。
public class UDPSend {
public static void main(String[] args) throws IOException {
//封装数据
byte[] bytes="你好UDP".getBytes();
//封装ip地址
InetAddress inet=InetAddress.getByName("127.0.0.1");
//1.建立数据打包对象,封装要发送的数据、长度、接受端ip和端口号
DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6000);
//2.建立DatagramSocke对象(快递公司)
DatagramSocket ds=new DatagramSocket();
//3.发送数据包
ds.send(dp);
//释放资源
ds.close();
}
}
public class UDPReceive {
public static void main(String[] args) throws IOException {
//1.建立DatagramSocket对象(快递公司)明确端口号
DatagramSocket ds=new DatagramSocket(6000);
//2.建立字节数组负责接受发来的数据
byte[] bytes=new byte[1024];
//3.建立数据拆包对象
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
//4.接收数据包
ds.receive(dp);
//5.拆包
//获取接收的数据长度
int length=dp.getLength();
//获取发送端ip地址
String ip=dp.getAddress().getHostAddress();
//获取发送端的端口号
int port=dp.getPort();
System.out.println("ip地址为"+ip+"端口号为"+port+"发送的内容"+new String(bytes,0,length));
}
}
TCP通讯:
Socket类:用于实现客户端的程序。
public class TCPServer {
public static void main(String[] args) throws IOException {
//1.建立服务器端对象serversocket明确端口号
ServerSocket server=new ServerSocket(6666);
//2.调用accept方法与客户端建立链接,并获取链接的客户端对象
Socket socket=server.accept();
//3.从客户端对象中获取输入流,接收数据
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
//获取ip地址
String ip=socket.getInetAddress().getHostAddress();
//获取客户端端口号
int port=socket.getPort();
System.out.println("ip地址为"+ip+"端口号为"+port+":");
int len=in.read(bytes);
System.out.println(new String(bytes,0,len));
//回复客户端
//获取从客户端对象中获取字节输出流,将数据回复给客户端
OutputStream out=socket.getOutputStream();
out.write("收到".getBytes());
//释放资源
server.close();
}
}
public class TCPClient {
public static void main(String[] args) throws IOException {
//1.建立Socket对象,链接服务器
Socket socket=new Socket("127.0.0.1",6666);
//2.从socket对象中获取输出流,将数据写向服务器
OutputStream os=socket.getOutputStream();
//3.写数据
os.write("你好服务器".getBytes());
//接收服务器端的回复
//从socket对象中获取字节输入流,接收服务器的回复数据
InputStream in=socket.getInputStream();
//建立字节数组
byte[] bytes=new byte[1024];
//获取服务器端的ip地址
String ip=socket.getInetAddress().getHostAddress();
//获取服务器端的端口号
int port=socket.getPort();
System.out.println("ip地址为"+ip+"端口号为"+port+":");
int len=in.read(bytes);
System.out.println(new String(bytes,0,len));
//4.释放资源
socket.close();
}
}