网络编程
1.网络的基本概念
1.1 计算机网络
使用通信线路将分布在不同地理位置的多台计算机连接起来形成一个网络系统,主要的目的是为了实现网络中任意两台计算机之间的信息传输和资源的共享
网络编程需要解决的两个问题:
- 如何在整个网络中精准的找到通信的对方?
- 如何实现通信双方有效的沟通?
- 问题一的解决办法:
使用IP地址可以在整个网络中唯一确定某一台主机,IP地址具有“唯一性”- 关于IP地址的一些常识
2.1 IP地址的分类按照版本可分为IPV4和IPV6
2.1.1 IPV4的格式:采用4个字节 32位二进制来表示的(如192.168.25.25)
2.1.2 IPV6的格式:采用16个字节 128位
2.2 IP地址的分类按照应用范围可分为内网ip和公网ip,内网ip是在一个路由下的设备的ip,公网ip是全球互联网的一个设备终端身份标识,公网ip是有全球互联网根服务器管理着,网站程序是我们通过各种编程语言编写的服务程序。内网ip范围(192.168.0.0—192.168.255.255)
2.3 域名:俗称“网址” 可以认为是IP地址的另一种表示方式
2.4 特殊的IP地址:本机回环地址 127.0.0.1 自己连接自己 对应的名称 localhost
2.5 IP地址只能从整个网络中唯一定位一台主机,而一台主机上可能同时运行多个不同的网络应用,这时采用端口号的方式来区分,端口 号代表某台主机中具体某个网络应用程序
2.6 IP+端口号构成了网络通信中的一个唯一的节点 我们也将它两的组成称为“套接字” socket网络编程具体来说是实现点对点的通信,每个点就是由一个套接字唯一描述
2.7 端口号必须设置在一个规定的范围内 0-65535,0-1023这个区间段的端口不要使用,因为已经被其他的网络应用预先占领,例如 http的通信端口号是80 ftp默认占用的是21 端口
- 问题二的解决办法:
为通信的双方指定标准的通信协议,因为网络的通信协议非常复杂,在实际中分为不同的层进行分别的定义,比如应用层协议 http ftp … 传输层:tcp upd 网络层 数据链路层- 计算机网络分层
1、实体层(物理层)
物理层说白了就是那些连线,光纤、双绞线之类的。
2、链接层(数据链路层)
他也是计算机网络的低层,他的作用就是将网络层交下来的数据封装成帧交给物理层,以及将从物理层接收的帧解析出数据交给网络层。(ps:数据在物理层一般叫帧,在网络层交IP数据报或者包)。像适配器、转发器、集线器、网桥、交换机都被归在链接层。
3、网络层
网络层的作用是向上层提供简单灵活的、无连接的、尽最大努力交付的数据报服务,它不提供服务质量的承诺,它是为主机间提供逻辑通信。这里涉及到地址解析,路由等内容。常见的路由器可以归为网络层。
因特网的网络层包括著名的IP协议,该协议定义了数据报中的各个字段以及端系统和路 由器如何作用于这些字段。仅有一个IP协议,所有具有网络层的因特网组件都必须运行IP协议。
4、运输层
运输层是为应用进程之间提供端到端的逻辑通信。传说中的TCP三次握手、四次握手就发生在这里。这里需要重点关注。
常见协议:① 传输控制协议TCP (Transmission Control Protocol)
② 用户数据报协议UDP (User Datagram Protocol)
5、应用层
域名解析、HTTP、电子邮件等等都是应用层的范畴。应用层的协议比较多,我们重点关注HTTP 协议。
2.编码部分
2.1 基于TCP协议的编码(重点)
TCP协议的特点:通信的双方在进行信息的传输之前必须首先建立好连接,在连接过程中有一个三次握手的动作,保证通信的可靠,一旦建立好连接可以发送大量的数据,在通信结束的时候要关闭连接(四次挥手),相比来说效率比较低
UDP协议的特点:通信之前无需建立双方的连接,通信结束后也无需进行资源的释放,通信效率比较高,UDP协议的通信是不可靠的,传输的过程中可能会发生数据的丢失,发送方也不关系接受者是否成功的接受到消息,每次发送的数据只能在64K的范围内
需求:设计两个JAVA工程分别表示通信的双方(客户端 和 服务端)
public static void main(String[] args) throws IOException {
//1.创建一个侦听的端口:只能用于侦听工作,不能作为通信端口
ServerSocket ss=new ServerSocket(7788);
//调用ServerSocket对象的accept方法来接收客户端发起的连接请求
System.out.println("准备接收客户端的连接....");
Socket socket = ss.accept();//是一个阻塞的方法,返回和接收到的客户端进行通信的专用端口
//一台服务器可以通过和多个客户端进行连接,侦听端口只有一个,但是通信的端口,每个客户端分别对应一个
System.out.println("接收到一个客户端的连接...");
InputStream in = socket.getInputStream();
byte[] buffer=new byte[1024];
System.out.println("等待客户端发送的消息...");
int r=in.read(buffer);
System.out.println("客户端说:" + new String(buffer,0,r));
in.close();
socket.close();
ss.close();
}
public static void main(String[] args) throws UnknownHostException, IOException {
//1.创建一个通信端口Socket,并指定要连接的对方(IP+端口号)
//该对象在创建的时候就会建立和远程服务器的连接
Socket socket=new Socket("127.0.0.1", 7788);
//客户端向连接到的服务器发送一条消息
//获取到一个输出流(是一个字节流)
String message;
System.out.println("请输入消息:");
message=new Scanner(System.in).next();
OutputStream os = socket.getOutputStream();
os.write(message.getBytes());
os.flush();
os.close();
socket.close();
}
2.2基于UDP协议的编码(了解)
public static void main(String[] args) throws Exception {
DatagramSocket socket=new DatagramSocket();
byte[] buffer="一个导弹...".getBytes();
//数据包中不仅有发送的内容还有收件人的地址
DatagramPacket packet=
new DatagramPacket(buffer, 0,buffer.length,InetAddress.getByName("127.0.0.1"), 6677);
//将数据包发送出去
socket.send(packet);
System.out.println("发送成功");
}
public class Receiver {
public static void main(String[] args) throws Exception {
DatagramSocket socket=new DatagramSocket(6677);
byte[] buffer=new byte[1024];
DatagramPacket packet=new DatagramPacket(buffer, 0,buffer.length);
socket.receive(packet);
//从数据包中获取接收到的信息
byte[] data = packet.getData();
System.out.println(new String(data,0,data.length));
}
}