网络编程基础
第一.网络编程概述
计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,
实现资源共享和信息传递的计算机系统。
网络编程 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
第二.网络模型
网络模型一般是指 OSI(Open System Interconnection开放系统互连)
参考模型 TCP/IP参考模型
网络模型7层概述:
1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流
(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
2. 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,
数据通过交换机来传输。
3. 网络层:主要将从下层接收到的数据进行IP地址(例192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。
4. 传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),
UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求
(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)
6.表示层:主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西(如图片、声音等)。
7.应用层: 主要是一些终端的应用,比如说FTP(各种文件下载),WEB(IE浏览),QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西.就是终端应用)。
网络模型图解:
第三.网络编程三要素
IP地址:InetAddress 网络中设备的标识,可用主机名
端口号:用于标识进程的逻辑地址,不同进程的标识
传输协议 :通讯的规则 常见协议:TCP,UDP
3.1IP地址
IP地址的本质就是这台电脑的标识,一个由32位的二进制数据组成的数据。 后来别人为了方便我们记忆IP地址,就把IP地址切成了4份,每份8bit. 2^8 = 0~255
00000000-00000000-00000000-00000000
IP地址 = 网络号+ 主机号。
IP地址的组成:
A类地址 = 一个网络号 + 三个主机号 2^24 政府单位
B类地址 = 两个网络号+ 两个主机号 2^16 事业单位(学校、银行..)
C类地址= 三个网络号+ 一个主机号 2^8 私人使用.
IP地址分类
A类 1.0.0.1---127.255.255.254 (1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址) (2)127.X.X.X是保留地址,用做循环测试用的。
B类 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D类 224.0.0.1---239.255.255.254 E类 240.0.0.1---247.255.255.254
2个DOS命令:ipconfig 查看ip地址 ping ip地址 测试本机与本地的ip地址间的通信是否有问题
3.2端口号
正在运行的程序的标识。
有效端口:0~65535,其中0~1024系统使用或保留端口。
3.3协议
通信的规则
UDP:
把数据打包
数据有限制
不建立连接
速度快
不可靠
TCP:
建立连接通道
数据无限制
速度慢
可靠
举例:
UDP:发短信
TCP:打电话
第四.InetAddress
/*
* 如果一个类没有构造方法:
* A:成员全部是静态的(Math,Arrays,Collections)
* B:单例设计模式(Runtime)
* C:类中有静态方法返回该类的对象(InetAddress)
* class Demo {
* private Demo(){}
*
* public static Demo getXxx() {
* return new Demo();
* }
* }
*
* 看InetAddress的成员方法:
* public static InetAddress getByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象
InetAddress(IP类)具有一个缓存,用于存储成功及不成功的主机名解析。
常用的方法:
getLocalHost(); 获取本机的IP地址 返回InetAddress
getByName("IP或者主机名") 根据一个IP地址的字符串形式或者是一个主机名生成一个IP地址对象。 (用于获取别人的IP地址对象)
getHostAddress() 返回一个IP地址的字符串表示形式。
getHostName() 返回计算机的主机名。
getAllByName("www.baidu.com");//域名 可以查出注册了几台机器 返回一个InetAddress[] 数组
*/
public class Ip01 {
public static void main(String[] args) throws UnknownHostException {
//获取本机ip地址对象主机名和IP地址
InetAddress ip = InetAddress.getLocalHost();
System.out.println("主机名:"+ip.getHostName());//获取主机名
System.out.println("获取ip地址:"+ip.getHostAddress());//获取ip地址
//获取别人的ip地址
InetAddress name = InetAddress.getByName("192.168.30.1");
System.out.println("主机名:"+name.getHostAddress());
System.out.println("ip地址:"+name.getHostName());
InetAddress[] arr = InetAddress.getAllByName("www.baidu.com");//域名 可以查出注册了几台机器
}
}
第五.Socket
Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制: 通信的两端都有Socket。 网络通信其实就是Socket间的通信。 数据在两个Socket间通过IO传输。
通信原理图:
第五.UDP协议
将数据源和目的封装成数据包中,不需要建立连接;每个数据包的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快
发送数据端:
/**UDP通讯协议的特点:
1. 将数据极封装为数据包,面向无连接。
2. 每个数据包大小限制在64K中
3.因为无连接,所以不可靠
4. 因为不需要建立连接,所以速度快
5.udp 通讯是不分服务端与客户端的,只分发送端与接收端。
比如: 物管的对讲机, 飞Q聊天、 游戏..
udp协议下的Socket:
DatagramSocket(udp插座服务)用来发送和接收数据报包
DatagramPacket(数据包类)
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
DatagramPacket(buf, length, address, port)
buf: 发送的数据内容
length : 发送数据内容的大小。
address : 发送的目的IP地址对象
port : 端口号。
发送端的使用步骤:
1. 建立udp的服务。
2. 准备数据,把数据封装到数据包中发送。
3、创建一个数据包(发送端的数据包要带上ip地址与端口号。)
4. 调用udp的服务,发送数据。
5. 关闭资源。**/
public class UDPSendDemo {
public static void main(String[] args) throws Exception {
//创建DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//数据
byte[] buf = "UDP 发送数据".getBytes();
//将数据打包
DatagramPacket dp = new DatagramPacket(buf,buf.length,
InetAddress.getLocalHost(),8081);
//发送数据
ds.send(dp);
ds.close();
}
}
接收数据端
/**
* 1.创建Socket对象
* 2.创建一个接收包
* 3.接收数据
* 4.关闭流
*/
public class UDPRecvier {
public static void main(String[] args) throws Exception{
//创建Socket对象
DatagramSocket ds = new DatagramSocket(8081);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//接收数据
ds.receive(dp);//阻塞式
//获取对方的ip
InetAddress address = dp.getAddress();
String hostAddress = address.getHostAddress();
//获取数据缓冲区
byte[] data = dp.getData();
int length = dp.getLength();
String s = new String(data, 0, length);
System.out.println(hostAddress+":"+s);
//关闭流
ds.close();
}
}
UDP图解
第六.TCP协议
建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低
发送数据
/**
* tcp的客户端使用步骤:
* 1. 建立tcp的客户端服务。
* 2. 获取到对应的流对象。
* 3.写出或读取数据
* 4. 关闭资源。
*
*/
public class TCPClientDemo {
public static void main(String[] args) throws Exception {
//建立tcp的客户端服务。
Socket socket = new Socket(InetAddress.getLocalHost(),8081);
//获取输出流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String msg = "hello world TCP我来了";
writer.write(msg);
writer.close();
}
}
接收数据
/*
java.net.BindException: 端口被占用。
ServerSocket的使用 步骤
1. 建立tcp服务端 的服务。
2. 接受客户端的连接产生一个Socket.
3. 获取对应的流对象读取或者写出数据。
4. 关闭资源。
为什么ServerSocket不设计一个getInputStream与getOutputStream 呢?
*/
public class TCPServerDemo {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8081);
//接受客户端的连接 该方法也是一个阻塞型的方法,没有客户端与其连接时,会一直等待下去。
Socket socket = serverSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = reader.readLine();
InetAddress inetAddress = socket.getInetAddress();
String hostAddress = inetAddress.getHostAddress();
System.out.println(hostAddress+":"+s);
}
}
TCP协议图解