1. 网络编程概述
计算机网络
是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
网络编程
就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换
网络模型
网络模型一般指:
- OSI(Open System Interconnection开放系统互连)参考模型
- TCP/IP参考模型
网络模型主要研究计算机网络之间以何种规则进行通信的问题
2. 网络编程三要素
- IP地址:InetAddress
- 端口号
- 传输协议
IP地址
IP地址是网络中计算机的唯一标识
为了方便表示IP地址,把IP地址的每一个字节上的数据换算成十进制,然后用.分开来表示:"点分十进制"
IP地址的组成:网络号段+主机号段
- 第一号段为网络号段+后三段的主机号段
- 前二号段为网络号段+后二段的主机号段
- 前三号段为网络号段+后一段的主机号段
IP地址的分类:
- 1.0.0.1---127.255.255.254
- 10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)
- 127.X.X.X是保留地址,用做循环测试用的
- 128.0.0.1---191.255.255.254
- 172.16.0.0---172.31.255.255是私有地址
- 169.254.X.X是保留地址
- 192.0.0.1---223.255.255.254
- 192.168.X.X是私有地址
- 224.0.0.1---239.255.255.254
- 240.0.0.1---247.255.255.254
两个DOS命令:
- ipconfig 查看本机ip地址
- ping 后面跟ip地址,用于测试本机与指定的ip地址间的通信是否有问题
特殊的IP地址:
- 127.0.0.1 回环地址(表示本机)
- x.x.x.255 广播地址
- x.x.x.0 网络地址
InetAddress
为了方便对IP地址的获取和操作,java提供了一个类InetAddress
类中没有构造方法的情况:
- 成员全部是静态的(Math,Arrays,Collections)
- 单例设计模式(Runtime)
- 类中有静态方法返回该类的对象(InetAddress)
成员方法:
获取任意主机:getByName(String host)——通过主机名或IP地址获取一个主机对象
获取主机名:getHostName()
获取主机Ip地址:getHostAddress()
端口号
端口分类:
- 物理端口,也称网卡口
- 逻辑端口,我们称的就是逻辑端口
逻辑端口:用于标识进程的逻辑地址,是不同进程的标识
每个网络程序都至少有一个逻辑端口;有效端口:0~65535,其中0~1024系统使用或保留端口
协议UDP和TCP
UDP
将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快
TCP
建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低
Socket
Socket:网络套接字
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字,包含了IP地址和端口
Socket编程就是网络编程,套接字编程
Socket原理机制:
- 通信的两端都有Socket
- 网络通信其实就是Socket间的通信
- 数据在两个Socket间通过IO传输
UDP协议发送数据
步骤:
- 创建发送端Socket对象
- DatagramSocket()
- 创建数据,并把数据打包
- DatagramPacket(byte[] buf, int length, InetAddress address, int port)
- 调用Socket对象的发送方法发送数据包
- public void send(DatagramPacket p)
- 释放资源
- close()
UDP协议接收数据
步骤:
- 创建接收端Socket对象
- DatagramSocket(int port)
- 创建一个数据包作为接受容器(DatagramPacket)
- DatagramPacket(byte[] buf, int length)
- 调用Socket对象的接收方法接收数据
- public void receive(DatagramPacket p)
-
byte[] bys = new byte[1024]; int length = bys.length; DatagramPacket dp = new DatagramPacket(bys, length);
- 解析数据包,并显示在控制台
-
// 获取对方的ip // public InetAddress getAddress() InetAddress address = dp.getAddress(); String ip = address.getHostAddress(); // public byte[] getData():获取数据缓冲区 byte[] bys2 = dp.getData(); // public int getLength():获取数据的实际长度 int len = dp.getLength(); String s = new String(bys2, 0, len); System.out.println(ip + "传递的数据是:" + s);
-
- 释放资源
- close()
TCP协议发送数据
步骤:
- 创建发送端的Socket对象,这一步如果成功,就说明连接已经建立成功了
- Socket(InetAddress address, int port)
- Socket(String host, int port)
- 获取输出流,写数据
- public OutputStream getOutputStream()
- write()
- 释放资源
- close()
TCP协议接收数据
步骤:
- 创建接收端的Socket对象
- ServerSocket(int port)
- 监听客户端连接,并返回一个对应的Socket对象
- public Socket accept()—— 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞
- 获取输入流,读取数据显示在控制台
- 释放资源
- 一般只关闭客户端不关闭服务器,因为服务器是一直提供服务的