JavaNote12
网络编程
1. 网络分层
为了减少网络设计的复杂性,绝大多数网络采用分层设计方法。所谓分层设计方法,就是按照信息的流动过程将网络的整体功能分解为一个个的功能层,不同机器上的同等功能层之间采用相同的协议,同一机器上的相邻功能层之间通过接口进行信息传递。
网络模型一般是指OSI七层参考模型和TCP/IP四层参考模型。这两个模型在网络中应用最为广泛。
2. 网络编程
套接字:源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务.
网络编程:通过使用套接字来达到进程间通信目的的编程就是网络编程.
网络编程三要素:
- IP地址.
- 端口.
- 协议:规则,数据传递/交互规则.
3. IP
网络之间互连的协议(IP)是Internet Protocol的外语缩写,中文缩写为“网协”.在Java中,使用InetAddress类来表示IP地址.
演示IP操作:
public static void main(String[] args) throws Exception {
//static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
InetAddress ip = InetAddress.getByName("XXXX");
System.out.println(ip);
//获取主机名称
System.out.println(ip.getHostName());
//获取IP地址
System.out.println(ip.getHostAddress());
//static InetAddress getLocalHost() 返回本机IP
System.out.println(InetAddress.getLocalHost());
//boolean isReachable(int timeout) 是否可达的,是否可以连接访问的
System.out.println(ip.isReachable(1000));
}
4. 端口
端口:是英文port的意译,可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。
协议端口:
如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。注意:
- 在同一台电脑中端口不能重复,若重复,则报错端口冲突.
- 如果我们需要自定义端口号,建议使用10000以上的.
5. 协议
协议(protocol),网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。
网络协议,也可简称协议,通常由三要素组成:
(1)语法:即数据与控制信息的结构或格式;
(2)语义:即需要发出何种控制信息,完成何种动作以及做出何种响应;
(3)时序(同步),即事件实现顺序的详细说明。http——超文本传输协议资源
- https——用安全套接字层传送的超文本传输协议
- ftp——文件传输协议
- mailto——电子邮件地址
- file——当地电脑或网上分享的文件
6. 传输层的协议(TCP,UDP)
TCP :面向连接(经历三次握手)、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。 服务端和客户端.
UDP:面向非连接、传输不可靠(丢包[数据丢失])、用于传输少量数据(数据报包模式)、速度快。发送端和接收端.
演示TCP:
//服务端
public class Server {
public static void main(String[] args) throws Exception {
String data = "你好,师姐!";
//创建服务端,指定端口为8888
ServerSocket server = new ServerSocket(8888);
System.out.println("服务端......");
boolean accept = true;
while (accept) {
//accept():接受连接该服务端的客户端对象
Socket client = server.accept();
System.out.println("连接过来的客户端:" + client.getInetAddress());
//获取该客户端的输出流对象,给该客户端输出数据
PrintStream out = new PrintStream(client.getOutputStream());
out.print(data);
out.close();
}
server.close();
}
}
//客户端
public class Client {
public static void main(String[] args) throws Exception {
//创建客户端对象,并指明连接服务端的主机和端口
//localhost:本机
Socket client = new Socket("localhost",8888);
//获取客户端输入流对象
Scanner in = new Scanner(client.getInputStream());
while(in.hasNextLine()){
System.out.println(in.nextLine());
}
client.close();
}
}
演示UDP:
//接收端
public class Receive {
public static void main(String[] args) throws Exception {
//创建接收端对象
DatagramSocket receiver = new DatagramSocket(10086);
byte[] buffer = new byte[1024];
//接受数据
DatagramPacket dp = new DatagramPacket(buffer, 1024);
receiver.receive(dp);
//获取接受数据
byte[] data = dp.getData();
int length = dp.getLength();
String msg = new String(data, 0, length);
System.out.println("发送过来的数据:" + msg);
receiver.close();
}
}
//发送端
public class Send {
public static void main(String[] args) throws Exception {
String data = "你好,师姐!";
//创建发送端对象
DatagramSocket sender = new DatagramSocket(10010);
//发送数据
DatagramPacket dp = new DatagramPacket(
data.getBytes(), //发送的数据
data.getBytes().length, //发送数据的长度(字节数)
InetAddress.getLocalHost(), //发送给哪一个IP
10086);//发送给哪一个端口程序
sender.send(dp);
sender.close();
}
}
最后附上Java学习网址